date: 2021-01-03title: HDFS之DataNode工作机制、扩容及黑白名单 #标题
tags: DataNode #标签
categories: Hadoop # 分类

记录下datanode的工作机制、扩容及其黑白名单配置。

Datanode工作机制

开局一张图,剩下全靠自己悟。。。

HDFS之DataNode工作机制、扩容及黑白名单 - 图1

添加新的DataNode至集群中

随着业务增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有的集群上动态添加新的数据节点。

注:此博文基于 Hadoop HDFS完全分布式集群部署 集群环境进行配置。

修改新节点的默认配置

  1. $ cat > /etc/security/limits.conf << EOF
  2. * - nofile 655360
  3. * - memlock unlimited
  4. * - stack 655360
  5. * - nproc unlimited
  6. EOF
  7. cat > /etc/sysctl.conf << EOF
  8. kernel.sysrq = 0
  9. kernel.core_uses_pid = 1
  10. fs.file-max=655360
  11. kernel.msgmnb = 65536
  12. kernel.msgmax = 65536
  13. kernel.shmmax = 68719476736
  14. kernel.shmall = 4294967296
  15. kernel.pid_max = 655360
  16. net.ipv4.tcp_tw_reuse = 1
  17. net.ipv4.tcp_tw_recycle = 0
  18. net.ipv4.tcp_max_tw_buckets = 10000
  19. net.ipv4.tcp_fin_timeout = 30
  20. net.ipv4.tcp_timestamps = 0
  21. net.ipv4.tcp_sack = 1
  22. net.ipv4.tcp_window_scaling = 1
  23. net.ipv4.tcp_ecn = 0
  24. net.ipv4.tcp_keepalive_time = 600
  25. net.ipv4.tcp_keepalive_intvl = 30
  26. net.ipv4.tcp_keepalive_probes = 3
  27. net.ipv4.tcp_max_orphans = 655360
  28. net.ipv4.tcp_max_syn_backlog = 262144
  29. net.ipv4.tcp_mem = 65536 131072 262144
  30. net.ipv4.udp_mem = 65536 131072 262144
  31. net.ipv4.tcp_rmem = 4096 87380 16777216
  32. net.ipv4.tcp_wmem = 4096 16384 16777216
  33. net.ipv4.ip_local_port_range = 1024 65535
  34. net.ipv4.route.gc_timeout = 100
  35. # 禁止icmp重定向报文
  36. net.ipv4.conf.all.accept_redirects = 0
  37. # 禁止icmp源路由
  38. net.ipv4.conf.all.accept_source_route = 0
  39. net.core.somaxconn = 65535
  40. net.core.rmem_default = 8388608
  41. net.core.wmem_default = 8388608
  42. net.core.rmem_max = 16777216
  43. net.core.wmem_max = 16777216
  44. net.core.netdev_max_backlog = 262144
  45. vm.swappiness = 10
  46. vm.overcommit_memory = 1
  47. vm.max_map_count = 262144
  48. EOF
  49. sysctl -p

部署新的DataNode节点

  1. # 将原有的DataNode的Hadoop安装目录拷贝至新机器
  2. # 配置解析记录及免密登录(NameNode和ResourceManager都需配置,主要是为了群起集群)
  3. $ cat >> /etc/hosts << EOF
  4. 192.168.20.5 hadoop04
  5. EOF
  6. $ ssh-copy-id hadoop04
  7. # 同步hosts解析记录至所有节点
  8. $ for i in $(seq 1 4);do rsync -az /etc/hosts hadoop0${i}:/etc/;done
  9. # 配置slaves列表,方便以后群起集群
  10. $ cat >> /apps/usr/hadoop-2.9.2/etc/hadoop/slaves << EOF
  11. hadoop04
  12. EOF
  13. # slaves文件需同步至现有群集中所有节点
  14. $ for i in $(seq 1 3);do rsync -az /apps/usr/hadoop-2.9.2/etc/hadoop/slaves hadoop0${i}:/apps/usr/hadoop-2.9.2/etc/hadoop/;done
  15. # 新节点需创建安装目录
  16. $ mkdir /apps/usr/ -p
  17. # 拷贝JDK环境及Hadoop目录至新节点(只需在namenode上执行即可)
  18. # 拷贝jdk
  19. $ rsync -az /apps/usr/jdk1.8.0_261 hadoop04:/apps/usr/
  20. # 拷贝hadoop
  21. $ rsync -az /apps/usr/hadoop-2.9.2 hadoop04:/apps/usr/

配置新节点

