试想下面的场景:
- 场景 1: 当 HDFS 集群启动时,Datanode 如何向 Namenode 进行注册?
- 场景 2: 当 HDFS 集群运行时,Namenode 如何收集汇总所有的 Block 信息?又通过什么方式·监听 Datanode 心跳?主动还是被动?
- 场景 3: 当你使用 HDFS Client 上传文件,Client 都和谁进行了联络?分别联络了什么内容?而文件最终是如何从 Client 到 Datanode 中的?是串行传输还是并行?
1. 协议分类
在开篇设定的场景中,节点之间通信必须遵循特定的协议,每种角色对应一类协议:
2. Namenode Socket Server
- serviceRpcServer: 处理集群内部服务相关的请求,例如 BackupNode 和 Datanodes 等;
- clientRpcServer:默认绑定 9000 端口,处理客户端请求,例如客户端创建文件夹、上传和访问文件等;
- lifelineRpcServer:处理生命周期相关请求,例如健康状态及 Namenode 事务相关状态的切换;
- HTTP Server:默认绑定 9870 端口,提供 Namenode 的概览界面,其中包括集群状态、存储资源、Datanode 管理和其他查看日志、指标、配置的工具。
3. Datanode Socket Server 和 Client
Datanode 启动时会创建如下 Server:
- ipcServer: 默认绑定 9867 端口,处理其他 Datanode 请求,请求有如下分类:
- 节点相关: getDatanodeInfo、getVolumeReport 和 shutdownDatanode 等;
- Block 相关: getBlockLocalPathInfo、deleteBlockPool 和 triggerBlockReport 等;
- Balancer 相关:getDiskBalancerSetting、getBalancerBandwidth、submitDiskBalancerPlan 和 cancelDiskBalancePlan。
- dataXceiverServer: 默认绑定 9866 端口,接收来自 Client 或 其他 Datanode 发送的 Block 数据流;
- HTTP Server: 默认绑定 9864 端口,提供 Datanode 的概览界面,其中包括 Block Pool 信息、存储资源、Datanode 管理和其他查看日志、指标、配置的工具。
Datanode 通过创建 Socket Client 连接 Namenode ipcServer,发送注册和心跳等请求:
- 节点状态:启动时的注册 registerDatanode、运行时的心跳 sendHeartbeat 和节点信息 sendLifeline;
- Block 信息:上报 blockReport、缓存 cacheReport、异常报告 errorReport、block 的添加或删除 blockReceivedAndDeleted 以及 block 的同步提交 commitBlockSynchronization。
Datanode 存储 Block 会验证该 Block 是否为最后一个,如果不是会创建 Socket Client 连接下一个 Datanode dataXceiverServer 发送 block 数据流。
4. 让通信联通
下面是客户端上传文件到实际 HDFS 存储完毕的完整链路。