1.HDFS 的各节点之间的通信框架概述
HDFS 之间的通信方式有两种:
(1)基于 RPC 的通信 (2)基于 TCP 或 HTTP 的通信
1)RPC 通信的接口
定义了客户端和 NameNode 的接口,客户端和 DataNode 的接口,DataNode 和 NameNode 的接口,DataNode 和 DataNode 的接口。
底层采用 Hadoop 的 RPC 通信协议,实现客户端与服务端之间的通信
2)基于 TCP 和 HTTP 通信的流式接口
(1)HDFS 客户端和 DataNode 以及 DataNode 之间的数据块的传输是基于 TCP 的(数据量大)
(2)Active NameNode 和 Standby NameNode 之间是采用 HTTP 接口实现通信的
2.HDFS 中 RPC 的通信接口及其主要功能
1)ClientProtocol
定义了所有由客户端发起,NameNode 响应的操作
核心:HDFS 文件读写相关的操作
(1)HDFS 文件读相关的操作
Ⅰ.getBlockLocations() 获得数据块的位置信息
Ⅱ.reportBadBlocks() 发现读数据异常时告知 NameNode 错误(校验和不正确)的数据块位置
(2)写数据相关操作
Ⅰ.create() 在 HDFS 的文件系统目录树创建一个空文件
Ⅱ.addBlock 向指定文件中添加一个新的数据块
Ⅱ.complete() 客户端完成写入操作(每个数据块满足系统配置的最小副本数,默认为 1)时告知 NameNode
2)DataNodeProtocol
NameNode 和 DataNode 之间通信的唯一方式
(1)DataNode 启动相关指令
Ⅰ.registerDataNode() 向 NameNode 注册
Ⅱ.blockReport() 汇报数据块信息
(2)心跳相关方法
sendHeartBeat() 向 NameNode 发送心跳信息,汇报 DataNode 的状态信息。NameNode 会返回一个 HeartbeatResponse 对象,内部封装了一个 DataNodeCommand 对象数组,包含了 NameNode 对 DataNode 的指令信息。心跳默认每 3 秒一次
(3)DataNode 数据块汇报指令
blockReport() 告知 NameNode 自己所有本地存储的数据块,启动时调用,默认汇报间隔为 6 小时
3)ClientDatanodeProtocol
客户端和 DataNode 之间的通信接口
(1)文件读写
Ⅰ.getReplicaVisibleLength() 获取数据块真实长度(可能由于某些错误导致与 NameNode 中的元数据信息不一致)
Ⅱ.getBlockLocalPathInfo() 本地化读取数据,避免跨节点传输
3.HDFS 中流式接口及其主要功能
1)DataTransferProtocol
基于 TCP 的流式接口,HDFS 客户端和 DataNode 以及 DataNode 之间的数据块的传输
Ⅰ.readBlock:从当前 DataNode 读取指定的数据块
Ⅱ.writeBlock:将指定的数据块写入数据流管道(pineline)中
2)HTTP 接口
Active NameNode 和 Standby NameNode 之间是采用 HTTP 接口实现通信,传输 fsimage。
Standby NameNode 会通过 HTTP 告知 Active NameNode 下载端口和地址,之后 Active NameNode 发起 HTTP 请求下载新合并的 fsimage