Spark Submit如何在classpath中添加多个Jars

49
我正在尝试运行一个Spark程序,其中有多个jar文件,但如果我只有一个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文件在同一目录下的另一个jar文件添加进来?

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


欢迎@avinash,我建议您查看http://stackoverflow.com/editing-help以获取下一篇帖子的帮助。 - AdrieanKhisbe
spark-submit [restofyouroptions] --conf "spark.driver.extraClassPath=myjarfile.jar" - Zahra
3
多个jar文件: "spark.driver.extraClassPath=/path/myjarfile1.jar:/path/myjarfile2.jar" - Zahra
@zahra对我没有用,出现了“找不到合适的驱动程序”的错误。这个问题是由于在设置“extraClassPath”配置之前JVM已经启动了。有没有办法在JVM启动之前设置它? - Jai K
9个回答

53

只需使用--jars参数。Spark将把这些JAR文件(用逗号分隔)与执行器共享。


3
我尝试了使用逗号分隔的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,但是它无法读取这两个jar文件。我收到了这个错误信息:org/apache/hadoop/hive/conf/HiveConf。 - Avinash Nishanth S
4
我的意思是,使用以下方式:spark-submit --master master_url --jars jar1,jar2 --class classname application_jar - pzecevic
实际上我想在我的类路径中添加多个JAR文件。我无法访问复制JAR文件到本地文件的权限,所以我只能通过类路径访问这些JAR文件。 - Avinash Nishanth S
我也尝试过,但它不起作用,Spark 只考虑了第一个 jar 文件,第二个将其视为作业 jar 文件,因此,它会抛出一个异常,告诉我们找不到使用 --class 指定的类。 - aName

42

指定所有附加jar包的完整路径是有效的。

./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

1
我该如何在Windows上实现?因为在Windows上,路径包括冒号,例如D:\path。 - user812142
一个由逗号分隔的包列表帮助了我.. 在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",正如您所看到的,我正在获取第1个包“streaming kafka”和第2个包“spark avro”..您需要做的就是通过使用逗号分隔符指定它们来添加尽可能多的软件包。 - Induraj PR

23
您可以在添加到conf/spark-defaults.conf中时使用*将所有jar包导入文件夹中。
spark.driver.extraClassPath /fullpath/*
spark.executor.extraClassPath /fullpath/*

你确定吗?我得到了“16/10/20 19:56:43 错误 SparkContext:在文件:/root/.ivy2/jars/*.jar中找不到Jar包”。 - Thomas Decaux
1
相对路径也可以使用!我的设置是“spark.driver.extraClassPath lib / *”,其中lib是spark home下的目录,所有第三方jar包都在那里。 - Leon
这个解决方案可行!我遇到了类似的问题,需要为多个数据库连接场景使用两个不同的JDBC驱动程序,这种方法非常有效!谢谢。 - Prajwal Ainapur

6
在Spark 2.3中,您只需要设置--jars选项。但是文件路径应该以方案为前缀,即file:///绝对路径到jars。 例如:file:////home/hadoop/spark/externaljsrs/*file:////home/hadoop/spark/externaljars/abc.jar,file:////home/hadoop/spark/externaljars/def.jar

6
我正在尝试从使用spark-submit执行的Python代码连接到MySQL。我正在使用使用Ambari的HDP sandbox。尝试了很多选项,如--jars--driver-class-path等,但都没有成功。
解决方案:将jar文件复制到/usr/local/miniconda/lib/python2.7/site-packages/pyspark/jars/目录下。目前我不确定这是否是解决方案或快速修补程序,但由于我正在进行POC的工作,所以它对我有点用。

1
https://meta.stackoverflow.com/q/288160/1434041 虽然将其作为较大编辑的一部分删除更有意义。 - Zahra
1
仅供参考,因为这是我在谷歌搜索时找到的第一个问题,在使用Spark 2.xAWS EMR中,jars文件夹位于/usr/lib/spark/jars/。 AWS有一份官方教程介绍如何操作。 - Daniel Lavedonio de Lima

5

在提交 spark-submit 命令时,使用--jars 选项,并使用逗号,分隔的路径指定所需的jar文件。

参考:

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

4

您可以使用--jars $(echo /Path/To/Your/Jars/*.jar | tr ' ' ',')来包含整个文件夹的Jars。 因此, spark-submit -- class com.yourClass \ --jars $(echo /Path/To/Your/Jars/*.jar | tr ' ' ',') \ ...


0
如果你正在使用属性文件,你可以在那里添加以下行:
spark.jars=jars/your_jar1.jar,...

假设

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

0

对于 --driver-class-path 选项,您可以使用 : 作为分隔符传递多个 jar 包。 以下是使用 spark-shell 命令的示例,但我想同样适用于 spark-submit

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

Spark版本:2.2.0


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接