【Juicy-Bigdata】Hadoop之HDFS读写数据分析
【Juicy-Bigdata】Hadoop之HDFS读写数据分析
余生杂货铺RPC原理分析及应用
RPC接口分析
- ClientProtocol: HDFS客户端与NameNode通信的接口
- DatanodeProtocol: DataNode与NameNode通信的接口
- NamenodeProtocol:SecondaryNameNode与NameNode通信的接口
HDFS写数据过程
-
Client发起文件上传请求,通过RPC与NameNode建立通讯**(ClientProtocol)**。 NameNode检查目标文件是否存在,父目录是否存在,返回是否可以上传
-
Client请求第一个block该传输那几个DataNode服务器上
-
NameNode根据配置文件中指定的备份数量以及机架感知原理进行文件分配,返回可用的DataNode地址:A,B,C
Hadoop 在设计时考虑到数据的安全与高效, 数据文件默认在HDFS 上存放三份,存储策略为本地一份,同机架内其它某一节点上一份,不同机架的某一节点上一份
-
Clien请求3个DataNode中的A上传数据,通过RPC**(DatanodeProtocol)**建立pipeline。A收到请求后会继续调用B,然后B调用C,将整个通信管线建立。然后逐级应答客户端
-
Client开始往A上传第一个Block(从磁盘读取放到本地内存缓存),以packet(64k)为单位,A收到一个packet就会传给B ,B 传给C。A每传一个packet会放入一个应答队列等待应答
-
在pipeline的反方向上,逐个发送ack,最终由pipeline中的第一个节点A将Pipelineack发送给client
-
一个block传输完成后,client再次请求第二个block,重复2-7.
HDFS读数据过程
- Client向NameNode发送RPC请求,确定请求文件block所在的位置
- NameNode返回文件的block列表。对每个block,返回包括该副本的DataNode地址。这些DN地址会按照集群拓扑结构得出与客户端的距离,然后进行排序。1. 距离近的靠前 2. 心跳机制中超时汇报靠后
- Client选取靠前的DataNode来读取block,或者就是自己
- 底层上本质是建立Socket Stream(FSDataInputStream),重复的调用父类DataInputStream 的read 方法,直到这个块上的数据读取完毕;
- 当读完列表的block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的block 列表;
- 读取完一个block 都会进行checksum 验证,如果读取DataNode 时出现错误,客户端会通知NameNode,然后再从下一个拥有该block 副本的DataNode 继续读
- read 方法是并行的读取block 信息,不是一块一块的读取;NameNode 只是返回Client 请求包含块的DataNode 地址,并不是返回请求块的数据;
- 最终读取的所有block合并为一个文件