2015-10-27 10 views
5

Ho un cluster di scintilla che ho creato tramite google dataproc. Desidero poter utilizzare la libreria csv dai databricks (vedere https://github.com/databricks/spark-csv). Così ho provato in questo modo:utilizza una libreria esterna nel processo pyspark in un cluster Spark da google-dataproc

ho iniziato una sessione ssh con il nodo principale del mio gruppo, poi ho Ingresso:

pyspark --packages com.databricks:spark-csv_2.11:1.2.0 

Poi ha lanciato un guscio pyspark in cui ho Ingresso:

df = sqlContext.read.format('com.databricks.spark.csv').options(header='true', inferschema='true').load('gs:/xxxx/foo.csv') 
df.show() 

E ha funzionato.

Il mio prossimo passo è quello di lanciare questo lavoro dalla mia macchina principale con il comando:

gcloud beta dataproc jobs submit pyspark --cluster <my-dataproc-cluster> my_job.py 

Ma qui non funziona e ottengo un errore. Penso perché non ho dato il --packages com.databricks:spark-csv_2.11:1.2.0 come argomento, ma ho provato 10 modi diversi per darlo e non l'ho fatto.

La mia domanda è:

  1. era la biblioteca databricks csv installato dopo ho digitato pyspark --packages com.databricks:spark-csv_2.11:1.2.0
  2. posso scrivere una riga nel mio job.py per importarlo?
  3. o quali parametri devo dare al mio comando gcloud per importarlo o installarlo?
+2

C'è un bug in Dataproc dove JARS non viene prelevato per i lavori Pyspark. Sto cercando una soluzione alternativa. Volevo solo farti sapere che stiamo esaminando il bug più grande e sto vedendo se possiamo identificare anche una soluzione temporanea per te. :) – James

+0

sperando sia in una soluzione alternativa che in una correzione anche qui, thx @James! stiamo cercando di usare dataproc con il connettore Cassandra sia da python che dallo scala – navicore

risposta

9

Risposta breve

ci sono stranezze in ordine di argomenti in cui --packages non è accettato da spark-submit se viene dopo l'argomento my_job.py. Per risolvere questo, è possibile effettuare le seguenti operazioni al momento della presentazione da CLI di Dataproc:

gcloud beta dataproc jobs submit pyspark --cluster <my-dataproc-cluster> \ 
    --properties spark.jars.packages=com.databricks:spark-csv_2.11:1.2.0 my_job.py 

In sostanza, è sufficiente aggiungere --properties spark.jars.packages=com.databricks:spark-csv_2.11:1.2.0 prima che il file .py nel comando.

lungo risposta

Quindi, questo è in realtà una questione diversa rispetto alla nota mancanza di supporto per --jars in gcloud beta dataproc jobs submit pyspark; sembra che senza Dataproc riconoscendo esplicitamente spark-submit -level flag, come spark-submit, venga inoltrato il dopo agli argomenti dell'applicazione in modo che spark-submit faccia cadere lo --packages come un argomento dell'applicazione piuttosto che analizzarlo correttamente come una submission- opzione di livello.Infatti, in una sessione SSH, quanto segue fa non lavoro:

# Doesn't work if job.py depends on that package. 
spark-submit job.py --packages com.databricks:spark-csv_2.11:1.2.0 

Ma invertire l'ordine degli argomenti funziona ancora, anche se nel caso pyspark, entrambi ordinamenti funzionano:

# Works with dependencies on that package. 
spark-submit --packages com.databricks:spark-csv_2.11:1.2.0 job.py 
pyspark job.py --packages com.databricks:spark-csv_2.11:1.2.0 
pyspark --packages com.databricks:spark-csv_2.11:1.2.0 job.py 

Quindi, anche se lo spark-submit job.py sostituisce tutto ciò che in precedenza si chiamava pyspark job.py, la differenza nell'ordinamento delle analisi per cose come --packages significa che non è in realtà una migrazione compatibile al 100%. Questo potrebbe essere qualcosa da seguire sul lato Spark.

In ogni caso, per fortuna c'è una soluzione, dal momento che --packages è solo un altro alias per la proprietà Spark spark.jars.packages, e CLI di Dataproc supporta le proprietà più che bene. Quindi, si può semplicemente effettuare le seguenti operazioni:

gcloud beta dataproc jobs submit pyspark --cluster <my-dataproc-cluster> \ 
    --properties spark.jars.packages=com.databricks:spark-csv_2.11:1.2.0 my_job.py 

Si noti che il --properties deve venire prima di il my_job.py, altrimenti viene inviato come argomento di applicazione, piuttosto che come una bandiera di configurazione. Spero che funzioni per te! Si noti che l'equivalente in una sessione SSH sarebbe spark-submit --packages com.databricks:spark-csv_2.11:1.2.0 job.py.

+0

Questo mi ha aiutato, ma ora sto cercando di registrare un nuovo repository oltre al mio pacchetto. Ho provato ad aggiungere '' --properties spark.jars.packages = org.elasticsearch: elasticsearch-hadoop: 2.4.0, spark.jars.ivy = http: // conjars.org/repo'' ma in qualche modo le due barre in avanti convertiti in uno, e l'errore del driver attraverso il sotto. Avete qualche idea su questo errore/il modo corretto per fornire un URL completo con due barre in avanti: '' Eccezione nel thread "principale" java.lang.IllegalArgumentException: basedir deve essere assoluto: http: /conjars.org/repo/local'' – aeneaswiener

2

In aggiunta a @Dennis.

Nota che se avete bisogno di caricare più pacchetti esterni, è necessario specificare un carattere di escape personalizzato in questo modo:

--properties ^#^spark.jars.packages=org.elasticsearch:elasticsearch-spark_2.10:2.3.2,com.data‌​bricks:spark-avro_2.10:2.0.1 

Annotare il^#^a destra prima della lista dei pacchetti. Vedere gcloud topic escaping per ulteriori dettagli.

Problemi correlati