将 Jar 添加到独立的 pyspark
Posted
技术标签:
【中文标题】将 Jar 添加到独立的 pyspark【英文标题】:Add Jar to standalone pyspark 【发布时间】:2016-03-03 03:10:37 【问题描述】:我正在启动一个 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 文件复制到每个节点? 尝试了 conf.set("spark.jars", "jar1,jar2") 对 py4j CNF 异常也不起作用【问题讨论】:
【参考方案1】:2021-01-19 更新
这里有很多方法(设置 ENV 变量,添加到 $SPARK_HOME/conf/spark-defaults.conf 等...)其他答案已经涵盖了这些。我想为那些特别想从 Python 脚本 或 Jupyter Notebook 中执行此操作的人添加一个答案。
当您创建 Spark 会话时,您可以添加一个拉入特定 Jar 文件的 .config()(在我的情况下,我希望加载 Kafka 包):
spark = SparkSession.builder.appName('my_awesome')\
.config('spark.jars.packages', 'org.apache.spark:spark-sql-kafka-0-10_2.12:3.0.1')\
.getOrCreate()
使用这行代码我不需要做任何其他事情(没有 ENV 或 conf 文件更改)。
注意 1:JAR 文件会动态下载,无需手动下载。 注意 2:确保版本与您想要的匹配,所以在上面的示例中,我的 Spark 版本是 3.0.1,所以最后我有:3.0.1
。
【讨论】:
这个选项似乎经常被忽略/在其他地方没有记录......如前所述,这对于 jupyter 用户来说是一个很好的解决方案。 对于罐子,使用'spark.jars' 这个答案非常适合从一般代码启动 Spark 环境并需要在运行时拉取 jar 的任何人。我成功地使用它来将 GraphFrames jar 加载到一些访问权限非常有限的系统上,这些系统无法构建自定义 SparkConf 文件。感谢您提供清晰的示例! @briford-wylie 但是您是否必须下载并放置一个 jar 文件?我为 Spark.../jars/
目录中的每个 jar 做了一个 jar -tvf fileName.jar | grep -i kafka
,但没有发现任何 kafka。你的位置在哪里?我不一定对卡夫卡本身感兴趣;我只是按照你的例子来尝试概括它。
如果要添加多个Jar包,请查看此链接***.com/questions/57862801/…【参考方案2】:
可以使用$SPARK_HOME/conf/spark-defaults.conf
中的spark.jars.packages
(设置spark.jars
也可以)属性传递任何依赖项。它应该是一个逗号分隔的坐标列表。
并且必须在 JVM 启动和this happens during SparkConf
initialization 之前设置包或类路径属性。表示这里不能使用SparkConf.set
方法。
另一种方法是在初始化SparkConf
对象之前设置PYSPARK_SUBMIT_ARGS
环境变量:
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)
【讨论】:
这个解决方案似乎对我不起作用,至少在笔记本中;我仍然遇到类未找到错误。事实上,我设置的环境变量似乎都没有被 Spark 拾取。似乎os.environ
仅为运行 python 内核的进程设置环境,但任何子进程都不会获取这些环境变量。换句话说,它不等同于export ...
。有什么想法吗?
subprocess.Popen
接受env
参数,您可以在其中传递当前环境的副本。【参考方案3】:
对于不同的jar
(“MongoDB Connector for Spark”,mongo-spark-connector
),我遇到了类似的问题,但需要注意的是,我通过pyspark
在conda
(conda install pyspark
)中安装了Spark
)。因此,对Spark
特定答案的所有帮助并不是完全有帮助的。对于那些使用conda
安装的人,这是我拼凑起来的过程:
1) 查找您的pyspark/jars
所在的位置。我的路径是:~/anaconda2/pkgs/pyspark-2.3.0-py27_0/lib/python2.7/site-packages/pyspark/jars
。
2) Download 将jar
文件添加到步骤 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)如果您认为我对上述过程有错误或改进,请发表评论,我会修改。
【讨论】:
不使用 maven 如何处理“spark.jars.packages”? 什么意思?如果这是一个错误,您是否要发布堆栈跟踪?【参考方案4】:经过多次尝试终于找到了答案。答案是特定于使用 spark-csv jar 的。在硬盘中创建一个文件夹,例如 D:\Spark\spark_jars。将以下罐子放在那里:
-
spark-csv_2.10-1.4.0.jar(这是我正在使用的版本)
commons-csv-1.1.jar
univocity-parsers-1.5.1.jar
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')
【讨论】:
【参考方案5】: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]")
.
.
.
【讨论】:
sys.path 用于 python 包而不是 jars以上是关于将 Jar 添加到独立的 pyspark的主要内容,如果未能解决你的问题,请参考以下文章