2016-01-10 11 views
7

Avere due applicazioni separate che pyspark un'istanza di un HiveContext al posto di un SQLContext lascia una delle due applicazioni con l'errore:più applicazioni Spark con HiveContext

Exception: ("You must build Spark with Hive. Export 'SPARK_HIVE=true' and run build/sbt assembly", Py4JJavaError(u'An error occurred while calling None.org.apache.spark.sql.hive.HiveContext.\n', JavaObject id=o34039))

L'altra applicazione termina con successo.

Sto utilizzando Spark 1.6 dall'API Python e voglio utilizzare alcune funzioni Dataframe, che sono supportate solo con un HiveContext (ad esempio collect_set). Ho avuto lo stesso problema su 1.5.2 e precedenti.

Questo è sufficiente per riprodurre:

import time 
from pyspark import SparkContext, SparkConf 
from pyspark.sql import SQLContext 

conf = SparkConf() 
sc = SparkContext(conf=conf) 
sq = HiveContext(sc) 

data_source = '/tmp/data.parquet' 
df = sq.read.parquet(data_source) 
time.sleep(60) 

Il sleep è solo per mantenere lo script in esecuzione, mentre mi metto l'altro processo.

Se sono presenti due istanze di questo script, l'errore sopra riportato viene visualizzato durante la lettura del file parquet. Quando sostituisco HiveContext con SQLContext, tutto va bene.

Qualcuno sa perché è così?

risposta

5

Per impostazione predefinita, Hive (contesto) utilizza Derby incorporato come metastore. È inteso principalmente per testare e supporta solo un utente attivo. Se si desidera supportare più applicazioni in esecuzione, è necessario configurare un metastore autonomo. In questo momento Hive supporta PostgreSQL, MySQL, Oracle e MySQL. Dettagli di configurazione dipendono da un back-end e l'opzione (locale/remoto), ma in generale è necessario:

Cloudera fornisce una guida completa che potresti trovare utile: Configuring the Hive Metastore.

In teoria dovrebbe anche essere possibile creare separatori di metano Derby separati con una configurazione corretta (vedere Hive Admin Manual - Local/Embedded Metastore Database) o utilizzare Derby in Server Mode.

Per lo sviluppo è possibile avviare le applicazioni in diverse directory di lavoro. This will create separate metastore_db for each application ed evitare il problema di più utenti attivi. Fornire configurazione Hive separata dovrebbe funzionare ma è meno utile in fase di sviluppo:

When not configured by the hive-site.xml, the context automatically creates metastore_db in the current directory

Problemi correlati