如何为YARN上的Spark作业及Hadoop3集群修改java.io.tmpdir
我之前在Hadoop 3 + YARN环境里也碰到过这个tmp目录空间不足的坑,给你整理几个实用的解决方案,从全局集群配置到单作业临时设置都有,你可以根据自己的场景选:
方案1:全局修改YARN容器的
java.io.tmpdir(集群级) 如果所有作业都需要换临时目录,直接修改YARN的全局配置最省心:
- 修改所有节点上的
yarn-site.xml,添加以下配置:<!-- 给Application Master设置JVM临时目录 --> <property> <name>yarn.app.mapreduce.am.command-opts</name> <value>-Djava.io.tmpdir=/path/to/your/large/tmp</value> </property> <!-- 允许YARN容器继承JAVA_IO_TMPDIR环境变量 --> <property> <name>yarn.nodemanager.env-whitelist</name> <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME,JAVA_IO_TMPDIR</value> </property> <!-- 给NodeManager的管理环境设置临时目录,确保所有容器生效 --> <property> <name>yarn.nodemanager.admin-env</name> <value>JAVA_IO_TMPDIR=/path/to/your/large/tmp</value> </property> - 同步配置到所有集群节点,然后重启YARN服务:
stop-yarn.sh && start-yarn.sh - 注意:新的临时目录要给YARN用户(通常是
yarn)赋予读写权限:chown -R yarn:hadoop /path/to/your/large/tmp
方案2:针对单个Spark作业临时设置(作业级)
如果不想改动全局配置,每次提交Spark作业时单独指定即可:
- 使用
spark-submit时添加以下参数,覆盖Driver、Executor和AppMaster的临时目录:spark-submit \ --conf spark.driver.extraJavaOptions="-Djava.io.tmpdir=/path/to/large/tmp" \ --conf spark.executor.extraJavaOptions="-Djava.io.tmpdir=/path/to/large/tmp" \ --conf spark.yarn.appMasterEnv.JAVA_IO_TMPDIR=/path/to/large/tmp \ --class com.your.company.JobMain \ your-spark-job.jar
方案3:修复
core-site.xml配置的问题 你之前修改的hadoop.tmp.dir是Hadoop自身的临时目录(比如HDFS块的临时存储),并不会自动覆盖JVM的java.io.tmpdir,如果想复用这个配置,可以这么做:
- 确保所有节点的
core-site.xml都同步了hadoop.tmp.dir的配置,并且重启了HDFS和YARN服务 - 在
yarn-site.xml或Spark配置里引用这个变量,比如:<property> <name>yarn.app.mapreduce.am.command-opts</name> <value>-Djava.io.tmpdir=${hadoop.tmp.dir}/yarn-job-tmp</value> </property>
验证配置是否生效的方法
提交作业后,可以通过以下方式确认临时目录是否修改成功:
- 登录YARN WebUI,查看Application Master的日志,搜索
java.io.tmpdir - 在NodeManager节点上找到对应容器的日志目录,执行
echo $JAVA_IO_TMPDIR查看环境变量 - 用
jps -lvm命令查看Spark进程的JVM参数,确认是否包含-Djava.io.tmpdir=/path/to/your/tmp
内容的提问来源于stack exchange,提问作者qwertz1123
相关产品推荐
相关产品推荐

