2016-03-03 12 views
7

Sto lanciando un programma di pyspark:Aggiungi Jar standalone pyspark

$ export SPARK_HOME= 
$ export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.9-src.zip 
$ python 

E il codice py:

from pyspark import SparkContext, SparkConf 

SparkConf().setAppName("Example").setMaster("local[2]") 
sc = SparkContext(conf=conf) 

Come faccio ad aggiungere le dipendenze vaso, come il vaso csv Databricks? Utilizzando la linea di comando, posso aggiungere il pacchetto in questo modo:

$ pyspark/spark-submit --packages com.databricks:spark-csv_2.10:1.3.0 

Ma io non sto usando uno di questi. Il programma fa parte di un flusso di lavoro lager che non utilizza spark-submit Dovrei essere in grado di eseguire il mio programma ./foo.py e dovrebbe funzionare.

  • So che è possibile impostare le proprietà spark per extraClassPath ma è necessario copiare file JAR su ciascun nodo?
  • conf.set provato ("spark.jars", "jar1, jar2"), che non ha funzionato troppo con un'eccezione CNF py4j

risposta

4

Eventuali dipendenze possono essere passati utilizzando spark.jars.packages (impostazione spark.jars dovrebbe funzionare come bene) proprietà nel $SPARK_HOME/conf/spark-defaults.conf. Dovrebbe essere un elenco di coordinate separato da virgole.

E i pacchetti o le proprietà del percorso di classe devono essere impostati prima dell'avvio di JVM e this happens during SparkConf initialization. Significa che il metodo SparkConf.set non può essere utilizzato qui.

approccio alternativo è quello impostare la variabile ambiente PYSPARK_SUBMIT_ARGS prima SparkConf oggetto viene inizializzato:

import os 
from pyspark import SparkConf 

SUBMIT_ARGS = "--packages com.databricks:spark-csv_2.11:1.2.0 pyspark-shell" 
os.environ["PYSPARK_SUBMIT_ARGS"] = SUBMIT_ARGS 

conf = SparkConf() 
sc = SparkContext(conf=conf) 
+1

Questa soluzione sembra non funzionare per me, almeno all'interno del notebook; Ottengo ancora errori di classe non trovati. In effetti, nessuna delle variabili ambientali impostate sembra essere stata rilevata da Spark. Sembra che 'os.environ' imposti l'ambiente solo per il processo in cui è in esecuzione il kernel Python, ma nessun sottoprocesso non rileva tali variabili d'ambiente. In altre parole, non sta facendo l'equivalente di "export ...". qualche idea? – santon

+0

'subprocess.Popen' richiede l'argomento' env' in cui è possibile passare una copia dell'ambiente corrente. – zero323

2

finalmente trovato la risposta dopo più tentativi. La risposta è specifica all'uso del barattolo spark-csv. Crea una cartella nel tuo hard disk, D: \ Spark \ spark_jars. Inserite i seguenti vasi: là

  1. scintilla csv_2.10-1.4.0.jar (questa è la versione che sto usando)
  2. commons-CSV-1.1.jar
  3. univocità-parser-1.5 .1.jar

2 e 3 sono le dipendenze richieste da spark-csv, quindi è necessario scaricare anche questi due file. Vai alla tua directory conf in cui hai scaricato Spark. Nel file scintilla defaults.conf aggiungere la riga:

spark.driver.extraClassPath D:/Spark/spark_jars/*

L'asterisco dovrebbe includere tutti i vasi. Ora esegui Python, crea SparkContext, SQLContext come faresti normalmente. Ora si dovrebbe essere in grado di utilizzare scintilla CSV come

sqlContext.read.format('com.databricks.spark.csv').\ 
options(header='true', inferschema='true').\ 
load('foobar.csv') 
0
import os 
import sys 
spark_home = os.environ.get('SPARK_HOME', None) 
sys.path.insert(0, spark_home + "/python") 
sys.path.insert(0, os.path.join(spark_home, 'python/lib/py4j-0.10.4-src.zip')) 

Qui si tratta ....

sys.path.insert(0, <PATH TO YOUR JAR>) 

Poi ...

import pyspark 
import numpy as np 

from pyspark import SparkContext 

sc = SparkContext("local[1]") 
. 
. 
. 
+1

Non sembra funzionare. –

4

Ci sono molti approcci qui (impostazione ENV Vars, aggiungendo $ SPARK_HOME/conf/scintilla defaults.conf, ecc ...), alcune delle risposte già coprire questi. Volevo aggiungere una risposta aggiuntiva per coloro che utilizzano specificamente i Notebook Jupyter e creare la sessione Spark all'interno del notebook. Ecco la soluzione che ha funzionato meglio per me (nel mio caso ho voluto il pacchetto di Kafka caricato):

spark = SparkSession.builder.appName('my_awesome')\ 
    .config('spark.jars.packages', 'org.apache.spark:spark-sql-kafka-0-10_2.11:2.2.0')\ 
    .getOrCreate() 

Usando questa riga di codice non ho avuto bisogno di fare altro (non ENV o modifiche apportate ai file conf).

+0

Questa opzione sembra spesso ignorata/non documentata altrove ... come affermato, questa è una buona soluzione per gli utenti di jupyter. –