以下操作在新节点上进行配置。

  1. $ ln -sf /apps/usr/jdk1.8.0_261 /apps/usr/jdk
  2. $ cat >> /etc/profile << EOF
  3. export JAVA_HOME=/apps/usr/jdk
  4. export CLASSPATH=\$JAVA_HOME/lib
  5. export PATH=\$JAVA_HOME/bin:\$PATH
  6. EOF
  7. $ source /etc/profile
  8. $ java -version # 查看版本信息
  9. java version "1.8.0_261"
  10. Java(TM) SE Runtime Environment (build 1.8.0_261-b12)
  11. Java HotSpot(TM) 64-Bit Server VM (build 25.261-b12, mixed mode)
  12. # 配置时间同步
  13. $ yum -y install ntp
  14. $ crontab -e
  15. */5 * * * * /usr/sbin/ntpdate 192.168.20.2 &> /dev/null
  16. # 配置hadoop
  17. $ cat >> /etc/profile << EOF
  18. export HADOOP_HOME=/apps/usr/hadoop-2.9.2
  19. export PATH=\${HADOOP_HOME}/bin:\${HADOOP_HOME}/sbin:\${PATH}
  20. EOF
  21. $ source /etc/profile
  22. $ hadoop version # 查看Hadoop版本
  23. Hadoop 2.9.2
  24. Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r 826afbeae31ca687bc2f8471dc841b66ed2c6704
  25. Compiled by ajisaka on 2018-11-13T12:42Z
  26. Compiled with protoc 2.5.0
  27. From source with checksum 3a9939967262218aa556c684d107985
  28. This command was run using /apps/usr/hadoop-2.9.2/share/hadoop/common/hadoop-common-2.9.2.jar

访问namenode的50070端口,确认现有集群内节点

HDFS之DataNode工作机制、扩容及黑白名单 - 图2

