基于本文回答
0
评论

集群中的DataNode节点可以动态扩容和缩容具体需要如何操作?

知识点图片

在Hadoop集群中,HDFS(Hadoop Distributed File System)原生支持动态扩容(添加节点)和动态缩容(退役节点),整个过程不需要重启集群,不会影响线上业务。

以下是具体的完整操作步骤:


一、 动态扩容(添加 DataNode)

扩容的核心思想是:准备好新节点的环境,在新节点上启动 DataNode 服务,并让 NameNode 识别它,最后进行数据均衡。

1. 基础环境准备(在新节点上操作)

  • 系统设置:配置主机名(hostname)、修改 /etc/hosts(确保与集群其他节点互相解析)、关闭防火墙/SELinux。
  • SSH免密登录:配置 NameNode 到新节点的 SSH 免密登录。
  • Java环境:安装与集群版本一致的 JDK。
  • Hadoop环境:将现有集群的 Hadoop 安装包及配置文件(core-site.xml, hdfs-site.xml, yarn-site.xml 等)分发到新节点的相同路径下。

2. 更新集群配置(在 NameNode 上操作)

  • 编辑 workers 文件(Hadoop 2.x 中叫 slaves),添加新节点的主机名。(注:这一步主要是为了后续使用群起脚本 start-dfs.sh 时能包含该节点,对当前动态扩容非强制,但建议保持同步)
  • 白名单配置(可选但推荐):如果你在 hdfs-site.xml 中配置了 dfs.hosts(白名单),需要将新节点加入该白名单文件中,然后执行 hdfs dfsadmin -refreshNodes

3. 启动新节点服务(在新节点上操作)

在新节点上手动启动 DataNode(如果用到了 YARN,一并启动 NodeManager):

bash
# Hadoop 3.x 命令
hdfs --daemon start datanode
yarn --daemon start nodemanager

# Hadoop 2.x 命令
hadoop-daemon.sh start datanode
yarn-daemon.sh start nodemanager

4. 验证是否加入成功

在 NameNode 上执行以下命令,或者查看 HDFS Web UI(默认 http://namenode:9870):

bash
hdfs dfsadmin -report

如果能看到新节点且状态为 Normal,说明扩容成功。

5. 集群数据均衡(非常重要)

新节点刚加入时是空的,为了充分利用空间并提高并行读写性能,需要进行数据负载均衡。在任意节点执行:

bash
# 启动 Balancer,-threshold 10 表示各节点磁盘使用率偏差不超过 10%
hdfs balancer -threshold 10

(注意:Balancer 过程较慢且消耗网络带宽,建议在业务低峰期运行)


二、 动态缩容(退役 DataNode)

警告千万不要直接 kill 掉 DataNode 进程或直接关机! 这样会导致数据块丢失(如果副本数不足)或引发大量的块复制风暴。必须使用优雅退役(Decommission)机制。

退役的核心思想是:告诉 NameNode 准备下线某节点,NameNode 会自动将该节点上的数据块复制到其他健康节点上,等数据转移完毕后,再安全关闭该节点。

1. 配置黑名单(在 NameNode 上操作)

确保你的 hdfs-site.xml 中配置了黑名单属性(如果没有,需要添加并重启 NameNode 才能生效,通常建集群时应提前配好):

xml
<property>
    <name>dfs.hosts.exclude</name>
    <value>/usr/local/hadoop/etc/hadoop/excludes</value>
</property>

2. 添加退役节点

编辑上述配置的 excludes 文件,将需要下线的 DataNode 主机名或 IP 添加进去(每行一个)。

3. 刷新集群状态(触发退役)

在 NameNode 上执行刷新命令,使得配置生效:

bash
# 刷新 HDFS 节点
hdfs dfsadmin -refreshNodes

# 如果有 YARN,同样需要刷新 ResourceManager (需配置 YARN 黑名单 yarn.resourcemanager.nodes.exclude-path)
yarn rmadmin -refreshNodes

4. 等待退役完成(监控状态)

执行刷新后,该节点的状态会变为 Decommissioning in Progress(退役中)。此时 NameNode 正在将该节点的数据迁移到其他节点。
你可以通过以下方式监控:

  • Web UI:进入 HDFS 页面,查看 Datanodes 标签页,状态显示为 Decommissioning
  • 命令行
    bash
    hdfs dfsadmin -report

必须等待! 直到该节点的状态彻底变为 Decommissioned(已退役)。这个过程的长短取决于该节点上的数据量和集群网络带宽,可能需要几个小时。

5. 停止节点服务(在退役节点上操作)

确认状态变为 Decommissioned 后,说明数据已经全部安全转移。此时可以安全地停止该节点的进程:

bash
# Hadoop 3.x
hdfs --daemon stop datanode
yarn --daemon stop nodemanager

6. 清理配置文件(在 NameNode 上操作)

  • excludes 黑名单文件中删除该节点。
  • workers / slaves 文件中删除该节点。
  • 再次执行 hdfs dfsadmin -refreshNodes 使清理生效。

三、 动态扩缩容的注意事项

  1. 缩容前的容量评估:在退役节点前,必须计算 剩余集群的总可用空间 是否大于 当前集群已使用的总空间。如果剩余空间不足以容纳被退役节点的数据,退役过程会一直卡在 Decommissioning 状态无法完成。
  2. 控制均衡/退役带宽:数据迁移会占用大量网络带宽。可以通过命令动态调整允许使用的带宽(默认通常很低,如 10MB/s,会导致过程极慢):
    bash
    # 设置带宽为 50MB/s (单位为 bytes)
    hdfs dfsadmin -setBalancerBandwidth 52428800 
  3. 机架感知(Rack Awareness):如果你的集群配置了机架感知,在添加新节点时,记得在拓扑脚本/配置中为新节点分配正确的机架(Rack)信息。
  4. 白名单与黑名单的关系
    • 如果一个节点同时存在于白名单(dfs.hosts)和黑名单(excludes)中,它允许连接集群,但会直接进入退役状态。
    • 推荐生产环境同时启用白名单和黑名单,严格控制节点接入。
右滑查看面试常问