引言

本文承接上篇 Spark on yarn运行时Jar包加载踩坑经历 来进一步分析spark-submit 通过–jars 传入本地jar包 和 HDFS上的jar包的区别,以及 spark.yarn.jars 与前两者的区别。

–jars的使用

1. –jars 传入本地jar包

1
--jars a.jar,b.jar,c.jar

::: hljs-left

image.png

:::

传入本地jar包时,spark-submit脚本会执行Uploading resource的操作将本地的jar包拷贝到spark的临时依赖地址供后续任务执行,当jar包很多或者jar包容量很大时,需要Uploading很长时间,解决办法就是将依赖上传至HDFS。

2. –jars 传入HDFS jar包

1
--jars hdfs://nameservice1/user/dependency.a.jar,hdfs://nameservice1/user/dependency.b.jar,hdfs://nameservice1/user/dependency.c.jar

::: hljs-left

image.png

:::

Source and destination file systems are the same,这里因为把jar包传到了与spark临时依赖相同的HDFS环境下,所以无需执行Uploading操作,如果依赖很多或者依赖很大时,该操作可以大大节省spark-submit提交任务的时间。

–jars 与 spark.yarn.jars的作用与区别

1. –jars 与 spark.yarn.jars的作用
–jars主要用于上传我们需要的依赖,spark.yarn.jars 主要传入spark环境相关的jar包,例如 spark.core,spark.sql等等,二者的详细区别可以参见 spark on yarn 官网

–jars:

image.png

spark.yarn.jars:

image.png

2. –jars 和 spark.yarn.jars 传入相同内容
–jars需要将依赖的jar包一一罗列并加入脚本中,比较复杂,spark.yarn.jars 可以直接传入 HDFS 地址,类似 /user/dependency/*.jar 一步到位,但是需要注意,spark.yarn.jars 传入的 HDFS 下需要包含 spark 相关的原始jar包,如果只包含依赖jar包而没有spark原始依赖则无法提交任务,因为spark.core都找不到了,AM无法创建。

image.png

image.png

3. spark.yarn.jars 使用
spark-submit脚本配置

1
--conf spark.yarn.jars=/user/dependency/*.jar

spark-default.conf文件配置

1
spark.yarn.archive=/user/denpendency/spark-2.x.x.zip

spark.yarn.jars通过HDFS传入spark相关依赖,spark.yarn.archive 通过配置本地spark-defaults.conf 的参数指向HDFS的spark依赖zip。如果不使用上述两个参数之一,则spark会将本地spark原始依赖uploading至HDFS spark环境,可以看到这里耗时在30s左右,还是很影响任务提交速度,所以尽量使用上述两个参数之一配置spark环境依赖。

image.png

提升Spark submit提交速度

结合上面的介绍,提升的方法其实很简单:

第一步: 将外部依赖上传至 Spark on Yarn 的相同HDFS环境下 (减少外部依赖uploading时间)

第二步: 将spark本地依赖提前配置 or 通过spark.yarn.jars传入 (减少内部spark依赖uploading时间)

测试截图:
image.png

在为优化之前任务提交时光复制spark内部依赖就接近30s的耗时,经过修改现在只需5s即完成全部提交工作,效果立竿见影~