将Jar添加到独立的pyspark

时间:2016-03-03 03:10:38

标签: python apache-spark pyspark

我正在推出一个pyspark计划:

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

和py代码:

from pyspark import SparkContext, SparkConf

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

如何添加jar依赖项,例如Databricks csv jar?使用命令行,我可以像这样添加包:

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

但我没有使用其中任何一种。该程序是一个较大的工作流程的一部分,不使用spark-submit 我应该能够运行我的./foo.py程序,它应该可以工作。

  • 我知道您可以为extraClassPath设置spark属性,但是您必须将JAR文件复制到每个节点?
  • 尝试使用py4j CNF异常无效的conf.set(“spark.jars”,“jar1,jar2”)

5 个答案:

答案 0 :(得分:19)

这里有很多方法(设置ENV vars,添加到$ SPARK_HOME / conf / spark-defaults.conf等等)。一些答案已经涵盖了这些。我想为那些专门使用Jupyter笔记本并在笔记本中创建Spark会话的人添加附加答案。这是最适合我的解决方案(在我的情况下,我希望加载Kafka包):

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

使用这行代码我不需要做任何其他事情(没有ENVs或conf文件更改)。

答案 1 :(得分:10)

可以使用$SPARK_HOME/conf/spark-defaults.conf中的spark.jars.packages(设置spark.jars也应该有用)属性传递任何依赖项。它应该是逗号分隔的坐标列表。

必须在启动JVM和this happens during SparkConf initialization之前设置包或类路径属性。这意味着此处不能使用SparkConf.set方法。

替代方法是在PYSPARK_SUBMIT_ARGS对象初始化之前设置SparkConf环境变量:

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)

答案 2 :(得分:2)

经过多次尝试后终于找到了答案。答案特定于使用spark-csv jar。在硬盘中创建一个文件夹,说D:\ Spark \ spark_jars。将以下罐放在那里:

  1. spark-csv_2.10-1.4.0.jar(这是我正在使用的版本)
  2. 公地-CSV-1.1.jar
  3. 单义的解析器-1.5.1.jar
  4. 2和3是spark-csv所需的依赖项,因此这两个文件也需要下载。转到已下载Spark的conf目录。在spark-defaults.conf文件中添加以下行:

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

    星号应包括所有罐子。现在运行Python,像往常一样创建SparkContext,SQLContext。现在你应该能够使用spark-csv作为

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

答案 3 :(得分:2)

我遇到了另一个jar(“MongoDB Connector for Spark”,mongo-spark-connector)的类似问题,但最大的警告是我通过Spark安装了pysparkcondaconda install pyspark)中。因此,Spark特定答案的所有帮助都不是很有帮助。对于那些使用conda安装的人来说,这是我拼凑在一起的过程:

1)找到pyspark/jars所在的位置。我正走在这条道路上:~/anaconda2/pkgs/pyspark-2.3.0-py27_0/lib/python2.7/site-packages/pyspark/jars

2)Downloadjar文件放入步骤1中找到的路径this location

3)现在你应该可以运行这样的代码(代码取自MongoDB official tutorial,使用Briford Wylie's answer above):

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()

<强>免责声明:

1)我不知道这个答案是否适合这个问题/ SO问题;请告知更好的地方,我会移动它。

2)如果您认为我有错误或对上述流程有所改进,请发表评论,我会修改。

答案 4 :(得分: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'))

来了......

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

则...

import pyspark
import numpy as np

from pyspark import SparkContext

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