Spark作业提交时Worker节点jar包存储、配置及版本问题咨询
Spark第三方Jar包部署常见问题解答
问题1:Spark作业提交后第三方Jar包在工作节点的默认存储路径
根据部署模式不同,默认存储路径有差异:
- Standalone模式:默认存储在Worker节点工作目录下,路径为
${spark.worker.dir}/work/${spark.app.id}/${executor.id}/spark-uploads/,未显式配置spark.worker.dir时,默认根路径为Spark安装目录下的work文件夹。 - YARN模式:存储在YARN NodeManager本地化目录
${yarn.nodemanager.local-dirs}/usercache/${user}/appcache/${application.id}/container_${container.id}/下的filecache子目录或Spark执行器私有工作目录。 - Kubernetes模式:存储在Executor Pod的
/opt/spark/work-dir/spark-uploads/路径下,对应Pod临时存储挂载目录。
问题2:是否支持自定义Jar包存储路径,配置方式是什么
支持自定义,可按两类场景配置:
场景1:自定义作业运行时Jar包上传临时路径
通过修改spark.local.dir参数调整Spark本地临时文件根路径,Jar包默认会存储在该路径下的对应作业目录中,该参数有三种配置方式:
- 全局配置:在Spark集群的
conf/spark-defaults.conf文件中添加配置行:spark.local.dir /your/custom/path - 提交作业时动态配置:在
spark-submit命令中添加参数:--conf spark.local.dir=/your/custom/path - 代码内配置:初始化SparkConf时添加配置:
conf.set("spark.local.dir", "/your/custom/path")
场景2:固定路径预存Jar包避免重复上传
如果不需要每次提交作业都上传Jar包,可以提前把所有第三方Jar包上传到所有Worker/NodeManager节点的指定路径(例如/opt/spark/external-jars/),再配置spark.executor.extraClassPath和spark.driver.extraClassPath参数将该路径加入类路径,提交作业时无需再上传Jar包,Spark会直接从指定路径加载。
问题3:同版本号Jar包更新后Spark仍加载旧版本的解决方案
该问题根因是Spark的资源缓存机制,会对相同文件名/资源标识的Jar包做本地缓存,不会重复拉取更新后的文件,可按以下优先级选择解决方案:
- 规范方案:修改Jar包版本号,比如给版本号追加构建时间戳,改为
1.1.1-202405201200这类带唯一标识的版本号,从根源上避免缓存冲突,符合Maven版本管理规范。 - 不修改版本号的临时方案:
- 提交作业时开启资源覆盖配置,添加参数:
--conf spark.files.overwrite=true --conf spark.yarn.staging.overwrite=true,强制Spark覆盖已有缓存的同名资源。 - 给Jar包文件名添加唯一后缀,比如每次打包时自动追加构建时间戳,将Jar包重命名为
xxx-1.1.1-20240520.jar,资源标识变更后Spark会当作新资源拉取。 - 若使用HDFS存储Jar包,可在
--jars参数的Jar包路径后追加伪查询参数,例如:--jars hdfs:///path/xxx-1.1.1.jar?ts=202405201200,Spark会忽略查询参数但识别为新的资源标识,触发重新拉取。 - 临时清空所有工作节点上对应应用的缓存目录,清除旧版本Jar包后再提交作业。
- 提交作业时开启资源覆盖配置,添加参数:
内容的提问来源于stack exchange,提问作者FreshTransistor
相关产品推荐
相关产品推荐

