Apache Hadoop 配置文件详解
逐一详解 Apache Hadoop 3.3.6 核心配置文件 core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml、workers 与 hadoop-env.sh 中每个参数的作用、默认值与调优建议,附三节点生产配置模板。目标:让读者能依据业务场景正确编写与调优 Hadoop 配置。
Apache Hadoop 配置文件详解
目标:带读者逐个字段拆解 Apache Hadoop 3.3.6 的六大配置文件。Hadoop 的配置是"三台一致的外壳 + 少量本节点私有覆盖"的组合,理解每个参数才能在集群扩容、调优、排障时不动摇根基。本文配置均来自上文实际跑通 WordCount 的 3 节点集群。
配置文件总览
配置文件全部位于 <HADOOP_HOME>/etc/hadoop/,默认仅其中四个 XML + 两个纯文本/脚本最关键:
| 文件 | 管辖子系统 | 说明 |
|---|---|---|
core-site.xml | 全局(core) | 默认文件系统、临时目录、通用 I/O 缓冲 |
hdfs-site.xml | HDFS | NameNode/DataNode 目录、副本数、块大小、Web 端口 |
yarn-site.xml | YARN | ResourceManager 地址、NodeManager 资源、aux 服务 |
mapred-site.xml | MapReduce | 框架选择(yarn)、classpath、AM/Map/Reduce JVM 参数 |
workers | 集群拓扑 | 列出 DataNode/NodeManager 所在主机名单 |
hadoop-env.sh | 运行环境 | JAVA_HOME、HADOOP_HOME、各 daemon 用户、JVM 附加参数 |
⚠️ 惯例:前三台(node1/node2/node3)的这四个 XML 与
workers内容必须完全一致;hadoop-env.sh也要一致。只有"本节点私有"的信息(如 NameNode 目录、DataNode 目录各自指向本机本地盘)通过相对路径天然区分,无需额外覆盖。
core-site.xml 详解
<configuration>
<property><name>fs.defaultFS</name><value>hdfs://node1:9000</value></property>
<property><name>hadoop.tmp.dir</name><value>/opt/data/hadoop/hdfs/tmp</value></property>
<property><name>hadoop.http.staticuser.user</name><value>root</value></property>
<property><name>io.file.buffer.size</name><value>131072</value></property>
</configuration>
| 属性 | 默认值 | 取值/建议 | 说明 |
|---|---|---|---|
fs.defaultFS | file:/// | hdfs://node1:9000 | 默认文件系统 URI,客户端和 daemon 未显式指定 -fs 时连接 HDFS 的入口。集群内所有节点此值必须指向同一 NameNode。 |
hadoop.tmp.dir | /tmp/hadoop-${user.name} | /opt/data/hadoop/hdfs/tmp | 各种组件临时数据根目录。⚠️ 默认指向 /tmp 会被系统清理且重启丢失,生产务必显式指定到持久化数据盘。 |
hadoop.http.staticuser.user | dr.who | root | 通过 Web UI 访问 HDFS 时匿名请求所冒充的静态用户;权限校验开启后用于确定 HTTP 身份。 |
io.file.buffer.size | 4096 | 131072 | 读写文件所用缓冲区字节数。吞吐敏感场景调大(如 64KB/128KB)可减少系统调用与磁盘寻道;内存紧可保留默认。 |
hdfs-site.xml 详解
<configuration>
<property><name>dfs.namenode.name.dir</name><value>/opt/data/hadoop/hdfs/name</value></property>
<property><name>dfs.datanode.data.dir</name><value>/opt/data/hadoop/hdfs/data</value></property>
<property><name>dfs.replication</name><value>2</value></property>
<property><name>dfs.permissions.enabled</name><value>false</value></property>
<property><name>dfs.namenode.http-address</name><value>node1:9870</value></property>
<property><name>dfs.namenode.secondary.http-address</name><value>node2:9868</value></property>
<property><name>dfs.datanode.data.dir.perm</name><value>755</value></property>
<property><name>dfs.blocksize</name><value>134217728</value></property>
</configuration>
| 属性 | 默认值 | 取值/建议 | 说明 |
|---|---|---|---|
dfs.namenode.name.dir | file://${hadoop.tmp.dir}/dfs/name | /opt/data/hadoop/hdfs/name | NameNode 存放命名空间镜像(fsimage)与编辑日志(edits)的目录。建议挂独立可靠磁盘。可写逗号分隔的多个目录做冗余镜像(会同时写入每一份)。 |
dfs.datanode.data.dir | file://${hadoop.tmp.dir}/dfs/data | /opt/data/hadoop/hdfs/data | DataNode 存储数据块的本地目录,可逗号分隔多个卷(HDFS 会按配置 IP/SD/IP 选择写入磁盘)。 |
dfs.replication | 3 | 2 | 默认副本数。本集群仅 2 个 DataNode,故设 2。生产建议 ≥3,或按机架感知设 replication factor。 |
dfs.permissions.enabled | true | false | 是否开启 HDFS 权限检查。演示关闭(省去 chown/group 琐事);生产必须开 true 并配合超级用户/Kerberos。 |
dfs.namenode.http-address | 0.0.0.0:9870 | node1:9870 | NameNode 的 HTTP 管理端口与绑定地址(3.x 由 50070 改为 9870)。 |
dfs.namenode.secondary.http-address | 0.0.0.0:9868 | node2:9868 | SecondaryNameNode 所在节点与其 HTTP 端口。注意 SecondaryNameNode 不参与写,只做 edit log 合并(checkpoint)。 |
dfs.datanode.data.dir.perm | 755 | 755 | DataNode 数据目录的权限位,决定初始化时自动 mkdir 的目录权限。 |
dfs.blocksize | 134217728 | 134217728 | 默认数据块大小=128MB。大文件调大(256/512MB)可减少 NameNode 元数据量、提升顺序吞吐。 |
yarn-site.xml 详解
<configuration>
<property><name>yarn.resourcemanager.hostname</name><value>node1</value></property>
<property><name>yarn.resourcemanager.address</name><value>node1:8032</value></property>
<property><name>yarn.resourcemanager.scheduler.address</name><value>node1:8030</value></property>
<property><name>yarn.resourcemanager.resource-tracker.address</name><value>node1:8031</value></property>
<property><name>yarn.resourcemanager.admin.address</name><value>node1:8033</value></property>
<property><name>yarn.resourcemanager.webapp.address</name><value>node1:8088</value></property>
<property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property>
<property><name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name><value>org.apache.hadoop.mapred.ShuffleHandler</value></property>
<property><name>yarn.nodemanager.vmem-check-enabled</name><value>false</value></property>
<property><name>yarn.nodemanager.resource.memory-mb</name><value>2048</value></property>
<property><name>yarn.nodemanager.resource.cpu-vcores</name><value>2</value></property>
<property><name>yarn.scheduler.maximum-allocation-mb</name><value>2048</value></property>
<property><name>yarn.scheduler.minimum-allocation-mb</name><value>256</value></property>
</configuration>
| 属性 | 默认值 | 取值/建议 | 说明 |
|---|---|---|---|
yarn.resourcemanager.hostname | 0.0.0.0 | node1 | RM 所在主机名,开启后其余 RM 地址类属性会用该主机名自动补齐默认端口。集中声明便于维护。 |
yarn.resourcemanager.address | 0.0.0.0:8032 | node1:8032 | AM/Container 向 RM 注册与申请资源使用的 RPC 地址。 |
yarn.resourcemanager.scheduler.address | 0.0.0.0:8030 | node1:8030 | 调度器 RPC 地址,AM 通过它提交/释放资源请求。 |
yarn.resourcemanager.resource-tracker.address | 0.0.0.0:8031 | node1:8031 | NodeManager 心跳上报节点资源给 RM 的地址。 |
yarn.resourcemanager.admin.address | 0.0.0.0:8033 | node1:8033 | 管理命令(yarn rmadmin)使用的地址。 |
yarn.resourcemanager.webapp.address | 0.0.0.0:8088 | node1:8088 | RM 的 Web UI 端口,直观查看节点、应用、队列。 |
yarn.nodemanager.aux-services | 空 | mapreduce_shuffle | NM 上运行的辅助服务列表。MapReduce 必须启用 shuffle 服务,否则 Reduce 无法拉取 Map 中间结果。 |
yarn.nodemanager.aux-services.mapreduce_shuffle.class | org.apache.hadoop.mapred.ShuffleHandler | 同上 | shuffle 服务具体实现类,配合上一属性成对出现。 |
yarn.nodemanager.vmem-check-enabled | true | false | 是否校验物理内存/虚拟内存比例。容器虚拟内存超限会误杀任务,Java 17 堆外占用易误判,容器环境常关。 |
yarn.nodemanager.resource.memory-mb | 8192 | 2048 | 单个 NM 可向集群提供的总内存(MB),决定能并发多少容器。需 ≤ 节点物理内存并留系统余量。 |
yarn.nodemanager.resource.cpu-vcores | 8 | 2 | 单个 NM 可提供的 vcore 数。vmem-check 关闭时仅作调度参考计数。 |
yarn.scheduler.maximum-allocation-mb | 8192 | 2048 | 单个 Container(AM/任务)能申请的最大内存。设成与 NM 内存一致表示单容器可吃满整节点。 |
yarn.scheduler.minimum-allocation-mb | 1024 | 256 | 容器内存分配的最小粒度,所有申请按此向上取整(如 300MB 视为 2×256)。减小粒度可容纳更多小任务。 |
mapred-site.xml 详解
<configuration>
<property><name>mapreduce.framework.name</name><value>yarn</value></property>
<property><name>mapreduce.application.classpath</name><value>绝对路径…(见部署篇)</value></property>
<property><name>yarn.app.mapreduce.am.env</name><value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value></property>
<property><name>mapreduce.map.env</name><value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value></property>
<property><name>mapreduce.reduce.env</name><value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value></property>
<property><name>yarn.app.mapreduce.am.command-opts</name><value>--add-opens=... -Xmx1024m</value></property>
<property><name>mapreduce.map.java.opts</name><value>--add-opens=... -Xmx512m</value></property>
<property><name>mapreduce.reduce.java.opts</name><value>--add-opens=... -Xmx512m</value></property>
<property><name>mapreduce.jobhistory.address</name><value>node1:10020</value></property>
<property><name>mapreduce.jobhistory.webapp.address</name><value>node1:19888</value></property>
</configuration>
| 属性 | 默认值 | 取值/建议 | 说明 |
|---|---|---|---|
mapreduce.framework.name | local | yarn | 计算框架运行模式。local 本地跑(调试)、yarn 提交到集群、classic 旧版 MRv1。生产= yarn。 |
mapreduce.application.classpath | $HADOOP_HOME/share/hadoop/mapreduce/*:$HADOOP_COMMON_HOME/...(相对) | 绝对路径的五个 share 子目录 | AM 容器的 classpath。2.6+ / 3.x 常出现相对路径失效导致 AM 启动即 exit 1,务必用 $HADOOP_HOME 拼绝对路径(含 lib/*)。 |
yarn.app.mapreduce.am.env | 空 | HADOOP_MAPRED_HOME=$HADOOP_HOME | 注入到 ApplicationMaster 容器的额外环境变量;配合 classpath 使用。 |
mapreduce.map.env / mapreduce.reduce.env | 空 | HADOOP_MAPRED_HOME=$HADOOP_HOME | 注入到 map / reduce 任务容器的环境变量。 |
yarn.app.mapreduce.am.command-opts | -Xmx1024m | --add-opens=… -Xmx1024m | AM JVM 启动参数。Java 17 下这里必须加 --add-opens=java.base/java.lang=ALL-UNNAMED 等,否则 AM 加载即抛 InaccessibleObjectException。 |
mapreduce.map.java.opts | -Xmx1024m | --add-opens=… -Xmx512m | map 任务容器 JVM 参数。大小要 ≤ map 容器申请内存减去 JVM 堆外开销。 |
mapreduce.reduce.java.opts | -Xmx1024m | --add-opens=… -Xmx512m | reduce 任务容器 JVM 参数。 |
mapreduce.jobhistory.address | 0.0.0.0:10020 | node1:10020 | JobHistoryServer 的 RPC 地址(需单独启动 mapred --daemon start historyserver 才有历史)。 |
mapreduce.jobhistory.webapp.address | 0.0.0.0:19888 | node1:19888 | JobHistory 的 Web UI 端口,浏览已完成作业。 |
workers 文件详解
node2
node3
workers(3.x 之前叫slaves)每行一个主机名,列出 DataNode 与 NodeManager 所在节点。start-dfs.sh会据它通过 SSH 逐个启动 DataNode;start-yarn.sh据此启动各 NodeManager。- 不含
localhost/127.0.0.1,否则会在本机重复起一份 daemon。 - 节点扩容时只需在此追加新主机名(并保证去往新节点 SSH 免密、配置已同步)。
hadoop-env.sh 详解
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export HADOOP_HOME=/opt/data/hadoop/hadoop-3.3.6
export HADOOP_LOG_DIR=/opt/data/hadoop/logs
export HDFS_DATANODE_USER=root
export HDFS_NAMENODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
export HADOOP_OPTS="$HADOOP_OPTS --add-opens=...(见部署篇步骤 2)"
| 变量 | 作用 |
|---|---|
JAVA_HOME | 让所有 hadoop/bin 脚本找到 JDK。不设会报 JAVA_HOME is not set。 |
HADOOP_HOME | Hadoop 安装根目录,供脚本定位 bin/share 等。 |
HADOOP_LOG_DIR | 各 daemon 日志集中目录,便于统一采集。 |
HDFS_DATANODE_USER / HDFS_NAMENODE_USER / HDFS_SECONDARYNAMENODE_USER | 以 root 启动时必须定义,否则 start-dfs.sh 因安全检查中止。生产建议换成 hadoop 用户。 |
YARN_RESOURCEMANAGER_USER / YARN_NODEMANAGER_USER | 同理,YARN 侧的安全检查必需。 |
HADOOP_OPTS | 追加到所有 HDFS/YARN daemon JVM 的通用参数,Java 17 模块访问开关在此统一注入。 |
三节点生产配置模板要点
-
四个 XML +
workers+hadoop-env.sh三台逐字节一致;分发用:cd /opt/data/hadoop/hadoop-3.3.6 && tar -cf - etc/hadoop | ssh node2 "tar -xf - -C /opt/data/hadoop/hadoop-3.3.6" -
dfs.namenode.name.dir指向 node1 的独立持久盘;dfs.datanode.data.dir挂多卷提升吞吐。 -
Java 17 生产模板统一在
HADOOP_OPTS、yarn.app.mapreduce.am.command-opts、mapreduce.{map,reduce}.java.opts四处追加同一组--add-opens。 -
副本数、块大小、NM 内存按"节点数×磁盘×可用内存"计算,切忌照抄小集群参数到大型生产。
调优建议汇总
- 小集群起步:
dfs.replication=2、yarn.nodemanager.resource.memory-mb=2048、yarn.scheduler.minimum-allocation-mb=256,让内存池尽量细粒度,能同时跑更多小作业。 - 吞吐型:
dfs.blocksize=268435456(256MB)、io.file.buffer.size=262144,减少 NameNode 元数据量与磁盘寻道。 - 高频小文件:块大小保持 128MB 即可,更多精力放在
small files合并(如 SequenceFile)而非调块。 - 容器环境:务必
yarn.nodemanager.vmem-check-enabled=false,避免 JVM 堆外/直接内存被虚拟内存校验误杀。
JVM 内存调优配置(实测)
本集群为低内存服务器(总内存有限),已对 HDFS 与 YARN 各守护进程的 JVM 堆做了调低并重启验证。
- 配置文件:
/opt/data/hadoop/hadoop-3.3.6/etc/hadoop/hadoop-env.sh、yarn-env.sh - 新增/调低:
HADOOP_HEAPSIZE=512HADOOP_NAMENODE_OPTS="-Xms256m -Xmx512m"HADOOP_DATANODE_OPTS="-Xmx256m"
- YARN 侧:
YARN_RESOURCEMANAGER_OPTS="-Xms256m -Xmx512m"、YARN_NODEMANAGER_OPTS="-Xmx512m"
调低后 NameNode 进程 RSS≈264 MB、ResourceManager RSS≈372 MB,HDFS 与 YARN 均正常提供服务。
参考链接
- Hadoop core-site 官方默认:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/core-default.xml
- HDFS 参数(hdfs-default.xml):https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
- YARN 参数(yarn-default.xml):https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
- MapReduce 参数(mapred-default.xml):https://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml