HDFS核心设计

来源:互联网 发布:北京国企工资 知乎 编辑:程序博客网 时间:2024/06/05 10:39

1、Hadoop心跳机制(heartbeat)

     Hadoop是Master/Slave结构,Master中有NameNode和ResourceManager,
Slave中有DataNode和NodeManager。
Master启动的时候,就会启动一个IPC(Inter-Process Comunication,进程间通信)server服务,等待slave的连接。
Slave启动时,会主动连接master的ipc server,并且每隔3秒连接一次master,这个间隔时间是可以调整的,
参数dfs.heartbeat.interval,这个每隔一段时间去连接一次的机制,我们成为心跳。
Slave通过心跳汇报给自己的信息master,master也通过心跳给slave下达命令。
NameNode通过心跳得知Datanode的状态
ResourceManager通过心跳得知NodeManager的状态
如果master长时间没有收到slave的心跳,就认为该slave挂了。

Namenode感知DataNode掉线死亡的时长计算:
timeout = 2*heartbeat.recheck.interval (ms)+ 10*dfs.heartbeat.interval(s)
默认为10分钟+30秒

2、HDFS安全模式

namenode进入安全模式的原理
namenode发现集群中的block丢失率达到一定比例时(0.1%),namenode就会进入安全模式,在安全模式下,客户端不能对任何数据进行操作,只能查看元数据信息,丢失率可以手动配置,默认是dfs.safemode.threshold.pct=0.999f。
在hdfs集群正常冷启动时,namenode也会在safemode状态下维持相当长一段时间,此时不需要理会,等自动退出安全模式即可。

正常启动进入安全的原理
namenode内的内存元数据中,不包含block所在的DataNode信息,namenode等待通过心跳机制slave的汇报,等汇报完了,就自动退出安全模式,如果有block丢失,则进入安全模式。

安全模式常用操作命令
hdfs dfsadmin -safemode leave 强制NameNode退出安全模式
hdfs dfsadmin -safemode enter 进入安全模式
hdfs dfsadmin -safemode get查看安全模式状态
hdfs dfsadmin -safemode wait等待,一直到安全模式结束

3、副本存放策略

作用:数据分块存储和副本的存放,是保证可靠性和高性能的关键
方法:将每个文件的数据进行分块存储,每个数据块有保存多个副本,这些数据块副本分布在不同的机器节点上

存放说明:HDFS默认副本数是3,
第一个block副本放在和client所在的node里(如果所在node太忙,也会随机选择)
第二个副本放置在与第一个节点不同的几家中的node中
第三个副本与第二个在同一个机架,随机放在不同的node中。


修改副本数量:
修改hdfs-site.xml
<property>       <name>dfs.replication</name>       <value>2</value></property>
命令设置:bin/hadoop fs -setrep -R 1 /

4、负载均衡

机器与机器之间磁盘利用率不平衡是HDFS集群非常容易出现的情况,尤其是在DateNode节点出现故障,或在现有的集群上增添新的DataDode的时候,分析数据块分布和重新均衡DataNode上的数据分布的工具
命令:sbin/start-balancer.sh
   sbin/start-balancer.sh-threshold 5
//node负载不能相差5%
自动进行均衡非常慢,HDFS集群默认1M/s,我们也可以修改
命令:hdfs dfsadmin -setBalanacerBandwidth 10485760 //10M
配置文件:hdfs-site.xml
<property>        <name>dfs.balance.bandwidthPerSec</name>        <value>10485760</value>        <description>Specifies the maximum bandwidth that each datanode can utilize for the balancing purpose in term of the number of bytes per second.</description></property>
机器容量最高的那个值,和最低的那个值差距不能超过10%:
sbin/start-balancer.sh -t 10%