这篇文章主要就HDFS的四大机制来做一些较为详细的说明。
HDFS的四大机制:心跳机制(heartbeat)、安全模式、副本存放策略(机架策略)、负载均衡。
(1)hadoop是一个Master/Slave结构,Master中有NameNode和ResourceManager,Slave中有DataNode和NodeManager;
(2)Master启动的时候会启动一个IPC(Inter-Process Comunication,进程间通信)Server服务,等待Slave的连接;
(3)Slave启动之后,会主动连接Master的IPC Server服务,并且每隔3s连接一次Master。当然了,这个时间间隔是可以调整的(dfs.heartbeat.interval);
(4)NameNode通过心跳来得知DataNode的状态(ResourceManager通过心跳得知NodeManager的状态);
(5)如果Master长时间没有得到DataManager的心跳,就认为DataManager挂掉了。
【注意】
在这个过程中,NameNoder如果长时间没有接收到DataNode的心跳,也会每隔一段时间(5min)向DataNode发送请求,一共会发两次。
默认NameNode向DataNode发送请求的时间间隔为5min,这个时间间隔也是可以修改的,heartbeat.recheck.interval(单位ms)。
默认DataNode向NameNode发送请求的时间间隔为3s,这个时间间隔也是可以修改的,dfs.heartbeat.interval(单位s)。
所以说,在默认时间间隔的情况下,判断一个DataNode节点挂掉的时长为:2heartbeat.recheck.interval(5min)+10dfs.heartbeat.interval(3s)=630s。
NameNode一共与三种状态:Active、Standby、Safemode。
进入安全模式的原理:
当NameNode发现集群中的block丢失率达到一定比例时(0.1%),NameNode就会进入安全模式。在安全模式下,客户端不能进行任何数据操作,只能查看元数据信息。
【注意】
这个丢失率是可以手动配置的,dfs.safemode.threshold.pct=0.999f。
正常启动下进入安全模式的原理:
(1)当NameNode冷启动时,此时,内存中的元数据只能从fsimage中加载而来,而在fsimage中,不包含block所在的DataNode信息。
(2)从而导致NameNode认为所有block都已丢失;
(3)进入安全模式;
(4)此时,DataNode节点会逐一启动,然后定期向NameNode汇报自身所持有的blockid信息;
(5)这个时候,NameNode就会将内存元数据中block所在的DataNode信息补全更新;
(6)NameNode找到了所有block的位置,从而退出安全模式。
所以说,在HDFS集群正常冷启动时,NameNode也会在safemode状态下维持相当长一段时间,等待它自动退出安全模式即可。
【附】:
安全模式常用命令操作:
hdfs dfsadmin -safemode leave 强制退出安全模式
hdfs dfsadmin -safemode enter 进入安全模式
hdfs dfsadmin -safemode get 查看安全状态模式
hdfs dfsadmin -safemode wait 等待,一直到安全模式结束
作用:数据分块存储和副本的存放,保证了可靠性和高性能。
方法:将每个文件的数据进行分块存储,每一个数据块有保存有多个副本,这些数据块副本分布在不同的机器节点上。
存放说明(以3个副本为例):
(1)第一个block副本放在和client所在的node里(优先选择存放在client所在的机架<就近原则>。如果client不在集群范围内,则第一个副本随机选取存放。系统会尝试不选择那些太满或太忙的node);
(2)第二个副本存放在与第一个副本不同机架上的node节点中(近乎随机选择,系统会尝试不选择那些太满或太忙的node);
(3)第三个副本存放在和第二个副本同一机架的不同节点上。
修改副本数:
修改配置文件的参数:hdfs-site.xml
使用shell命令:bin/hadoop fs -setrep -R 要修改的副本数 /
机器与机器之间磁盘利用率不平衡是HDFS集群非常容易出现的问题。
造成负载均衡的原因:
(1)DataNode节点故障;
(2)集群上增添了新的DataNode节点。
当集群节点数量较小时(不超过20个节点),可以自动进行均衡(一天移动的数据量在10G~1T)。
当超大集群时,调整带宽(默认带宽是1M/s)。调整带宽的方式:
修改配置文件参数:hdfs-site.xml
使用shell命令:hdfs dfsadmin -setBalancerBandwidth 新带宽
启动负载均衡的命令:
sbin/start-balancer.sh
机器容量最高的那个值和最低的那个值差距不能超过10%:
sbin/start-balancer.sh -t 10%