【问题标题】:Add Jar to standalone pyspark将 Jar 添加到独立的 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 异常也不起作用

【问题讨论】:

    标签: python apache-spark pyspark


    【解决方案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包,请查看此链接stackoverflow.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) 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)如果您认为我对上述过程有错误或改进,请发表评论,我会修改。

    【讨论】:

    • 不使用 maven 如何处理“spark.jars.packages”?
    • 什么意思?如果这是一个错误,您是否要发布堆栈跟踪?
    【解决方案4】:

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

    1. spark-csv_2.10-1.4.0.jar(这是我正在使用的版本)
    2. commons-csv-1.1.jar
    3. 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
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多