启动新节点

  1. # 由于新节点的hadoop目录是拷贝其他节点的,所以需要在启动前删除data目录和logs目录,避免冲突
  2. $ rm -rf /apps/usr/hadoop-2.9.2/data/*
  3. $ rm -rf /apps/usr/hadoop-2.9.2/logs/*
  4. # 启动
  5. $ hadoop-daemon.sh start datanode
  6. starting datanode, logging to /apps/usr/hadoop-2.9.2/logs/hadoop-root-datanode-lv.out
  7. $ jps # 确认进程存在
  8. 7442 DataNode
  9. 7513 Jps
  10. # 创建目录并上传文件进行测试
  11. $ hadoop fs -mkdir -p /apps/usr/hadoop/test
  12. $ hadoop fs -put anaconda-ks.cfg /apps/usr/hadoop/test/

查看namenode的50070端口

确认datanode列表有新加入的节点

HDFS之DataNode工作机制、扩容及黑白名单 - 图3

查看上传的数据所在节点,存在了新节点上

HDFS之DataNode工作机制、扩容及黑白名单 - 图4

至此,即可成功验证,新节点已经加入了hadoop集群。后续增加其他数据节点也是上面一样的操作。

Hadoop配置白名单

在上面的扩容操作中不难发现,我们只要启动一个datanode,并指定namenode的地址,即可加入到hdfs集群,这样看起来不是那么安全,那么我们可以通过白名单,来规定,允许哪些节点加入集群。

添加到白名单的主机节点,都允许访问namenode,不在白名单的主机节点,都会被退出。

配置白名单

  1. # 在namenode的 $HADOOP-HOME/etc/dadoop 目录下创建白名单文件
  2. $ pwd
  3. /apps/usr/hadoop-2.9.2/etc
  4. $ cat > hadoop/dfs.hosts << EOF
  5. hadoop01
  6. hadoop02
  7. hadoop03
  8. EOF
  9. # 这里故意不将刚刚扩容的新节点hadoop04 写入。
  10. $ vim hadoop/hdfs-site.xml # 修改hdfs配置文件,添加如下配置
  11. <!-- 加载白名单 -->
  12. <property>
  13. <name>dfs.hosts</name>
  14. <value>/apps/usr/hadoop-2.9.2/etc/hadoop/dfs.hosts</value>
  15. </property>
  16. </configuration> # 写在此闭合标签上方即可。
  17. # 将修改后的配置文件分发至集群中其他节点
  18. $ for i in $(seq 1 3);do rsync -az /apps/usr/hadoop-2.9.2/etc/hadoop/ hadoop0${i}:/apps/usr/hadoop-2.9.2/etc/hadoop/;done

刷新集群配置

上述白名单配置完成后,即可刷新节点配置,使其生效。

注意:在刷新之前,可以先到web页面,查看当前的DataNode 节点数量,如下:
HDFS之DataNode工作机制、扩容及黑白名单 - 图5

  1. $ hdfs dfsadmin -refreshNodes # 刷新NameNode使其生效
  2. Refresh nodes successful
  3. $ yarn rmadmin -refreshNodes # 更新ResourceManager
  4. 20/12/27 07:37:08 INFO client.RMProxy: Connecting to ResourceManager at hadoop02/192.168.20.3:8033

注意:我这是看视频写的文档,视频中的hdfs版本为 2.7.2,执行上述刷新操作,看起来生效了,但我这里是2.9.2 版本,刷新并未生效,需要重启dfs,如下:

  1. # 在NameNode上重启集群(我这里配置了群起集群,所以只需在NameNode上执行即可)
  2. $ stop-dfs.sh
  3. $ start-dfs.sh

如果我的操作没有问题的话,那么在生产中,还是不要使用白名单功能了,这样如果后续集群扩容,还需将节点名称添加到白名单列表中,再重启集群,会造成业务中断,还是建议通过防火墙规则来控制吧,并且通常hdfs集群都是部署在内网环境的。

配置生效后,确认集群中只有白名单中的节点列表:

HDFS之DataNode工作机制、扩容及黑白名单 - 图6

集群数据平衡

如果当前集群数据分布不平衡,可以使用命令重新平衡数据。

  1. $ start-balancer.sh # 执行此命令即可
  2. starting balancer, logging to /apps/usr/hadoop-2.9.2/logs/hadoop-root-balancer-hadoop01.out
  3. Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved

Hadoop配置黑名单

黑名单与白名单相反,出现在黑名单列表中的服务器都不允许加入到集群。

在进行黑名单测试前,先将上面的集群节点自行恢复,保证可以看到如下四个DataNode:

HDFS之DataNode工作机制、扩容及黑白名单 - 图7

创建dfs.hosts.exclude 文件

  1. $ pwd
  2. /apps/usr/hadoop-2.9.2/etc/hadoop
  3. $ cat > dfs.hosts.exclude << EOF
  4. hadoop04
  5. EOF
  6. $ vim hdfs-site.xml # 修改配置文件,添加如下配置
  7. <!-- 加载黑名单 -->
  8. <property>
  9. <name>dfs.hosts.exclude</name>
  10. <value>/apps/usr/hadoop-2.9.2/etc/hadoop/dfs.hosts.exclude</value>
  11. </property>
  12. </configuration> # 写在此闭合标签上方即可,注意,白名单和黑名单中不可以出现同一个主机名
  13. # 将修改后的配置文件分发至集群中其他节点
  14. $ for i in $(seq 1 4);do rsync -az /apps/usr/hadoop-2.9.2/etc/hadoop/ hadoop0${i}:/apps/usr/hadoop-2.9.2/etc/hadoop/;done

刷新集群配置

上述黑名单配置完成后,即可刷新节点配置,使其生效。

注意:在刷新之前,可以先到web页面,查看当前的DataNode 节点数量,如下:
HDFS之DataNode工作机制、扩容及黑白名单 - 图8

  1. $ hdfs dfsadmin -refreshNodes # 刷新NameNode使其生效
  2. Refresh nodes successful
  3. $ yarn rmadmin -refreshNodes # 更新ResourceManager
  4. 20/12/27 07:37:08 INFO client.RMProxy: Connecting to ResourceManager at hadoop02/192.168.20.3:8033

同样,如果刷新不生效,就重启下集群。

  1. # 在NameNode上重启集群
  2. $ stop-dfs.sh
  3. $ start-dfs.sh

当配置生效后,在黑名单中的节点会将自己的数据拷贝至其他节点一份,然后将自己设置为 Decommissioned 状态,最终查看DataNode列表如下:

HDFS之DataNode工作机制、扩容及黑白名单 - 图9

查看之前的数据,会发现存在了四个副本(我们设置的副本数为 3)

HDFS之DataNode工作机制、扩容及黑白名单 - 图10

停止退役节点

  1. # 在要退役的节点上停止 DataNode 和 NodeManager
  2. $ hadoop-daemon.sh stop datanode
  3. $ yarn-daemon.sh stop nodemanager

稍等几分钟后,即可看到节点状态如下:

HDFS之DataNode工作机制、扩容及黑白名单 - 图11

文件副本所在的节点,也将没有 退役节点了。

HDFS之DataNode工作机制、扩容及黑白名单 - 图12