一.引言

Spark submit 可以选择 --jars 传入本地的jar也可以 --jars 传入HDFS的jar包,经过半下午的实验,终于搞清了两者的关系以及 spark.yarn.jars 和它们的区别

二.--jars的使用

1.--jars 传入本地jar包

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

spark 提交本地jar spark submit jars_spark 提交本地jar

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

2.--jars 传入HDFS jar包

--jars hdfs://ns3-backup/user/dependency.a.jar,hdfs://ns3-backup/user/dependency.b.jar,hdfs://ns3-backup/user/dependency.c.jar

spark 提交本地jar spark submit jars_spark 提交本地jar_02

 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:

spark 提交本地jar spark submit jars_spark_03

 spark.yarn.jars:

spark 提交本地jar spark submit jars_submit_04

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无法创建。

spark 提交本地jar spark submit jars_spark 提交本地jar_05

spark 提交本地jar spark submit jars_--jars_06

3.spark.yarn.jars 使用

spark-submit脚本使用

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

spark-default.conf文件配置 

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环境依赖。

spark 提交本地jar spark submit jars_spark_07

三.提升Spark submit提交速度

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

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

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

测试:

spark 提交本地jar spark submit jars_spark 提交本地jar_08

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