date: 2021-01-03title: HDFS之DataNode工作机制、扩容及黑白名单 #标题
tags: DataNode #标签
categories: Hadoop # 分类
Datanode工作机制
开局一张图,剩下全靠自己悟。。。

添加新的DataNode至集群中
随着业务增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有的集群上动态添加新的数据节点。
注:此博文基于 Hadoop HDFS完全分布式集群部署 集群环境进行配置。
修改新节点的默认配置
$ cat > /etc/security/limits.conf << EOF* - nofile 655360* - memlock unlimited* - stack 655360* - nproc unlimitedEOFcat > /etc/sysctl.conf << EOFkernel.sysrq = 0kernel.core_uses_pid = 1fs.file-max=655360kernel.msgmnb = 65536kernel.msgmax = 65536kernel.shmmax = 68719476736kernel.shmall = 4294967296kernel.pid_max = 655360net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 0net.ipv4.tcp_max_tw_buckets = 10000net.ipv4.tcp_fin_timeout = 30net.ipv4.tcp_timestamps = 0net.ipv4.tcp_sack = 1net.ipv4.tcp_window_scaling = 1net.ipv4.tcp_ecn = 0net.ipv4.tcp_keepalive_time = 600net.ipv4.tcp_keepalive_intvl = 30net.ipv4.tcp_keepalive_probes = 3net.ipv4.tcp_max_orphans = 655360net.ipv4.tcp_max_syn_backlog = 262144net.ipv4.tcp_mem = 65536 131072 262144net.ipv4.udp_mem = 65536 131072 262144net.ipv4.tcp_rmem = 4096 87380 16777216net.ipv4.tcp_wmem = 4096 16384 16777216net.ipv4.ip_local_port_range = 1024 65535net.ipv4.route.gc_timeout = 100# 禁止icmp重定向报文net.ipv4.conf.all.accept_redirects = 0# 禁止icmp源路由net.ipv4.conf.all.accept_source_route = 0net.core.somaxconn = 65535net.core.rmem_default = 8388608net.core.wmem_default = 8388608net.core.rmem_max = 16777216net.core.wmem_max = 16777216net.core.netdev_max_backlog = 262144vm.swappiness = 10vm.overcommit_memory = 1vm.max_map_count = 262144EOFsysctl -p
部署新的DataNode节点
# 将原有的DataNode的Hadoop安装目录拷贝至新机器# 配置解析记录及免密登录(NameNode和ResourceManager都需配置,主要是为了群起集群)$ cat >> /etc/hosts << EOF192.168.20.5 hadoop04EOF$ ssh-copy-id hadoop04# 同步hosts解析记录至所有节点$ for i in $(seq 1 4);do rsync -az /etc/hosts hadoop0${i}:/etc/;done# 配置slaves列表,方便以后群起集群$ cat >> /apps/usr/hadoop-2.9.2/etc/hadoop/slaves << EOFhadoop04EOF# slaves文件需同步至现有群集中所有节点$ 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# 新节点需创建安装目录$ mkdir /apps/usr/ -p# 拷贝JDK环境及Hadoop目录至新节点(只需在namenode上执行即可)# 拷贝jdk$ rsync -az /apps/usr/jdk1.8.0_261 hadoop04:/apps/usr/# 拷贝hadoop$ rsync -az /apps/usr/hadoop-2.9.2 hadoop04:/apps/usr/
配置新节点
以下操作在新节点上进行配置。
$ ln -sf /apps/usr/jdk1.8.0_261 /apps/usr/jdk$ cat >> /etc/profile << EOFexport JAVA_HOME=/apps/usr/jdkexport CLASSPATH=\$JAVA_HOME/libexport PATH=\$JAVA_HOME/bin:\$PATHEOF$ source /etc/profile$ java -version # 查看版本信息java version "1.8.0_261"Java(TM) SE Runtime Environment (build 1.8.0_261-b12)Java HotSpot(TM) 64-Bit Server VM (build 25.261-b12, mixed mode)# 配置时间同步$ yum -y install ntp$ crontab -e*/5 * * * * /usr/sbin/ntpdate 192.168.20.2 &> /dev/null# 配置hadoop$ cat >> /etc/profile << EOFexport HADOOP_HOME=/apps/usr/hadoop-2.9.2export PATH=\${HADOOP_HOME}/bin:\${HADOOP_HOME}/sbin:\${PATH}EOF$ source /etc/profile$ hadoop version # 查看Hadoop版本Hadoop 2.9.2Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r 826afbeae31ca687bc2f8471dc841b66ed2c6704Compiled by ajisaka on 2018-11-13T12:42ZCompiled with protoc 2.5.0From source with checksum 3a9939967262218aa556c684d107985This command was run using /apps/usr/hadoop-2.9.2/share/hadoop/common/hadoop-common-2.9.2.jar
访问namenode的50070端口,确认现有集群内节点

