HDFS数据写入流程是hdfs理论框架的基础,完全理解HDFS的数据写入流程是每一个大数据从业人员的必备技能。
下面以300m文件写入hadoop2.x为例,详细讲解HDFS数据写入的详细过程。
主要包括:
1.数据写入流程图
2.数据写入相关组件
3.数据写入组件通信协议
4.hdfs通信协议
数据写入过程详解:
(1)客户端发送消息给namenode请求上传300m文件。
(2)Namenode应答可以上传。
(3)客户端上传之前对文件进行切片,切片规则:按datanode的block块大小进行切片,hadoop2.x默认block大小为128m(hadoop1.x默认block大小64m)。
300m文件切分为3片:第一片128m,第二片128m,剩下44m单独为1片。
客户端上传切片1,namenode返回上传的datanode信息,具体namenode如何选择datanode,选择哪些datanode是hadoop机架感知特性和副本个数决定(默认副本个数为3)决定。:机架感知。
(4)客户端拿到datanode信息后,与datanode1直接建立通信通道,开始上传数据。以packet为单位上传,packet默认大小为64k。
(5)上传到dataNode1中的数据先存到byteBuffer缓存中,达到block大小,再刷到block中进行物理存储。
(6)DataNode1和dataNode2,dataNode2与dataNode3同时会建立通信通道,进行数据的副本传输。Datanode2和datanode3完成数据通信后,依次按通信顺序,最终应答给DataNode1,DataNode1再应答client,完成数据的通信。
(7)第一各切片完成传输以后,开始传输第二各切片,过程同切片一。
主要的客户端:
(1)Hadoop Shell命令
(2)Java API:
DistributedFileSystem
FSDataOutputStream
负责整个分布式文件系统的元数据(MetaData)管理,也就是文件路径名,数据block的ID以及存储位置等信息。
负责文件数据的存储和读写操作,HDFS将文件数据分割成若干块(block),每个DataNode存储一部分block。
Client与namenode通信
(1)Hadoop RPC
具体协议接口:ClientProtocol:客户端和namenode的接口;
client与datanode通信
(1)Hadoop RPC
具体协议接口:ClientDatanodeProtocol:客户端与datanode的接口(这个方法主要是用于客户端获取数据节点信息时调用,真正的数据读写交互在流式接口进行)
(2)DataTransferProtocol–基于TCP【推荐】
Hadoop RPC框架的效率目前还不足以支撑超大文件的读写,而使用基于TCP的流式接口有利于批量处理数据,同时提高了数据的吞吐量
Datanode与namenode通信
(1)Hadoop RPC
具体协议接口:
DatanodeProtocol:datanode与namenode通信接口
Datanode与datanode通信
(1)Hadoop RPC
具体协议接口:
InterDatanodeProtocol:datanode与datanode的通信接口
secondary namenode与namenode通信
(1)Hadoop RPC
具体协议接口:
NamenodeProtocol:secondary namenode与namenode的接口
(2)流式接口
Active Namenode和Secondary Namenode之间的HTTP接口
1.Hadoop RPC接口:HDFS中基于Hadoop RPC框架实现的接口
2.流式接口:HDFS中基于TCP或者HTTP实现的接口
Hadoop RPC调用使得HDFS进程能够像本地调用一样调用另一个进程中的方法,目前Hadoop RPC调用基于Protobuf实现。
备注:protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。
用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。
proto文件定义了协议数据中的实体结构(message ,field)
关键字message: 代表了实体结构,由多个消息字段(field)组成。
消息字段(field): 包括数据类型、字段名、字段规则、字段唯一标识、默认值
ClientProtocol:客户端和namenode的接口;
ClientDatanodeProtocol:客户端与datanode的接口(这个方法主要是用于客户端获取数据节点信息时调用,真正的数据读写交互在流式接口进行)
DatanodeProtocol:datanode与namenode通信接口
InterDatanodeProtocol:datanode与datanode的通信接口
NamenodeProtocol:secondary namenode与namenode的接口
其他接口:主要包括安全相关接口,HA相关接口
流式接口是HDFS中基于TCP或HTTP实现的接口。
主要包括:
DataTransferProtocol是用来描述写入或者读出Datanode上数据的基于TCP的流式接口,HDFS客户端与Datanode以及Datanode与Datanode之间的数据块的传输就是基于DataTransferProtocol接口实现的。
备注:HDFS没有采用Hadoop RPC来实现HDFS文件的读写功能,是因为Hadoop RPC框架的效率目前还不足以支撑超大文件的读写,而使用基于TCP的流式接口有利于批量处理数据,同时提高了数据的吞吐量。
Active Namenode和Secondary Namenode之间的HTTP接口就是用来传输这个新的fsimage文件的,Secondary Namenode成功地将自己的命令空间写入新的fsimage文件后,就会向Active Namenode的ImageServlet发送HTTP GET请求/getimage?putimage=1。这个请求的URL中包括了新的fsimage文件的事务ID,以及Secondary Namenode用于下载的端口和IP地址。Active Namenode收到这个请求后,会根据Standby Namenode提供的信息向Standby Namenode的ImageServlet发起HTTP GET请求下载fsimage文件。