一.引言
Spark submit 可以选择 --jars 传入本地的jar也可以 --jars 传入HDFS的jar包,经过半下午的实验,终于搞清了两者的关系以及 spark.yarn.jars 和它们的区别
二.--jars的使用
1.--jars 传入本地jar包
--jars a.jar,b.jar,c.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
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.yarn.jars:
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无法创建。
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 submit提交速度
结合上面的介绍,提升的方法其实很简单:
第一步: 将外部依赖上传至 Spark on Yarn 的相同HDFS环境下 (减少外部依赖uploading时间)
第二步: 将spark本地依赖提前配置 or 通过spark.yarn.jars传入 (减少内部spark依赖uploading时间)
测试:
之前光复制spark内部依赖就接近30s的耗时,经过修改现在只需5s即完成全部提交工作,效果立竿见影~