启动新节点
# 由于新节点的hadoop目录是拷贝其他节点的,所以需要在启动前删除data目录和logs目录,避免冲突$ rm -rf /apps/usr/hadoop-2.9.2/data/*$ rm -rf /apps/usr/hadoop-2.9.2/logs/*# 启动$ hadoop-daemon.sh start datanodestarting datanode, logging to /apps/usr/hadoop-2.9.2/logs/hadoop-root-datanode-lv.out$ jps # 确认进程存在7442 DataNode7513 Jps# 创建目录并上传文件进行测试$ hadoop fs -mkdir -p /apps/usr/hadoop/test$ hadoop fs -put anaconda-ks.cfg /apps/usr/hadoop/test/
查看namenode的50070端口
确认datanode列表有新加入的节点

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

至此,即可成功验证,新节点已经加入了hadoop集群。后续增加其他数据节点也是上面一样的操作。
Hadoop配置白名单
在上面的扩容操作中不难发现,我们只要启动一个datanode,并指定namenode的地址,即可加入到hdfs集群,这样看起来不是那么安全,那么我们可以通过白名单,来规定,允许哪些节点加入集群。
添加到白名单的主机节点,都允许访问namenode,不在白名单的主机节点,都会被退出。
配置白名单
# 在namenode的 $HADOOP-HOME/etc/dadoop 目录下创建白名单文件$ pwd/apps/usr/hadoop-2.9.2/etc$ cat > hadoop/dfs.hosts << EOFhadoop01hadoop02hadoop03EOF# 这里故意不将刚刚扩容的新节点hadoop04 写入。$ vim hadoop/hdfs-site.xml # 修改hdfs配置文件,添加如下配置<!-- 加载白名单 --><property><name>dfs.hosts</name><value>/apps/usr/hadoop-2.9.2/etc/hadoop/dfs.hosts</value></property></configuration> # 写在此闭合标签上方即可。# 将修改后的配置文件分发至集群中其他节点$ 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 dfsadmin -refreshNodes # 刷新NameNode使其生效Refresh nodes successful$ yarn rmadmin -refreshNodes # 更新ResourceManager20/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,如下:
# 在NameNode上重启集群(我这里配置了群起集群,所以只需在NameNode上执行即可)$ stop-dfs.sh$ start-dfs.sh
如果我的操作没有问题的话,那么在生产中,还是不要使用白名单功能了,这样如果后续集群扩容,还需将节点名称添加到白名单列表中,再重启集群,会造成业务中断,还是建议通过防火墙规则来控制吧,并且通常hdfs集群都是部署在内网环境的。
配置生效后,确认集群中只有白名单中的节点列表:

集群数据平衡
如果当前集群数据分布不平衡,可以使用命令重新平衡数据。
$ start-balancer.sh # 执行此命令即可starting balancer, logging to /apps/usr/hadoop-2.9.2/logs/hadoop-root-balancer-hadoop01.outTime Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved
Hadoop配置黑名单
黑名单与白名单相反,出现在黑名单列表中的服务器都不允许加入到集群。
在进行黑名单测试前,先将上面的集群节点自行恢复,保证可以看到如下四个DataNode:

创建dfs.hosts.exclude 文件
$ pwd/apps/usr/hadoop-2.9.2/etc/hadoop$ cat > dfs.hosts.exclude << EOFhadoop04EOF$ vim hdfs-site.xml # 修改配置文件,添加如下配置<!-- 加载黑名单 --><property><name>dfs.hosts.exclude</name><value>/apps/usr/hadoop-2.9.2/etc/hadoop/dfs.hosts.exclude</value></property></configuration> # 写在此闭合标签上方即可,注意,白名单和黑名单中不可以出现同一个主机名# 将修改后的配置文件分发至集群中其他节点$ 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 dfsadmin -refreshNodes # 刷新NameNode使其生效Refresh nodes successful$ yarn rmadmin -refreshNodes # 更新ResourceManager20/12/27 07:37:08 INFO client.RMProxy: Connecting to ResourceManager at hadoop02/192.168.20.3:8033
同样,如果刷新不生效,就重启下集群。
# 在NameNode上重启集群$ stop-dfs.sh$ start-dfs.sh
当配置生效后,在黑名单中的节点会将自己的数据拷贝至其他节点一份,然后将自己设置为 Decommissioned 状态,最终查看DataNode列表如下:

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

停止退役节点
# 在要退役的节点上停止 DataNode 和 NodeManager$ hadoop-daemon.sh stop datanode$ yarn-daemon.sh stop nodemanager
稍等几分钟后,即可看到节点状态如下:

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

