HDFS核心设计-三大机制

心跳机制
1、 Hadoop 是 Master/Slave 结构,Master 中有 NameNode 和 ResourceManager,Slave 中有
Datanode 和 NodeManager
2、 Master 启动的时候会启动一个 IPC(Inter-Process Comunication,进程间通信)server 服 务,等待 slave 的链接
3、 Slave 启动时,会主动链接 Master 的 ipc server 服务,并且每隔 3 秒链接一次 Master ,这 个间隔时间是可以调整的,参数为 dfs.heartbeat.interval,这个每隔一段时间去连接一次 的机制,我们形象的称为心跳。Slave 通过心跳汇报自己的信息给 master,master 也通过心跳给 slave 下达命令
4、 NameNode 通过心跳得知 Datanode 的状态 ResourceManager 通过心跳得知 NodeManager 的状态
5、 如果 master 长时间都没有收到 slave 的心跳,就认为该 slave 挂掉了!
HDFS 默认的超时时间为 10 分钟+30 秒。
namenode判断datanode是否宕机需要一个标准: 超时
timeout(超时时长) = 10 * 心跳时长 + 2 * 检测心跳是否正常工作的间隔。
心跳时长=3秒
检测心跳是否正常工作的间隔=5分钟
超时时长: 10 * 3 + 2 * 5 * 60 =630 秒
作用:
1、让namendoe能够识别当前各个datanode的状态
2、心跳数据包:
(1)该节点自身的状态
包括:磁盘使用量、block块的数量、block块的状态
(2)该datanode节点保存的所有的block块的信息:
blk001 : bigdata02 bigdata03
blk002 : bigdata03 bigdata04
块的信息目录:
/home/bigdata/data/hadoopdata/data/current/BP-1030666007-192.168.123.152-1623519476819/current/finalized/subdir0
HDFS的启动流程:
1、先启动namenode进程
2、加载namenode文件夹中的存储的磁盘的元数据信息(fsimage + edits_inprogress)
3、namenode在启动完毕之后,会在namenode节点启动一个服务
服务的作用:等待所有的datanode的上线汇报
4、datanode一旦上线,就会通过心跳机制把自身所持有的所有的块信息汇报给namenode
5、只有namenode等到了所有的datanode的上线以及把所有的块信息都汇报完毕之后,最后namenode才能够得知,当前的集群中的所有的文件的所有的块的副本的分布。
hdfs集群很多,就会出现以下情况:
1、元数据信息fsimage很多,加载到内存中的时间越来越长。
2、datanode节点多,节点保存的数据块的个数也多。
安全模式
NameNode进入安全模式的原理:
a、 NameNode发现集群中的 block 丢失率达到一定比例时(0.1%), NameNode就会进入 安全模
式,在安全模式下,客户端不能对任何数据进行操作,只能查看元数据信息(比 如 ls/mkdir)
这个丢失率是可以手动配置的,默认是 dfs.safemode.threshold.pct=0.999f
新版本的配置是:dfs.namenode.safemode.threshold-pct=0.999f
b、如何退出安全模式?
1、找到问题所在,进行修复(比如修复宕机的 datanode)
2、或者可以手动强行退出安全模式(但是并没有真正解决数据丢失问题)
hdfs dfsadmin -safemode leave # 退出
hdfs dfsadmin -safemode enter #进入
hdfs dfsadmin -safemode get #查看
hdfs dfsadmin -safemode wait #等待
副本存放策略
定义:决定一个数据块的副本(默认是3)到底应该存储在哪些服务器上面
1、 作用: 数据分块存储和副本的存放,是保证可靠性和高性能的关键
2、 方法: 将每个文件的数据进行分块存储,每一个数据块又保存有多个副本,这些数据块副本分布在不同的机器节点上
原则:
1、任意一个节点上面不可能存储两个一样的副本块。
2、如果一个数据块要保存完整的三个副本块,必须至少三个节点。
策略:
1、第一个副本块选取和客户端相同的节点
2、第二个副本块选取跟第一个副本块存储节点相邻的机架上面的任意一个节点。
3、第三个副本存在和第二个副本所在机架不同的节点上。(Hadoop权威指南上说)
策略仅仅是一个参考,不是一个硬性标准。实际 选取不忙的节点。