web-dev-qa-db-fra.com

Ajouter un bocal à un pyspark autonome

Je lance un programme pyspark:

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

Et le code py:

from pyspark import SparkContext, SparkConf

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

Comment ajouter des dépendances de jar telles que le fichier jar Databricks csv? En utilisant la ligne de commande, je peux ajouter le paquet comme ceci:

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

Mais je ne les utilise pas. Le programme fait partie d'un flux de travail plus vaste qui n'utilise pas spark-submit je devrais être en mesure d'exécuter mon programme ./foo.py et il devrait fonctionner. 

  • Je sais que vous pouvez définir les propriétés d'allumage pour extraClassPath mais vous devez copier les fichiers JAR sur chaque nœud? 
  • Essayé conf.set ("spark.jars", "jar1, jar2") qui ne fonctionnait pas trop avec une exception py4j CNF
12
Nora Olsen

Il y a beaucoup d'approches ici (régler ENV vars, ajouter à $ SPARK_HOME/conf/spark-defaults.conf, etc.), certaines des réponses les couvrent déjà. Je voulais ajouter un supplémentaire réponse pour ceux qui utilisent spécifiquement les cahiers Jupyter et créent la session Spark à partir du cahier. Voici la solution qui a le mieux fonctionné pour moi (dans mon cas, je voulais que le paquet Kafka soit chargé):

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

En utilisant cette ligne de code, je n'ai rien d'autre à faire (pas de modification du fichier ENVs ou du fichier de configuration).

12
Briford Wylie

Toutes les dépendances peuvent être passées en utilisant spark.jars.packages (paramétrer spark.jars devrait également fonctionner) dans la propriété $SPARK_HOME/conf/spark-defaults.conf. Ce devrait être une liste de coordonnées séparées par des virgules. 

Et les packages ou les propriétés de classpath doivent être définis avant le démarrage de la machine virtuelle Java et ceci se produit lors de l'initialisation SparkConf . Cela signifie que la méthode SparkConf.set ne peut pas être utilisée ici.

L'approche alternative consiste à définir la variable d'environnement PYSPARK_SUBMIT_ARGS avant que l'objet SparkConf soit initialisé:

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)
9
zero323

Enfin trouvé la réponse après plusieurs tentatives. La réponse est spécifique à l’utilisation du fichier spark-csv. Créez un dossier sur votre disque dur en indiquant D:\Spark\spark_jars. Placez les pots suivants:

  1. spark-csv_2.10-1.4.0.jar (c'est la version que j'utilise)
  2. commons-csv-1.1.jar
  3. univocity-parsers-1.5.1.jar

2 et 3 étant des dépendances requises par spark-csv, ces deux fichiers doivent également être téléchargés. Allez dans votre répertoire de config où vous avez téléchargé Spark. Dans le fichier spark-defaults.conf, ajoutez la ligne:

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

L'astérisque doit inclure tous les pots. Maintenant, lancez Python, créez SparkContext, SQLContext comme vous le feriez normalement. Vous devriez maintenant pouvoir utiliser spark-csv comme

sqlContext.read.format('com.databricks.spark.csv').\
options(header='true', inferschema='true').\
load('foobar.csv')
2
Indrajit

J'ai rencontré un problème similaire avec un jar différent ("Connecteur MongoDB pour Spark", mongo-spark-connector), mais le gros problème était que j'ai installé Spark via pyspark dans conda (conda install pyspark). Par conséquent, toute l’aide fournie pour les réponses à Spark-spécifiques n’était pas vraiment utile. Pour ceux d'entre vous qui installent avec conda, voici le processus que j'ai bricolé:

1) Trouvez où se trouve votre pyspark/jars. Les miens étaient dans cette voie: ~/anaconda2/pkgs/pyspark-2.3.0-py27_0/lib/python2.7/site-packages/pyspark/jars.

2) Téléchargez le fichier jar dans le chemin indiqué à l’étape 1, à partir de cet emplacement .

3) Vous devriez maintenant pouvoir exécuter quelque chose comme ceci (code tiré de tutoriel officiel de MongoDB , en utilisant la réponse de Briford Wylie ci-dessus ):

from pyspark.sql import SparkSession

my_spark = SparkSession \
    .builder \
    .appName("myApp") \
    .config("spark.mongodb.input.uri", "mongodb://127.0.0.1:27017/spark.test_pyspark_mbd_conn") \
    .config("spark.mongodb.output.uri", "mongodb://127.0.0.1:27017/spark.test_pyspark_mbd_conn") \
    .config('spark.jars.packages', 'org.mongodb.spark:mongo-spark-connector_2.11:2.2.2') \
    .getOrCreate()

Avertissements:

1) Je ne sais pas si cette réponse est le bon endroit/SO question pour mettre ceci; s'il vous plaît aviser d'un meilleur endroit et je vais le déplacer.

2) Si vous pensez que je me suis trompé ou que le processus ci-dessus a été amélioré, merci de le commenter et je le réviserai.

1
ximiki
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'))

Ça vient....

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

Ensuite...

import pyspark
import numpy as np

from pyspark import SparkContext

sc = SparkContext("local[1]")
.
.
.
0
Thierry Barnier