Fork me on GitHub

Spark任务依赖jar包总结

目录

  • 背景
  • 第一部分 常用快捷键
  • 参考文献及资料

背景

编写了Spark批任务(Java),使用maven打包成jar包,提交到Yarn集群,报jar包冲突的错误。查阅资料了解一下背后的原理。

https://stackoverflow.com/questions/16222748/building-a-fat-jar-using-maven

第一部分 Spark任务加载jar包原理

Spark任务运行默认加载的配置从默认的配置文件中获取,如果配置参数用户重新定义,那么参数将会覆盖默认配置文件中加载的配置。

spark-defaults.conf

https://exceptionshub.com/add-jars-to-a-spark-job-spark-submit.html

原因是本地的jar包被SPARK_HOME/lib中的jar覆盖。spark程序在提交到yarn时,除了上传用户程序的jar,还会上传SPARK_HOME的lib目录下的所有jar包(参考附录2 )。如果你程序用到的jar与SPARK_HOME/lib下的jar发生冲突,那么默认会优先加载SPARK_HOME/lib下的jar,而不是你程序的jar,所以会发生“ NoSuchMethodError”。

1
mvn dependency:tree -Dverbose

参数spark.yarn.jars

官方文档的解释:

1
List of libraries containing Spark code to distribute to YARN containers. By default, Spark on YARN will use Spark jars installed locally, but the Spark jars can also be in a world-readable location on HDFS. This allows YARN to cache it on nodes so that it doesn't need to be distributed each time an application runs. To point to jars on HDFS, for example, set this configuration to hdfs:///some/path. Globs are allowed.

参数(1.5.1):

spark.driver.extraClassPath

spark.executor.extraClassPath

附加到driver的classpath的额外的classpath实体。

附加到executors的classpath的额外的classpath实体。这个设置存在的主要目的是Spark与旧版本的向后兼容问题。用户一般不用设置这个选项

额外的classpath条目需预先添加到驱动程序 classpath中。 注意 : 在客户端模式下,这一套配置不能通过 SparkConf 直接在应用在应用程序中,因为 JVM 驱动已经启用了。相反,请在配置文件中通过设置 –driver-class-path 选项或者选择默认属性。

目录使用hdfs文件

参数:

spark.driver.extraLibraryPath

spark.executor.extraLibraryPath

指定启动driver的JVM时用到的库路径

参数:(2.1.0版本后)

spark.driver.userClassPathFirst

spark.executor.userClassPathFirst

(实验性)当在driver中加载类时,是否用户添加的jar比Spark自己的jar优先级高。这个属性可以降低Spark依赖和用户依赖的冲突。它现在还是一个实验性的特征。

(实验)在驱动程序加载类库时,用户添加的 Jar 包是否优先于 Spark 自身的 Jar 包。这个特性可以用来缓解冲突引发的依赖性和用户依赖。目前只是实验功能。这是仅用于集群模式。

参数:

spark.yarn.dist.jars

第二部分 解决jar包冲突

第四种方式

操作:更改Spark的配置信息:SPARK_CLASSPATH, 将第三方的jar文件添加到SPARK_CLASSPATH环境变量中

注意事项:要求Spark应用运行的所有机器上必须存在被添加的第三方jar文件

复制代码;)

1
2
3
4
5
6
7
A.创建一个保存第三方jar文件的文件夹:
命令:$ mkdir external_jars
B.修改Spark配置信息
命令:$ vim conf/spark-env.sh
修改内容:SPARK_CLASSPATH=$SPARK_CLASSPATH:/opt/cdh-5.3.6/spark/external_jars/*
C.将依赖的jar文件copy到新建的文件夹中
命令:$ cp /opt/cdh-5.3.6/hive/lib/mysql-connector-java-5.1.27-bin.jar ./external_jars/

备注:(只针对spark on yarn(cluster)模式)

spark on yarn(cluster),如果应用依赖第三方jar文件

最终解决方案:将第三方的jar文件copy到${HADOOP_HOME}/share/hadoop/common/lib文件夹中(Hadoop集群中所有机器均要求copy)

https://blog.csdn.net/ifenggege/article/details/108327167

参考文献及资料

1、Running Spark on YARN,链接:https://spark.apache.org/docs/1.5.1/running-on-yarn.html

2、解决jar包冲突新思路 - maven-shade-plugin,链接:https://zhuanlan.zhihu.com/p/62796806

0%