Dataproc:从边缘节点向YARN提交Spark作业时依赖集群HDFS的问题
问题解答
1. 为什么spark-submit需要访问HDFS?
- Spark作业提交时,默认会把应用jar包、依赖库上传到HDFS的临时staging目录,YARN的NodeManager需要从这个HDFS路径拉取依赖文件来启动Executor进程。
- Spark会将作业元数据、配置信息写入HDFS,YARN集群的ResourceManager、NodeManager等节点需要读取这些信息来协调作业的调度与执行。
- 即便你没指定HDFS作为输入输出路径,Spark默认会把集群HDFS当作工作目录,提交阶段会做路径初始化或校验,这也需要访问HDFS。
2. 是否存在避免该依赖的方法?
当然有,以下几种可行方案:
- 改用外部对象存储替代HDFS作为工作目录
- 配置
spark.yarn.stagingDir指向外部可访问的对象存储(比如Dataproc适配的GCS),spark-submit会把依赖包上传到这个外部存储,YARN节点直接从这里拉取,无需访问集群HDFS。 - 设置
spark.hadoop.fs.defaultFS为外部存储地址,让Spark默认用外部存储作为作业工作目录,彻底绕开集群HDFS。
- 配置
- 让YARN直接从边缘节点拉取依赖
- 在spark-submit时通过
--jars指定依赖,同时配置spark.yarn.dist.archives或spark.yarn.dist.files参数,让YARN通过分布式缓存机制直接从你的边缘节点拉取依赖文件(前提是边缘节点和所有NodeManager网络互通)。
- 在spark-submit时通过
- 提前在NodeManager本地部署依赖
- 如果作业依赖固定,可以提前把jar包部署到所有NodeManager的本地目录,提交时用
--deploy-mode client,并设置spark.jars为本地路径。这样Spark无需上传依赖到HDFS,直接使用本地文件,但这种方式维护成本较高,适合依赖变更少的场景。
- 如果作业依赖固定,可以提前把jar包部署到所有NodeManager的本地目录,提交时用
内容的提问来源于stack exchange,提问作者Dagang Wei
相关产品推荐
相关产品推荐

