将 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),我遇到了类似的问题,但需要注意的是,我通过pysparkcondaconda 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的主要内容,如果未能解决你的问题,请参考以下文章

Maven将独立jar包安装到本地库

ruoyi打包jar分离配置部署

怎么将maven jar添加到idea

想对java的jar包总结学习,每天添加点货

Gradle - 将单个文件添加到 JAR

Maven - 如何将任意类路径条目添加到 jar?