You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:12:00