Hadoop 集群部署与优化:HDFS 高可用配置与 YARN 资源调度
·
Hadoop 集群部署与优化:HDFS 高可用配置与 YARN 资源调度
Hadoop 是一个分布式计算框架,核心组件包括 HDFS(分布式文件系统)和 YARN(资源管理器)。在实际部署中,确保 HDFS 高可用性和优化 YARN 资源调度至关重要,以提高集群的稳定性和性能。以下内容基于 Hadoop 3.x 版本,分步讲解部署、配置和优化。部署前需准备多台服务器(如 3 台以上),并确保网络互通和 Java 环境就绪。
1. Hadoop 集群基础部署
在部署 Hadoop 集群前,需规划节点角色:
- NameNode (NN):管理 HDFS 元数据(主节点)。
- DataNode (DN):存储数据块(工作节点)。
- ResourceManager (RM):管理 YARN 资源(主节点)。
- NodeManager (NM):执行任务(工作节点)。
- JournalNode (JN):用于 HDFS 高可用(可选,但推荐)。
- ZooKeeper (ZK):协调高可用状态(可选,但推荐)。
部署步骤:
- 安装 Hadoop:在所有节点下载并解压 Hadoop 包,配置环境变量(如
HADOOP_HOME)。 - 配置核心文件:编辑
etc/hadoop/core-site.xml,设置 HDFS 地址:<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> <!-- 集群逻辑名称 --> </property> </configuration> - 配置 HDFS 文件:编辑
etc/hadoop/hdfs-site.xml,定义数据存储路径和副本因子:<property> <name>dfs.replication</name> <value>3</value> <!-- 默认副本数,优化时可根据需求调整 --> </property> - 配置 YARN 文件:编辑
etc/hadoop/yarn-site.xml,启用资源管理:<property> <name>yarn.resourcemanager.hostname</name> <value>rm-node</value> <!-- 指定 ResourceManager 主机 --> </property> - 启动集群:格式化 HDFS(仅首次),启动服务:
hdfs namenode -format # 格式化 NameNode start-dfs.sh # 启动 HDFS start-yarn.sh # 启动 YARN
2. HDFS 高可用配置
HDFS 高可用(HA)通过冗余 NameNode 避免单点故障。使用 Quorum Journal Manager (QJM) 和 ZooKeeper 实现,确保 Active 和 Standby NameNode 自动切换。
配置步骤:
- 部署 ZooKeeper 集群:在 3 台节点安装 ZooKeeper,配置
zoo.cfg并启动服务。 - 配置 HDFS HA:编辑
etc/hadoop/hdfs-site.xml,添加以下属性:<property> <name>dfs.nameservices</name> <value>mycluster</value> <!-- 集群逻辑名称 --> </property> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> <!-- 定义两个 NameNode --> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>namenode1:8020</value> <!-- NN1 地址 --> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>namenode2:8020</value> <!-- NN2 地址 --> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://journalnode1:8485;journalnode2:8485;journalnode3:8485/mycluster</value> <!-- JournalNodes 地址 --> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> <!-- 启用自动故障转移 --> </property> - 配置 ZooKeeper 集成:在
etc/hadoop/hdfs-site.xml中添加:<property> <name>dfs.ha.fencing.methods</name> <value>shell(/path/to/fence.sh)</value> <!-- 故障隔离脚本 --> </property> - 初始化 HA:在 Active NameNode 上执行:
hdfs zkfc -formatZK # 格式化 ZooKeeper 数据 hdfs --daemon start journalnode # 启动所有 JournalNode hdfs namenode -initializeSharedEdits # 初始化共享编辑日志 - 启动和验证:启动所有服务,使用
hdfs haadmin -getServiceState nn1检查状态。故障时,Standby 自动切换为 Active。
优化提示:
- JournalNode 数量:至少 3 个以确保仲裁,避免脑裂问题。
- 网络延迟:确保 JournalNodes 和 NameNodes 间低延迟,否则影响写入性能。
- 监控:使用工具如 Ambari 或 Prometheus 监控 HA 状态。
3. YARN 资源调度优化
YARN 负责集群资源分配,通过调度器管理任务。常用调度器包括 Capacity Scheduler(适合多租户)和 Fair Scheduler(适合公平共享)。优化调度可提升资源利用率。
配置步骤:
- 选择调度器:编辑
etc/hadoop/yarn-site.xml,设置调度器类型:<property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value> <!-- 使用 Capacity Scheduler --> </property> - 配置 Capacity Scheduler:编辑
etc/hadoop/capacity-scheduler.xml,定义队列资源:<property> <name>yarn.scheduler.capacity.root.queues</name> <value>prod,dev</value> <!-- 定义根队列 --> </property> <property> <name>yarn.scheduler.capacity.root.prod.capacity</name> <value>70</value> <!-- prod 队列占 70% 资源 --> </property> <property> <name>yarn.scheduler.capacity.root.dev.capacity</name> <value>30</value> <!-- dev 队列占 30% 资源 --> </property> - 优化资源参数:在
yarn-site.xml中调整内存和 CPU:<property> <name>yarn.nodemanager.resource.memory-mb</name> <value>8192</value> <!-- 每个 NodeManager 可用内存(MB),根据服务器 RAM 设置 --> </property> <property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>1024</value> <!-- 最小任务内存分配,避免碎片 --> </property> - 启用 Fair Scheduler(可选):如果选择 Fair Scheduler,配置
etc/hadoop/fair-scheduler.xml:<allocations> <queue name="prod"> <minResources>4096 mb, 2 vcores</minResources> <!-- 最小资源保障 --> </queue> </allocations>
优化建议:
- 资源分配公式:任务资源需求应匹配节点容量。例如,设节点总内存为 $M$ MB,则最大任务数约为 $\frac{M}{\text{minAllocation}}$。这有助于避免资源争用。
- 动态调整:使用 YARN 的 ResourceManager REST API 监控队列负载,动态调整容量。
- 性能调优:
- 增加容器大小以减少开销,如设置
yarn.scheduler.maximum-allocation-mb为节点内存的 80%。 - 启用节点标签(Node Labels)隔离关键任务。
- 增加容器大小以减少开销,如设置
- 监控工具:结合 Grafana 和 YARN Metrics 可视化资源使用率,目标是将集群利用率保持在 70% 以上。
4. 整体集群优化建议
- 硬件层面:使用 SSD 提升 HDFS I/O 性能;确保网络带宽充足。
- HDFS 优化:
- 调整副本因子:在高写入场景,设
dfs.replication=2以节省空间;在可靠性要求高时,保持为 3。 - 启用 Erasure Coding:减少存储开销,编辑
hdfs ec -setPolicy。
- 调整副本因子:在高写入场景,设
- YARN 优化:
- 压缩中间数据:在 MapReduce 中设置
mapreduce.map.output.compress=true。 - 预防资源泄漏:配置
yarn.nodemanager.resource.percentage-physical-cpu-limit限制 CPU 使用。
- 压缩中间数据:在 MapReduce 中设置
- 安全与监控:集成 Kerberos 认证;使用 Cloudera Manager 或开源工具如 ELK 堆栈进行日志分析。
部署后,通过基准测试(如 TestDFSIO 或 TeraSort)验证性能。例如,运行 HDFS 写入测试:
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-*-tests.jar TestDFSIO -write -nrFiles 10 -fileSize 1GB
优化后,集群应实现高可用(HDFS 故障恢复时间 < 30 秒)和高效资源利用率(YARN 队列延迟 < 100ms)。定期审查配置并根据负载调整参数。
更多推荐

所有评论(0)