大数据开发:HDFS数据节点与名称节点的通信机制
作为Hadoop技术生态当中的分布式文件系统,HDFS在底层存储上提供了稳固的支持,从数据引入到数据落盘,离不开HDFS各个节点之间的配合。今天的大数据开发学习分享,我们就主要来讲讲HDFS数据节点与名称节点之间的通信机制。
1、Namenode主备之间状态通信
首先,HDFS HA架构,一般指的是Namenode的高可用,即:
一主一备两个Namenode,他们通过Journalnode集群实现元数据等状态保持一致,一个出现健康问题,另一个就切换成新主,保证Namenode稳定局面是保证HDFS集群稳定的关键所在。
通过ZKFC持续监听两个Namenode健康状态监控,若活跃节点出现健康问题,将由zookeeper对Namenode锁释放,实现Namenode高可用切换。
通过一张图除了看看Namenode高可用通信机制,也同时看看所问的Datanode与Namenode的通信情况:
Namenode一主一备,当然是在不考虑联邦模式(Federation,联邦模式说白了也就是Namenode的水平化伸缩,目的就是别把元数据和RPC操作都集中到一个地方,变成瓶颈,适合超大规模数据存储)的情况下。两个Namenode通过对zookeeper集群目录的活跃锁争夺,来明确谁是活跃的(active)。
FailoverControllerActive(ZKFC)每个Namenode上都有一个这样的服务,就是监控Namenode健康,并把健康心跳不断报告给zookeeper,活动Namenode不心跳了,zookeeper就把锁给另一个备着的Namenode,那么它就成为Active Namenode状态了。
由多个Journalnode组成QJM高可用集群,提供active Namenode各项元数据的状态信息存储服务,并为备用Namenode提供这些信息状态同步服务,因此备用Namenode就可以随时等待active Namenode故障时,zookeeper对活跃锁的释放,使其切换成新的活动首领。
2、Namenode与Datanode协作通信
Namenode和Datanode之间的通信,一种是直接通信的情况,另一种是客户端与它们两者建立直接通信(相当于两者是间接通信关系了)。
直接通信很好理解,分成了两个阶段:
Datanode初始化阶段,会创建Namenode的代理对象,通过RPC调用,将Datanode注册给Namenode,包括存储信息、主机地址、UUID、端口、版本等等...,而Namenode接收到Datanode信息后,会记录到自己的网络拓扑数据结构中,Namenode也是根据网络拓扑结构为客户端提供最佳位置(最近)的Datanode副本。
注册好以后,Datanode通过Namenode代理向其发送心跳(heartbeat),一般3秒建立一次心跳连接,如果在超过约定间隔,Namenode探测到没与Datanode的建立心跳,namende会认为这个Datanode节点挂了,然后寻求一个新的Datanode数据节点,根据相应挂掉节点的副本数据,为新的节点增加副本数据。
Namenode和Datanode之间没有直接数据传输关系,始终通过客户端保持一种间接通关系。
客户端先通过Namenode代理,请求Namenode创建数据块和分配Datanode;
客户端通过HDFS输出流的方式将dfs包写入Namenode指定的Datanode数据块中,Datanode通过写入链的方式完成其他副本的数据块写入,并依次返回完成确认;
客户端的HDFS输出流在得到完成确认(ACK)之后,关闭HDFS文件流,并向Namenode汇报完成;
如下图所示:
3、Datanode写入过程分析
客户端文件向HDFS写入过程主要通过数据流线程,响应处理线程和数据复制管道,这就是异步写入的过程(最终一致性),这种架构设计的目的是为了更好的写入性能和复制性能,同时也兼顾数据写入的可靠性。
异步过程:
客户端写入主线程将数据丢入队列就继续读取文件数据;
客户端数据流线程再从队列中拿到数据;
Datanode节点进行RPC异步传输给第一个Datanode节点;
多个Datanode形成的管道实现block链式复制;
复制完成后多个Datanode再反向链式回应给客户端。
客户端回应线程在回应队列中,发现回应时间过长的副本,判断该副本节点是否出现阻塞后报告Namenode,更换新的Datanode节点并重新建立数据管道。
4、HDFS写入为什么选择分布式CAP定理的可靠性AP?
若客户端向HDFS传输一段数据还要同步等待网络上所有副本节点的复制接收完成,虽然这么做数据完整性很高,保证了分布式复制的一致性(CP)。
但是客户端写入过程会非常慢,很容易形成客户端的写入堵塞,因为低效率写入是不满足HDFS作为大吞吐数据读写的设计目标,所以通过管道思路,客户端与各个Datanode在传输上的异步分工,满足客户端访问可靠性才是更合理的选择。
关于大数据开发学习,HDFS数据节点与名称节点的通信机制,以上就为大家做了基本的介绍了。在Hadoop生态体系当中,HDFS的重要性不容置疑,要把HDFS的细节理透彻,也需要自己多花精力。