前言
接Zookeeper 安装配置,本文继续总结 Hadoop HA 集群安装配置。
版本
- ZooKeeper 3.9.3
- Hadoop 3.4.1 、3.1.4 (只装过这两个版本,但 3.x 应该都一样)
下载 Hadoop
下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.4.1/hadoop-3.4.1.tar.gz
解压
bash
tar -zxvf hadoop-3.4.1.tar.gz -C /usr/local/
ln -s /usr/local/hadoop-3.4.1 /usr/local/hadoop
配置环境变量
bash
vi /etc/profile.d/hadoop.sh
bash
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
bash
source /etc/profile.d/hadoop.sh
验证Hadoop环境变量
bash
hadoop version
Hadoop 3.4.1
Source code repository https://github.com/apache/hadoop.git -r 4d7825309348956336b8f06a08322b78422849b1
Compiled by mthakur on 2024-10-09T14:57Z
Compiled on platform linux-x86_64
Compiled with protoc 3.23.4
From source with checksum 7292fe9dba5e2e44e3a9f763fce3e680
This command was run using /usr/local/hadoop-3.4.1/share/hadoop/common/hadoop-common-3.4.1.jar
配置 Hadoop
hadoop-env.sh
bash
vi /usr/local/hadoop/etc/hadoop/hadoop-env.sh
bash
export JAVA_HOME=/usr/local/jdk
export HADOOP_LOG_DIR=/var/log/hadoop/hdfs
创建日志目录
每个节点都执行:
bash
mkdir -p /var/log/hadoop/hdfs
start-dfs.sh & stop-dfs.sh
分别修改 start-dfs.sh 和 stop-dfs.sh
bash
vi /usr/local/hadoop/sbin/start-dfs.sh
vi /usr/local/hadoop/sbin/stop-dfs.sh
bash
在
function hadoop_usage
前添加:
HDFS_JOURNALNODE_USER=root
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
HDFS_ZKFC_USER=root
start-yarn.sh & stop-yarn.sh
分别修改 start-yarn.sh 和 stop-yarn.sh
bash
vi /usr/local/hadoop/sbin/start-yarn.sh
vi /usr/local/hadoop/sbin/stop-yarn.sh
bash
在
function hadoop_usage
前添加:
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
core-site.xml
bash
vi /usr/local/hadoop/etc/hadoop/core-site.xml
xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://cluster1</value>
<description>
指定 HDFS 的默认名称服务(nameservice) 为 cluster1
这是 HDFS 的核心配置,客户端通过此参数确定连接哪个 HDFS 集群
</description>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/indata/disk_0/journalnode</value>
<description>
指定 JournalNode 在本地磁盘上存储编辑日志(edits log)的目录
JournalNode 用于在 HDFS HA(高可用)模式下同步 NameNode 的编辑日志,确保主从 NameNode 数据一致
</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/indata/disk_0/hadoop/tmp</value>
<description>
指定 Hadoop 各种临时文件的存放目录
Hadoop 的很多组件(包括 HDFS、MapReduce 等)都会使用此目录存储临时数据,建议配置在有足够空间的磁盘上
</description>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>indata-192-168-1-1.indata.com:2181,indata-192-168-1-2.indata.com:2181,indata-192-168-1-3.indata.com:2181</value>
<description>
指定用于 HDFS HA 自动故障转移的 ZooKeeper 集群地址
ZooKeeper 在 HDFS HA 中负责监控 NameNode 状态并实现自动故障转移,通常需要配置奇数个节点
</description>
</property>
<property>
<name>fs.trash.interval</name>
<value>360</value>
<description>
指定被删除文件在回收站(.Trash)中的保留时间,默认值为 0 表示不启用回收站功能
当使用hadoop fs -rm 命令删除文件时,文件会被移动到当前目录的 .Trash 目录,超过此时间后才会被永久删除
</description>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
<description>
指定 Hadoop I/O 操作的缓冲区大小为 131072 字节(128KB),默认值是 4096 字节(4KB)
此参数影响 HDFS 读写数据时的缓冲区大小,合适的缓冲区大小可以提高 I/O 性能,通常设置为 64KB 或 128KB
</description>
</property>
</configuration>
hdfs-site.xml
bash
vi /usr/local/hadoop/etc/hadoop/hdfs-site.xml
xml
<configuration>
<property>
<name>dfs.nameservices</name>
<value>cluster1</value>
<description>
定义 HDFS 集群的命名服务名称
需与 core-site.xml 中 fs.defaultFS 配置的名称服务保持一致,用于标识整个 HDFS 集群
</description>
</property>
<property>
<name>dfs.ha.namenodes.cluster1</name>
<value>nn1,nn2</value>
<description>
指定高可用(HA)模式下的 NameNode 标识列表
nn1,nn2 表示集群中有两个 NameNode 节点,分别命名为 nn1 和 nn2
cluster1对应上面定义的命名服务名称,这里定义了该集群下所有 NameNode 的标识
</description>
</property>
<property>
<name>dfs.namenode.rpc-address.cluster1.nn1</name>
<value>indata-192-168-1-1.indata.com:8020</value>
<description>
指定 nn1 节点的 RPC 通信地址
RPC 用于 HDFS 客户端与 NameNode 之间的通信
</description>
</property>
<property>
<name>dfs.namenode.http-address.cluster1.nn1</name>
<value>indata-192-168-1-1.indata.com:50070</value>
<description>
指定 nn1 节点的 HTTP 访问地址
用于通过浏览器访问 NameNode 的管理界面
</description>
</property>
<property>
<name>dfs.namenode.rpc-address.cluster1.nn2</name>
<value>indata-192-168-1-2.indata.com:8020</value>
<description>
指定 nn2 节点的 RPC 通信地址
与 nn1 的 RPC 配置类似,是第二个 NameNode 的通信端口
</description>
</property>
<property>
<name>dfs.namenode.http-address.cluster1.nn2</name>
<value>indata-192-168-1-2.indata.com:50070</value>
<description>
指定 nn2 节点的 HTTP 访问地址
第二个 NameNode 的 Web 管理界面入口
</description>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://indata-192-168-1-1.indata.com:8485;indata-192-168-1-2.indata.com:8485;indata-192-168-1-3.indata.com:8485/cluster1</value>
<description>
指定 NameNode 共享编辑日志的存储位置(JournalNode 集群)
在 HA 模式下,主从 NameNode 通过 JournalNode 同步编辑日志,确保元数据一致性,默认端口 8485
</description>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/indata/disk_0/journalnode</value>
<description>
指定 JournalNode 存储编辑日志的本地目录
JournalNode 在本地磁盘上保存同步的编辑日志数据,需与 core-site.xml 保持一致
</description>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/indata/disk_0/namenode</value>
<description>
指定 NameNode 存储元数据(命名空间和操作日志)的本地目录
NameNode 的核心数据存储目录,通常建议配置在可靠性高的磁盘上
</description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/indata/disk_0/datanode,/indata/disk_1/datanode,/indata/disk_2/datanode,/indata/disk_3/datanode,/indata/disk_4/datanode,/indata/disk_5/datanode,/indata/disk_6/datanode,/indata/disk_7/datanode</value>
<description>
指定 DataNode 存储 HDFS 文件块的本地目录,多个磁盘路径,用逗号分隔
DataNode 会将数据块分布式存储在这些目录中,配置多个磁盘可以提高存储能力和 I/O 性能
</description>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
<description>
启用 NameNode 自动故障转移功能
当主 NameNode 故障时,系统会自动将从 NameNode 切换为主节点,提高集群可用性
</description>
</property>
<property>
<name>dfs.client.failover.proxy.provider.cluster1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
<description>
指定客户端用于故障转移的代理提供类
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider 为默认值
负责客户端在 NameNode 故障时的自动切换逻辑
</description>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
<description>
定义隔离机制(防止脑裂问题),多个机制用换行分割,即每个机制一行
sshfence和shell(/bin/true)表示两种隔离方式
sshfence:通过 SSH 登录到故障节点并杀死 NameNode 进程
shell(/bin/true):执行一个始终成功的 shell 命令(作为备用机制)
</description>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
<description>
指定sshfence机制使用的 SSH 私钥路径
用于实现 NameNode 节点间的 SSH 免密登录,确保隔离机制正常工作
</description>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
<description>
指定sshfence机制的 SSH 连接超时时间为 30s
如果 SSH 连接超过此时间未成功,会尝试下一种隔离机制
</description>
</property>
<property>
<name>dfs.blocksize</name>
<value>268435456</value>
<description>
指定 HDFS 文件的默认块大小为 256MB
HDFS 将大文件分割成固定大小的块存储,较大的块适合大文件存储和处理
</description>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
<description>
指定文件块的默认副本数为 3
副本数越多,数据可靠性越高,但会占用更多存储空间,默认值为 3
</description>
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>60</value>
<description>
指定 NameNode 处理 RPC 请求的线程数
增加线程数可以提高 NameNode 处理并发请求的能力,通常根据集群规模调整
</description>
</property>
<property>
<name>dfs.datanode.handler.count</name>
<value>20</value>
<description>
指定 DataNode 处理 RPC 请求的线程数
优化 DataNode 的请求处理能力,避免成为性能瓶颈
</description>
</property>
<property>
<name>dfs.datanode.max.transfer.threads</name>
<value>8192</value>
<description>
指定 DataNode 处理数据传输的最大线程数
影响 DataNode 同时处理的读写请求数量,较大的值适合高并发场景
</description>
</property>
<property>
<name>dfs.namenode.avoid.read.stale.datanode</name>
<value>true</value>
<description>
控制是否避免从 "陈旧" 的 DataNode 读取数据,true 表示读取时会避开陈旧的 DataNode
"陈旧" 的 DataNode 指长时间未与 NameNode 通信的节点,避免从这些节点读取可提高数据一致性
</description>
</property>
<property>
<name>dfs.namenode.avoid.write.stale.datanode</name>
<value>true</value>
<description>
控制是否避免向 "陈旧" 的 DataNode 写入数据,true 表示写入时会避开陈旧的 DataNode
确保新数据写入状态正常的 DataNode,提高数据可靠性
</description>
</property>
</configuration>
mapred-site.xml
bash
vi /usr/local/hadoop/etc/hadoop/mapred-site.xml
xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description>
指定 MapReduce 所使用的运行框架为 YARN
这是 MapReduce 与 YARN 集成的核心配置,使 MapReduce 能够利用 YARN 的资源管理和调度能力
</description>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>0.0.0.0:10020</value>
<description>
配置 MapReduce JobHistory Server 的 RPC 地址 ,默认端口10020
JobHistory Server 用于记录和管理已完成的 MapReduce 作业历史信息,供后续查询和分析
</description>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>0.0.0.0:19888</value>
<description>
配置 MapReduce JobHistory Server 的 Web 访问地址, 默认端口19888
通过浏览器访问该地址可以查看作业历史的 Web 界面,包括作业详情、统计信息等
</description>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
<description>
设置 MapReduce Application Master(应用主控)的环境变量
告诉 Application Master 在哪里找到 MapReduce 的相关资源和配置
</description>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
<description>
设置 Map 任务的环境变量,同样指定HADOOP_MAPRED_HOME环境变量
确保 Map 任务进程能正确找到 MapReduce 的安装路径
</description>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
<description>
设置 Reduce 任务的环境变量,与 Map 任务配置一致,指定HADOOP_MAPRED_HOME
确保 Reduce 任务进程能正确找到 MapReduce 的安装路径
</description>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>4096</value>
<description>
指定每个 Map 任务可使用的最大内存为 4GB(单位:MB)
这是 YARN 为 Map 任务分配的内存上限,超过此值可能会被 YARN 杀死
</description>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>4096</value>
<description>
指定每个 Reduce 任务可使用的最大内存为 4GB((单位:MB)
与 Map 任务内存配置类似,用于控制 Reduce 任务的内存资源
</description>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx2048m</value>
<description>
指定 Reduce 任务的 JVM 参数,-Xmx2048m表示 Reduce 任务的 JVM 最大堆内存为 2GB
通常应小于mapreduce.reduce.memory.mb的值,留出部分内存给操作系统和其他进程
</description>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx2048m</value>
<description>
指定 Map 任务的 JVM 参数,-Xmx2048表示 Map 任务的 JVM 最大堆内存为 2GB
同样应小于mapreduce.map.memory.mb的配置值
</description>
</property>
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx2048M</value>
<description>
指定 Map 和 Reduce 子进程的 JVM 参数(兼容旧版本配置)
在新版本中通常会被mapreduce.map.java.opts和mapreduce.reduce.java.opts替代,但保留用于兼容性
</description>
</property>
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>4096</value>
<description>
指定 MapReduce Application Master 可使用的内存(单位:MB)
Application Master 负责协调 MapReduce 作业的执行,需要一定的内存资源
</description>
</property>
<property>
<name>yarn.app.mapreduce.am.command-opts</name>
<value>-Xmx3276m</value>
<description>
Application Master 的 JVM 参数
通常设置为 yarn.app.mapreduce.am.resource.mb 值的 70%~80% ,确保有足够内存运行
</description>
</property>
</configuration>
yarn-site.xml
bash
vi /usr/local/hadoop/etc/hadoop/yarn-site.xml
xml
<configuration>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
<description>
启用 YARN ResourceManager(RM)的高可用(HA)模式
让 YARN 集群支持多个 RM 实例,避免单个 RM 故障导致整个集群无法提交 / 管理任务,保障资源管理服务的高可用性
</description>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>rm-cluster</value>
<description>
指定 RM 高可用集群的全局标识符
用于区分不同的 YARN 高可用集群,多集群场景或故障转移时,ZooKeeper 等组件通过此 ID 识别集群
</description>
</property>
<property>
<description>
定义当前高可用 RM 集群中,各个 RM 实例的逻辑标识符
rm1,rm2 表示集群包含两个 RM 实例,标识为rm1和rm2
后续配置不同 RM 的主机、端口等信息时,通过这些标识关联
</description>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>indata-192-168-1-1.indata.com</value>
<description>
指定rm1标识对应的 RM 实例的主机名
让集群知道rm1逻辑标识对应的实际物理节点,用于客户端连接、故障转移等
</description>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>indata-192-168-1-2.indata.com</value>
<description>
指定rm2标识对应的 RM 实例的主机名
与rm1配置逻辑一致,关联第二个 RM 实例的物理节点
</description>
</property>
<property>
<name>yarn.resourcemanager.ha.automatic-failover.recover.enabled</name>
<value>true</value>
<description>
启用 RM 故障时的自动故障转移与恢复功能
当 Active RM 故障时,集群自动将 Standby RM 切换为 Active,无需人工干预,保障服务连续性
</description>
</property>
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
<description>
启用 RM 的状态恢复功能
RM 重启或故障转移时,可从持久化存储(如 ZooKeeper、HDFS)中恢复之前的集群状态(任务、队列等信息 ),避免数据丢失
</description>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>indata-192-168-1-1.indata.com:8088</value>
<description>
指定rm1实例的 Web UI 访问地址
通过浏览器访问此地址,可查看rm1的 YARN Web 控制台(任务状态、资源使用等 )
</description>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>indata-192-168-1-2.indata.com:8088</value>
<description>
指定rm2实例的 Web UI 访问地址
与rm1 Web 地址配置逻辑一致,用于访问第二个 RM 实例的 Web 控制台
</description>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>indata-192-168-1-1.indata.com:2181,indata-192-168-1-2.indata.com:2181,indata-192-168-1-3.indata.com:2181</value>
<description>
指定 ZooKeeper 集群地址,用于 RM 高可用的状态存储与协调
RM 高可用依赖 ZooKeeper 实现 Active/Standby 选举、状态持久化,此参数指定 ZooKeeper 集群位置
</description>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
<description>
配置 NodeManager(NM)支持的辅助服务
MapReduce 任务需要 Shuffle 服务传输中间数据,NM 必须配置此服务才能运行 MapReduce 作业
可以同时配置两个:mapreduce_shuffle,spark_shuffle
</description>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
<description>
指定mapreduce_shuffle辅助服务的实现类
org.apache.hadoop.mapred.ShuffleHandler 是 Hadoop 内置的 Shuffle 服务处理类
告诉 NM 如何处理 MapReduce 的 Shuffle 逻辑,必须与 yarn.nodemanager.aux-services 配合使用
</description>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
<description>
启用 YARN 任务日志聚合功能
任务运行完成后,NM 将分散的容器日志(stdout、stderr 等 )上传到 HDFS 集中存储,方便统一查询
</description>
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/app-logs</value>
<description>
指定日志聚合后,日志在 HDFS 上的根目录
所有应用的聚合日志会存储在此目录下,通常配合 yarn.nodemanager.remote-app-log-dir-suffix 细化路径
</description>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>409600</value>
<description>
设置 NodeManager 可管理的总内存(单位:MB )为 400GB
YARN 根据此值限制 NM 上运行的容器总内存,避免节点内存耗尽
</description>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>100</value>
<description>
NodeManager 可管理的虚拟 CPU 核心数为 100
用于 YARN 的 CPU 资源调度,限制容器使用的 CPU 总量
</description>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>102400</value>
<description>
设置 YARN 调度器允许单个容器申请的最大内存(单位:MB )为 100GB
防止单个容器占用过多资源,导致其他任务无法运行
</description>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
<description>
控制是否开启虚拟内存(VMEM)检查
若开启,YARN 会根据容器物理内存(PMEM)和vmem-pmem-ratio限制虚拟内存使用,关闭则不做虚拟内存校验
</description>
</property>
<!--
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>8192</value>
<description>
设置 YARN 调度器为容器(Container)分配内存时的最小单位
调度器(如 Capacity Scheduler、Fair Scheduler )分配内存时,会以该值为 "最小粒度"。若应用申请内存小于此值,YARN 也会按 8192MB 分配;
若大于,则按调度规则向上调整(需同时满足 yarn.scheduler.maximum-allocation-mb 限制 )。用于避免容器申请过小内存导致资源碎片化,或根据集群任务需求统一内存分配下限 。
</description>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
<description>
设置 NodeManager 中虚拟内存(Virtual Memory,VMEM )与物理内存(Physical Memory,PMEM )的比例
2.1 表示虚拟内存允许为物理内存的 2.1 倍
当 YARN 开启虚拟内存检查(yarn.nodemanager.vmem-check-enabled=true )时,NodeManager 会依据此比例限制容器可用虚拟内存。
若容器使用虚拟内存超过 "物理内存 × 此比例",NM 会杀死该容器。用于防止容器因虚拟内存过度使用拖垮节点,需结合应用内存特性(如 JVM 堆外内存、进程内存开销 )调整 。
</description>
</property>
-->
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/indata/disk_0/nodemanager</value>
<description>
指定 NodeManager 本地存储容器日志的目录
任务运行时,容器日志先存于此目录,开启聚合后会上传到 HDFS
</description>
</property>
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/indata/disk_0/nodemanager</value>
<description>
指定 NodeManager 存储容器临时文件(如中间数据、共享库 )的本地目录
容器运行时产生的临时数据会存放在这里,多磁盘配置可提升 I/O 性能
</description>
</property>
<!--
<property>
<name>yarn.nodemanager.aux-services</name>
<value>spark_shuffle</value>
<description>
配置 NodeManager(NM)需要启动的辅助服务列表
YARN 的 NodeManager 除了核心资源管理功能外,还可以通过该参数配置额外的辅助服务,以支持特定计算框架的需求。
spark_shuffle 是 Spark 框架为优化 Shuffle 过程(数据混洗)而设计的服务,它运行在 NodeManager 上,负责在 YARN 集群中高效传输 Spark 任务的中间数据,减少网络开销并提升 Shuffle 性能。
若要在 YARN 上运行 Spark 任务并启用外部 Shuffle 服务,必须配置此参数,并配合 yarn.nodemanager.aux-services.spark_shuffle.class 指定服务实现类。
</description>
</property>
-->
<property>
<name>yarn.nodemanager.aux-services.spark_shuffle.class</name>
<value>org.apache.spark.network.yarn.YarnShuffleService</value>
<description>
指定spark_shuffle辅助服务的实现类(若启用 Spark Shuffle 服务 )
org.apache.spark.network.yarn.YarnShuffleService 是 Spark Shuffle 服务的处理类
用于在 YARN 上运行 Spark 任务时,优化 Shuffle 阶段的数据传输,需配合 Spark 环境使用
</description>
</property>
<property>
<name>yarn.nodemanager.aux-services.spark_shuffle.classpath</name>
<value>/opt/spark2/yarn/*</value>
<description>
指定spark_shuffle服务依赖的类路径
/opt/spark2/yarn/* 是 Spark 相关依赖的本地路径
告诉 NM 去哪里加载 Spark Shuffle 服务的类文件,确保服务能正常启动
</description>
</property>
<!--
<property>
<name>yarn.nodemanager.delete.debug-delay-sec</name>
<value>86400</value>
<description>
设置 NodeManager 在容器(Container)结束后,延迟删除其本地日志和临时文件的时间(单位:秒),默认 0 即不保留
86400 表示延迟 86400 秒(即 24 小时)后删除容器的本地数据
容器运行结束后,NodeManager 通常会立即清理其产生的本地日志、临时文件等数据,以释放磁盘空间。
但在调试场景下(如任务失败后需要分析日志),可通过此参数设置延迟删除时间,确保有足够时间获取容器的本地数据进行问题排查。
该值设置为 86400 秒(24 小时),意味着容器结束后,其本地日志和临时文件会保留 1 天,便于开发或运维人员在任务失败后分析具体原因。
生产环境中若无需长期保留调试数据,可适当减小此值以避免磁盘空间占用过多。
</description>
</property>
-->
<property>
<name>yarn.log.server.url</name>
<value>http://indata-192-168-1-3.indata.com:19888/jobhistory/logs</value>
<description>
指定 YARN 日志服务器的访问地址(通常关联 JobHistory Server )
用户可通过此地址查询聚合后的任务日志,需与日志聚合、JobHistory Server 配合
</description>
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir-suffix</name>
<value>logs</value>
<description>
指定聚合日志在 HDFS 上的路径后缀
细化日志存储路径,方便分类管理(如 /app-logs/logs )
</description>
</property>
<property>
<name>yarn.resourcemanager.bind-host</name>
<value>0.0.0.0</value>
<description>
指定 ResourceManager 绑定的网络地址,0.0.0.0 表示绑定所有可用网络接口
让 RM 监听所有网卡的请求,确保客户端、NM 能从任意网络访问
</description>
</property>
<property>
<name>yarn.log-aggregation.TFile.remote-app-log-dir-suffix</name>
<value>logs</value>
<description>
日志相关的参数可以参考我之前写的 Yarn Application 日志总结
</description>
</property>
<property>
<name>yarn.nodemanager.address</name>
<value>0.0.0.0:45454</value>
<description>
Ephemeral ports (port 0, which is default) cannot be used for the NodeManager's RPC server specified via yarn.nodemanager.address as it can make NM use different ports before and after a restart.
This will break any previously running clients that were communicating with the NM before restart.
Explicitly setting yarn.nodemanager.address to an address with specific port number (for e.g 0.0.0.0:45454) is a precondition for enabling NM restart.
临时端口(默认端口0)不能用于通过yarn.nodemanager.address指定的NodeManager的RPC服务器,因为这会导致NM在重启前后使用不同的端口。
这将中断重启前与NM通信的任何正在运行的客户端。将yarn.nodemanager.address显式设置为具有特定端口号(例如0.0.0.0:45454)的地址是启用NM重启的先决条件。
指定 NodeManager 的 RPC 服务地址(用于与 RM、客户端通信 ),0.0.0.0:45454 表示绑定所有网络接口,端口为 45454
NM 通过此地址提供 RPC 服务,需固定端口(而非临时端口)以支持 NM 重启后客户端仍能连接,避免端口变化导致通信中断
</description>
</property>
</configuration>
workers
旧版本这个文件为 slaves
bash
vi /usr/local/hadoop/etc/hadoop/workers
bash
indata-192-168-1-1.indata.com
indata-192-168-1-2.indata.com
indata-192-168-1-3.indata.com
复制 Hadoop 和系统环境变量到其他节点
bash
scp -r /usr/local/hadoop-3.4.1/ 192.168.1.2:/usr/local/
scp -r /usr/local/hadoop-3.4.1/ 192.168.1.3:/usr/local/
scp /etc/profile.d/hadoop.sh 192.168.1.2:/etc/profile.d/
scp /etc/profile.d/hadoop.sh 192.168.1.3:/etc/profile.d/
创建软链接并使环境变量生效
在其他每个节点上都创建软链接
bash
ln -s /usr/local/hadoop-3.4.1 /usr/local/hadoop
source /etc/profile.d/hadoop.sh
# 如果其他节点没有创建日志目录,记得创建一下
mkdir -p /var/log/hadoop/hdfs
启动 Hadoop 集群
第一次启动集群
因为第一次启动集群涉及格式化 NameNode 、初始化 ZooKeeper 中用于 HDFS HA 的状态存储、启动第一个 Active NameNode 、从Active NameNode 复制必要的元数据(fsimage)到Standby 节点、启动第二个 Standby NameNode,所以对于启动命令有顺序要求:
(确保每一步都执行成功,再执行后面的步骤)
1. 在每台journalnode节点执行
bash
# 启动 JournalNode 守护进程
# JournalNode 是 HDFS HA 架构中的关键组件,用于在 Active 和 Standby NameNode 之间同步编辑日志(EditLog),确保数据一致性
hdfs --daemon start journalnode
2. 在第一个 namenode 节点执行
bash
# 格式化 NameNode,这会初始化 HDFS 文件系统的元数据存储目录,创建初始的文件系统结构
# 注意:只需要在集群首次部署时执行一次,重复执行会清除已有数据
hdfs namenode -format
# 初始化 ZooKeeper 中用于 HDFS HA 的状态存储
# ZKFC(ZooKeeper Failover Controller)是用于自动故障转移的组件
# 该命令会在 ZooKeeper 中创建必要的 znode 节点,用于存储 NameNode 的状态信息
hdfs zkfc -formatZK
# 启动 NameNode 守护进程
# 启动后,该 NameNode 会作为 Active NameNode 运行(在没有其他 NameNode 的情况下)
hdfs --daemon start namenode
3. 在第二个 namenode 节点执行
bash
# 将第二个 NameNode 配置为 Standby 模式
# 该命令会从 Active NameNode 复制必要的元数据(fsimage)到当前节点,确保 Standby 节点与 Active 节点的数据一致性
hdfs namenode -bootstrapStandby
# 启动第二个 NameNode 守护进程
# 由于之前执行了 bootstrapStandby,这个 NameNode 会以 Standby 模式启动,等待接管 Active 角色(当 Active 节点故障时)
hdfs --daemon start namenode
4. 启动其他服务
在任意节点执行即可:
bash
# 启动 HDFS
start-dfs.sh
# 启动 YARN
start-yarn.sh
# 停止HDFS
stop-dfs.sh
# 停止YARN
stop-yarn.sh
# 或者启动所有
start-all.sh
stop-all.sh
非第一次启动集群
第一次启动集群成功后,后面再启停集群,只需要在任意节点执行第一次启动集群的第4步即可:
bash
# 启动 HDFS
start-dfs.sh
# 启动 YARN
start-yarn.sh
# 停止HDFS
stop-dfs.sh
# 停止YARN
stop-yarn.sh
# 或者启动所有
start-all.sh
stop-all.sh
启动 MapReduce JobHistory Server
JobHistoryServer 需要单独启动,具体作用可以参考我之前写的Yarn Application 日志总结
bash
mapred --daemon start historyserver
优化启动脚本
stop-dfs.sh 和 stop-all.sh 会停止 JournalNode ,因为启动 NameNode 时会去连接 JournalNode ,但是 start-dfs.sh 和 start-all.sh 的启动顺序为 NameNode 、 DataNode 、 JournalNode , JournalNode 是在 NameNode 之后启动的,所以经常会出现只有一个 NameNode 启动成功,另外一个 NameNode 因为连接不上 JournalNode 而失败的情况,可以通过修改 start-dfs.sh 中的启动顺序,将 JournalNode 的启动脚本放在 NameNode 之前, 再加上 sleep 5 :
bash
#---------------------------------------------------------
# quorumjournal nodes (if any)
JOURNAL_NODES=$("${HADOOP_HDFS_HOME}/bin/hdfs" getconf -journalNodes 2>&-)
if [[ "${#JOURNAL_NODES}" != 0 ]]; then
echo "Starting journal nodes [${JOURNAL_NODES}]"
hadoop_uservar_su hdfs journalnode "${HADOOP_HDFS_HOME}/bin/hdfs" \
--workers \
--config "${HADOOP_CONF_DIR}" \
--hostnames "${JOURNAL_NODES}" \
--daemon start \
journalnode
(( HADOOP_JUMBO_RETCOUNTER=HADOOP_JUMBO_RETCOUNTER + $? ))
fi
# 这里的暂停 5s 可以根据具体情况调整
sleep 5
将上面启动 JournalNode 相关的脚本移动到 namenodes 前面,再加上 sleep 5 即可 。
hadoop.tmp.dir
启动集群后,会发现 HDFS 路径上会有一个目录:/indata/disk_0/hadoop/tmp
bash
hadoop fs -ls -R /indata/disk_0/hadoop/tmp
drwxr-xr-x - root supergroup 0 2025-09-19 09:21 /indata/disk_0/hadoop/tmp/yarn
drwxr-xr-x - root supergroup 0 2025-09-19 09:21 /indata/disk_0/hadoop/tmp/yarn/system
drwxr-xr-x - root supergroup 0 2025-09-19 09:21 /indata/disk_0/hadoop/tmp/yarn/system/rmstore
drwxr-xr-x - root supergroup 0 2025-09-19 09:21 /indata/disk_0/hadoop/tmp/yarn/system/rmstore/FSRMStateRoot
drwxr-xr-x - root supergroup 0 2025-09-19 09:21 /indata/disk_0/hadoop/tmp/yarn/system/rmstore/FSRMStateRoot/AMRMTokenSecretManagerRoot
-rw-r--r-- 3 root supergroup 23 2025-09-19 09:21 /indata/disk_0/hadoop/tmp/yarn/system/rmstore/FSRMStateRoot/AMRMTokenSecretManagerRoot/AMRMTokenSecretManagerNode
-rw-r--r-- 3 root supergroup 2 2025-09-19 09:21 /indata/disk_0/hadoop/tmp/yarn/system/rmstore/FSRMStateRoot/EpochNode
drwxr-xr-x - root supergroup 0 2025-09-19 09:22 /indata/disk_0/hadoop/tmp/yarn/system/rmstore/FSRMStateRoot/ProxyCARoot
-rw-r--r-- 3 root supergroup 772 2025-09-19 09:22 /indata/disk_0/hadoop/tmp/yarn/system/rmstore/FSRMStateRoot/ProxyCARoot/caCert
-rw-r--r-- 3 root supergroup 1217 2025-09-19 09:22 /indata/disk_0/hadoop/tmp/yarn/system/rmstore/FSRMStateRoot/ProxyCARoot/caPrivateKey
drwxr-xr-x - root supergroup 0 2025-09-19 09:21 /indata/disk_0/hadoop/tmp/yarn/system/rmstore/FSRMStateRoot/RMAppRoot
drwxr-xr-x - root supergroup 0 2025-09-19 09:21 /indata/disk_0/hadoop/tmp/yarn/system/rmstore/FSRMStateRoot/RMDTSecretManagerRoot
-rw-r--r-- 3 root supergroup 17 2025-09-19 09:21 /indata/disk_0/hadoop/tmp/yarn/system/rmstore/FSRMStateRoot/RMDTSecretManagerRoot/DelegationKey_1
-rw-r--r-- 3 root supergroup 17 2025-09-19 09:21 /indata/disk_0/hadoop/tmp/yarn/system/rmstore/FSRMStateRoot/RMDTSecretManagerRoot/DelegationKey_2
-rw-r--r-- 3 root supergroup 4 2025-09-19 09:21 /indata/disk_0/hadoop/tmp/yarn/system/rmstore/FSRMStateRoot/RMVersionNode
drwxr-xr-x - root supergroup 0 2025-09-19 09:21 /indata/disk_0/hadoop/tmp/yarn/system/rmstore/FSRMStateRoot/ReservationSystemRoot
/indata/disk_0/hadoop/tmp 是 hadoop.tmp.dir 对应的值,但是该配置应该对应的本地目录,而不是 HDFS 目录,最开始怀疑自己配置错误,后来搜索源码发现了原因:
- hdfs-default.xml : 该配置文件中很多配置比如 dfs.datanode.data.dir 对应的值为 file://${hadoop.tmp.dir}/dfs/data ,该配置文件中只要用到了 hadoop.tmp.dir 都加了 file:// 前缀
- yarn-default.xml :该配置文件中很多配置比如 yarn.resourcemanager.leveldb-state-store.path 和 yarn.resourcemanager.fs.state-store.uri 对应的值均为 ${hadoop.tmp.dir}/yarn/system/rmstore ,也就是都没有加 file:// 前缀
- 加了 file:// 前缀的对应本地目录,没加的对应的 HDFS 目录,不知道不一致的原因是 bug 还是啥~
问题解决
如果有遇到启动失败的情况,可以通过查看分析对应的日志解决。
清空数据脚本
有时在自己的测试环境会有修改Hadoop版本重新部署或者安装部署失败需要重新格式化的需求,这时需要先停止所有服务,然后清空所有的数据:
** 停止所有服务 **
有时可能会遇到有残留服务进程没有停止的情况,可以通过 ps 命令再确认一遍还有没有相关的 Hadoop 进程残留
bash
stop-all.sh
通过clush并行的在每个节点执行下面的清理命令
bash
sudo rm -r /indata/disk_*/datanode
sudo rm -r /indata/disk_*/journalnode
sudo rm -r /indata/disk_*/namenode
sudo rm -r /indata/disk_*/nodemanager
sudo rm -r /var/log/hadoop/hdfs/*