HDFS中四个核心的设计

HDFS四个核心的设计包括:心跳机制,安全模式,副本存放策略,负载均衡。

心跳机制:
Hadoop是Master/Slave结构的,Master和Slave之间就是通过心跳机制进行通信的。
具体流程:Master启动时会启动一个IPC Server等待Slave的连接。当Slave启动的时候,会自动连接IPC Server,并且以3秒(默认)为间隔向Master通讯一次。
DataNode(即Slave)会通过心跳机制将自己的状态信息传递给NameNode(即Master)。反过来,NameNode能够通过心跳机制向DataNode发送命令和检测其生存状态。
当DataNode超过timeout(10分钟30秒(默认))没有向NameNode通讯,则认为该DataNode已经挂掉。(DataNode挂掉,不一定是DataNode所在的节点宕机,网络通讯失败也会导致DataNode的通讯请求失败。)
关于心跳机制重要的配置参数(hdfs-site.xml中):
dfs.heartbeat.interval:心跳间隔,默认为3秒(单位:秒)
timeout = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval
在这里,timeout就是超时时长。dfs.namenode.heartbeat.recheck-interval 默认为5分钟,但需要注意的是,在hdfs-site.xml配置文件中,该参数的单位为毫秒。

安全模式:
安全模式是NameNode的一种状态。
NameNode的三种状态包括:active,standby,safemode;
NameNode进入安全模式的原因:block块的丢失率达到0.1%(默认),为了防止数据的进一步丢失以及防止大批量宕机的情况,NameNode会自动进入安全模式。另外,在HDFS集群正常冷启动的时候,NameNode也会在安全模式下维持相当长的一段时间,这种情况不用担心,因为,在正常运行的HDFS集群中,NameNode的内存中的元数据包括文件路径,副本数,block块的ID,以及每一个block块所在DataNode的信息。但是,在HDFS集群冷启动的时候,此时NameNode内存中的元数据只能从fsimage文件中加载过来,然而,fsimage文件中并没有每一个block块所在DataNode的信息,就会导致,NameNode认为所有的block块都已经丢失,所以会自动进入安全模式。在DataNode启动之后,会通过心跳机制向NameNode汇报自身所持有的block块的信息,在HDFS集群正常启动完成之后,所有DataNode向NameNode汇报完毕之后,NameNode就会自动退出安全模式。
关于安全模式的重要参数:
dfs.namnode.safemode.threshold-pct = 0.999f :最小副本数要求的block占比超过99.9%
安全模式常用的操作命令:
hdfs dfsadmin -safemode leave:强制Namenode退出安全模式
hdfs dfsadmin -safemode enter:使Namenode进入安全模式
hdfs dfsadmin -safemode get:查看安全模式的状态
hdfs dfsadmin -safemode wait:一直等待到安全模式结束

副本存放策略:
为了保证集群的可靠性,将每一个文件的数据进行分块存储,每一个block块都需要保存3个副本(加上本身一共3个副本(默认)),这些数据块副本分布存储在不同的节点上。又为了保证集群的高性能,就要用到副本存放策略来决定每一个副本存在哪一个节点上。
作用:数据分块存储和副本的存放,是保证集群的可靠性和高性能的关键。
有两个前提:安全性(block块不能丢失,保证至少有一个副本存在。),高性能(考虑带宽问题,不能让寻址时间过长,尽量不浪费带宽。)
副本存放策略遵循:
1. 第一个副本尽量放置在客户端所在的节点上;
2. 第二个副本存放在不同的机架上;
3. 第三个副本和第一个副本尽量在同一个机架上;
关于副本存放策略重要的参数:
dfs.replication(hdfs-site.xml配置文件中):副本个数(默认为3)
副本存放常用的命令:
hdfs dfs -setrep num file:设置某个文件的副本数(num为副本数,file为文件全限定名称)

负载均衡:
在HDFS集群中每个DataNode节点磁盘占用率相对平衡。在HDFS集群中,一个节点宕机或者添加一个新的节点,会导致该HDFS集群负载不均衡。
此时,我们可以手动进行负载均衡:
start-baancer.sh -t 10%($HADOOP_HOME/sbin目录下):开始进行负载均衡(-t 10%:最高和最低的磁盘占用率不能超过10%)
HDFS集群默认是不允许balance操作占用太大的网络带宽,默认该操作的速度为1M/s。如果你嫌太慢,可以手动调整:
命令:hdfs dfsadmin -setBalanacerBandwidth 10485760(单位为字节,即10M/s)
参数:dfs.balance.bandwidthPerSe(在hdfs-site.xml配置文件中)

猜你喜欢

转载自blog.csdn.net/weixin_44319333/article/details/88831841