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):协调高可用状态(可选,但推荐)。

部署步骤:

  1. 安装 Hadoop:在所有节点下载并解压 Hadoop 包,配置环境变量(如 HADOOP_HOME)。
  2. 配置核心文件:编辑 etc/hadoop/core-site.xml,设置 HDFS 地址:
    <configuration>
      <property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value> <!-- 集群逻辑名称 -->
      </property>
    </configuration>
    

  3. 配置 HDFS 文件:编辑 etc/hadoop/hdfs-site.xml,定义数据存储路径和副本因子:
    <property>
      <name>dfs.replication</name>
      <value>3</value> <!-- 默认副本数,优化时可根据需求调整 -->
    </property>
    

  4. 配置 YARN 文件:编辑 etc/hadoop/yarn-site.xml,启用资源管理:
    <property>
      <name>yarn.resourcemanager.hostname</name>
      <value>rm-node</value> <!-- 指定 ResourceManager 主机 -->
    </property>
    

  5. 启动集群:格式化 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 自动切换。

配置步骤:

  1. 部署 ZooKeeper 集群:在 3 台节点安装 ZooKeeper,配置 zoo.cfg 并启动服务。
  2. 配置 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>
    

  3. 配置 ZooKeeper 集成:在 etc/hadoop/hdfs-site.xml 中添加:
    <property>
      <name>dfs.ha.fencing.methods</name>
      <value>shell(/path/to/fence.sh)</value> <!-- 故障隔离脚本 -->
    </property>
    

  4. 初始化 HA:在 Active NameNode 上执行:
    hdfs zkfc -formatZK  # 格式化 ZooKeeper 数据
    hdfs --daemon start journalnode  # 启动所有 JournalNode
    hdfs namenode -initializeSharedEdits  # 初始化共享编辑日志
    

  5. 启动和验证:启动所有服务,使用 hdfs haadmin -getServiceState nn1 检查状态。故障时,Standby 自动切换为 Active。

优化提示

  • JournalNode 数量:至少 3 个以确保仲裁,避免脑裂问题。
  • 网络延迟:确保 JournalNodes 和 NameNodes 间低延迟,否则影响写入性能。
  • 监控:使用工具如 Ambari 或 Prometheus 监控 HA 状态。
3. YARN 资源调度优化

YARN 负责集群资源分配,通过调度器管理任务。常用调度器包括 Capacity Scheduler(适合多租户)和 Fair Scheduler(适合公平共享)。优化调度可提升资源利用率。

配置步骤:

  1. 选择调度器:编辑 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>
    

  2. 配置 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>
    

  3. 优化资源参数:在 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>
    

  4. 启用 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 使用。
  • 安全与监控:集成 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)。定期审查配置并根据负载调整参数。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