Datanode 的实现
1. 数据块存储
1.1 数据节点的磁盘目录文件结构
-
${dfs.data.dir} 数据目录
- blocksBeingWritten 正在写的数据块,由客户端发起
- current 已经写入的数据块
- detach 配合升级的临时路径
- tmp 数据块复制引发的,保存正在写的数据块
-
${dfs.data.dir}/current
- HDFS数据块
- meta 校验信息
1.2 数据节点存储的实现
- DataStorage 专注于节点存储空间的生存期管理
- FSDataset 创建数据块文件,维护数据块文件和数据块校验信息文件的关系。
1.3 数据节点升级
2. 流式接口的实现
TCP服务器
读数据
-
参数
- blockId
- generationStamp
- startOffset
- length
- clientName
- accessToken
-
零拷贝
[外链图片转存失败(img-2ffBe0ka-1563433728871)(C:\Users\pphe\AppData\Roaming\Typora\typora-user-images\1563271268890.png)]
写数据
- 参数
- blockId
- generationStamp
- pipelineSize
- isRecovery
- clientName
- hasSrcDataNode
- srcDataNode
- numTargets
- targets
- accessToken
- checksum
3. 作为整体的datanode
datanode 和 namenode 的交互
- 握手、注册、数据块上报和心跳
- namenode指定的执行
数据块扫描器
每个数据节点都会执行一个数据块扫描器DataBlockScanner,周期性的验证节点所存储的数据块,汇报给datanode。
datanode的启停
datanode的启动
- 初始化
- 数据节点注册
- 启动数据节点的对外服务
datanode 的停止
- 停止数据节点上的HTTP服务器和远程接口的IPC服务器
- 数据点的成员变量shouldRun被设置为false。
- 停止流式接口的相关服务