最近工作中遇到一个问题:某个spark任务在客户现场运行时好时坏,报错都是因为类找不到,经过排查,发现是客户集群有些机器的本地依赖不全。现将Spark提交时依赖文件的设置方式做个总结。
Spark运行需要这三类资源文件:第三方依赖、配置文件、用户程序包。
默认情况下,客户端会把这三类资源文件上传到HDFS上,第三方依赖包含 $SPARK_HOME/jars目录下的所有jar包,配置文件包含 SPARK_HOME/conf和$YARN_CONF_DIR目录下的所有配置文件。
生产环境中不能每次提交都将所有第三方依赖上传到HDFS上,因为生产环境中可能每时每刻都有任务在提交,所以一般会选择使用本地依赖或者提前上传到HDFS上。
spark.yarn.jars用于指定spark运行时使用的第三方依赖,这些依赖可以在本地,也可以在HDFS上。如果指定为本地,需要保证NodeManager的每台机器上都有相同的依赖,因为客户端在提交spark任务时,并不会将spark.yarn.jars指定的本地依赖上传,而是告诉Driver和Executor,你们要使用的依赖在本地这个路径。如果指定为HDFS,则只需要维护一份依赖,Driver和Executor从HDFS下载依赖到本地。
本地依赖配置演示:
HDFS配置演示:
与spark.yarn.jars配置类似的是spark.yarn.archive,只不过spark.yarn.archive要求指向的zip压缩包,spark.yarn.jars指向的则是原始的jar包。
本地依赖优缺点:
- 提交时不用上传HDFS,容器运行时不用从HDFS下载,避免了无意义的网络传输。
- 每台NodeManager都必须存在相同的依赖,维护不便
HDFS依赖优缺点:
- 只需维护一份依赖,维护方便
- 容器运行时仍然需要从HDFS下载依赖,占用网络资源
实际工作中都使用本地依赖,集群搭建好后,所有机器的本地依赖都相同,后续spark任务有什么新加的依赖,打进用户jar包里。