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 unlimited
EOF
cat > /etc/sysctl.conf << EOF
kernel.sysrq = 0
kernel.core_uses_pid = 1
fs.file-max=655360
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kernel.pid_max = 655360
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_max_tw_buckets = 10000
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_ecn = 0
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_max_orphans = 655360
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_mem = 65536 131072 262144
net.ipv4.udp_mem = 65536 131072 262144
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 16384 16777216
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.route.gc_timeout = 100
# 禁止icmp重定向报文
net.ipv4.conf.all.accept_redirects = 0
# 禁止icmp源路由
net.ipv4.conf.all.accept_source_route = 0
net.core.somaxconn = 65535
net.core.rmem_default = 8388608
net.core.wmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
vm.swappiness = 10
vm.overcommit_memory = 1
vm.max_map_count = 262144
EOF
sysctl -p
部署新的DataNode节点
# 将原有的DataNode的Hadoop安装目录拷贝至新机器
# 配置解析记录及免密登录(NameNode和ResourceManager都需配置,主要是为了群起集群)
$ cat >> /etc/hosts << EOF
192.168.20.5 hadoop04
EOF
$ 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 << EOF
hadoop04
EOF
# 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 << EOF
export JAVA_HOME=/apps/usr/jdk
export CLASSPATH=\$JAVA_HOME/lib
export PATH=\$JAVA_HOME/bin:\$PATH
EOF
$ 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 << EOF
export HADOOP_HOME=/apps/usr/hadoop-2.9.2
export PATH=\${HADOOP_HOME}/bin:\${HADOOP_HOME}/sbin:\${PATH}
EOF
$ source /etc/profile
$ hadoop version # 查看Hadoop版本
Hadoop 2.9.2
Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r 826afbeae31ca687bc2f8471dc841b66ed2c6704
Compiled by ajisaka on 2018-11-13T12:42Z
Compiled with protoc 2.5.0
From source with checksum 3a9939967262218aa556c684d107985
This 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 datanode
starting datanode, logging to /apps/usr/hadoop-2.9.2/logs/hadoop-root-datanode-lv.out
$ jps # 确认进程存在
7442 DataNode
7513 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 << EOF
hadoop01
hadoop02
hadoop03
EOF
# 这里故意不将刚刚扩容的新节点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 # 更新ResourceManager
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,如下:
# 在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.out
Time 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 << EOF
hadoop04
EOF
$ 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 # 更新ResourceManager
20/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
稍等几分钟后,即可看到节点状态如下:
文件副本所在的节点,也将没有 退役节点了。