【问题标题】:spark submit add multiple jars in classpathspark提交在类路径中添加多个jar
【发布时间】:2015-05-19 21:11:34
【问题描述】:

我正在尝试运行一个有多个 jar 文件的 spark 程序,如果我只有一个 jar 文件,我将无法运行。我想添加位于同一位置的两个 jar 文件。我已经尝试了以下,但它显示了一个依赖错误

spark-submit \
  --class "max" maxjar.jar Book1.csv test \
  --driver-class-path /usr/lib/spark/assembly/lib/hive-common-0.13.1-cdh​5.3.0.jar

如何添加另一个在同一目录中的 jar 文件?

我想添加/usr/lib/spark/assembly/lib/hive-serde.jar

【问题讨论】:

  • 欢迎@avinash,下一篇文章我建议你看看stackoverflow.com/editing-help
  • spark-submit [restofyouroptions] --conf "spark.driver.extraClassPath=myjarfile.jar"
  • 多个jar文件:"spark.driver.extraClassPath=/path/myjarfile1.jar:/path/myjarfile2.jar"
  • @zahra 对我不起作用,“没有合适的驱动程序”发现错误。这个问题是由于JVM在设置'extraClassPath'conf之前已经启动了。有什么方法可以在JVM启动之前设置它吗?

标签: submit apache-spark classpath


【解决方案1】:

只需使用--jars 参数。 Spark 将与执行者共享这些 jars(以逗号分隔)。

【讨论】:

  • 我试过逗号分隔 spark-submit --class "max" maxjar.jar Book1.csv test /usr/lib/spark/assembly/lib/hive-common-0.13.1-cdh5.3.0 .jar,hive-serde.jar 。但它不读取任何罐子。我收到这个错误 org/apache/hadoop/hive/conf/HiveConf
  • 我的意思是,像这样使用它: spark-submit --master master_url --jars jar1,jar2 --class classname application_jar
  • 实际上我想在我的类路径中添加多个罐子。我无权在我的语言环境文件中复制罐子,所以我只是通过类路径访问罐子
  • 我也试过了,但它不起作用,spark 只考虑了第一个 jar,第二个将其视为工作 jar,因此,它抛出一个异常,告诉指定的类--class 未找到
【解决方案2】:

为所有其他 jars 指定完整路径。

./bin/spark-submit --class "SparkTest" --master local[*] --jars /fullpath/first.jar,/fullpath/second.jar /fullpath/your-program.jar

或者在 conf/spark-defaults.conf 中添加 jars,方法是添加如下行:

spark.driver.extraClassPath /fullpath/firs.jar:/fullpath/second.jar
spark.executor.extraClassPath /fullpath/firs.jar:/fullpath/second.jar

【讨论】:

  • 如何在 Windows 中进行操作?因为在 Windows 路径上包括冒号,例如D:\路径
  • 一个逗号分隔的软件包列表帮助了我。在 spark 文件夹的 bin 文件夹中创建一个 spark-defaults.conf 文件。在 spark-defaults.conf 中键入“spark.jars.packages org.apache.spark:spark-streaming-kafka-0-10_2.12:3.0.2,org.apache.spark:spark-avro_2.12:3.0。 2" 如您所见,我得到了第一个包“streaming kafka”和第二个包“spark avro”。您所要做的就是通过用逗号分隔符指定它们来添加尽可能多的包。
【解决方案3】:

添加 conf/spark-defaults.conf 时,您可以使用 * 将所有 jar 导入文件夹。

spark.driver.extraClassPath /fullpath/*
spark.executor.extraClassPath /fullpath/*

【讨论】:

  • 你确定吗?我得到“16/10/20 19:56:43 ERROR SparkContext: Jar not found at file:/root/.ivy2/jars/*.jar”
  • 相对路径也可以!我的设置是“spark.driver.extraClassPath lib/*”,其中 lib 是 spark home 下的目录,所有 3rd 方 jar 都在那里。
【解决方案4】:

我试图从使用spark-submit 执行的python 代码连接到mysql。

我使用的是使用 Ambari 的 HDP 沙盒。尝试了很多选项,例如--jars--driver-class-path 等,但都没有奏效。

解决方案

将jar复制到/usr/local/miniconda/lib/python2.7/site-packages/pyspark/jars/

到目前为止,我不确定这是解决方案还是快速破解,但由于我正在研究 POC,所以它对我来说有点工作。

【讨论】:

  • meta.stackoverflow.com/q/288160/1434041 尽管将它们作为更大编辑的一部分删除更有意义。
  • 仅供参考,因为这是我在 Google 中使用 Spark 2.xAWS EMR 中搜索时发现的第一个问题> jars 文件夹位于/usr/lib/spark/jars/。 AWS 提供了一个 official tutorial 来说明如何做到这一点。
【解决方案5】:

在 Spark 2.3 中,您只需设置 --jars 选项。文件路径应以方案开头,即file:///<absolute path to the jars> 例如:file:////home/hadoop/spark/externaljsrs/*file:////home/hadoop/spark/externaljars/abc.jar,file:////home/hadoop/spark/externaljars/def.jar

【讨论】:

    【解决方案6】:

    您可以使用 --jars $(echo /Path/To/Your/Jars/*.jar | tr ' ' ',') 来包含整个 Jars 文件夹。 所以, 火花提交——类 com.yourClass \ --jars $(echo /Path/To/Your/Jars/*.jar | tr ' ' ',') \ ...

    【讨论】:

      【解决方案7】:

      --jarsjar 文件的路径通过, 分隔到spark-submit

      供参考:

      --driver-class-path is used to mention "extra" jars to add to the "driver" of the spark job
      
      --driver-library-path is used to "change" the default library path for the jars needed for the spark driver
      
      --driver-class-path will only push the jars to the driver machine. If you want to send the jars to "executors", you need to use --jars
      

      并以编程方式设置 jar 设置以下配置: spark.yarn.dist.jars 带有逗号分隔的 jar 列表。

      例如:

      from pyspark.sql import SparkSession
      
      spark = SparkSession \
              .builder \
              .appName("Spark config example") \
              .config("spark.yarn.dist.jars", "<path-to-jar/test1.jar>,<path-to-jar/test2.jar>") \
              .getOrCreate()
      

      【讨论】:

        【解决方案8】:

        对于--driver-class-path 选项,您可以使用: 作为分隔符来传递多个罐子。 下面是spark-shell 命令的示例,但我想spark-submit 也应如此

            spark-shell --driver-class-path /path/to/example.jar:/path/to/another.jar
        

        Spark 版本:2.2.0

        【讨论】:

          【解决方案9】:

          如果您使用的是属性文件,您可以在其中添加以下行:

          spark.jars=jars/your_jar1.jar,...
          

          假设

          <your root from where you run spark-submit>
            |
            |-jars
                |-your_jar1.jar
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-09-28
            • 2021-02-24
            • 1970-01-01
            • 2013-10-06
            • 1970-01-01
            • 2021-10-26
            • 1970-01-01
            相关资源
            最近更新 更多