HDFS Block Recovery过程简述

本文详细介绍了在DFSClient写文件时遇到中断情况导致block处于UnderConstruction状态时,LeaseManager如何进行文件Recovery的过程。重点讨论了Recovery的两个阶段:NameNode端和DataNode端的操作,包括文件状态判断、PrimaryDataNode选择、DataNode检查与truncate、以及最终的commitBlock操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        在DFSClient写文件的时候,对于文件的每一个block,生成一个pipeline,然后按照这个pipeline进行数据传输,但是可能在数据传输过程中,DFSClient发生中断,例如断网等,此时该block在NameNode中处于UnderConstruction状态,该block所在的文件的写锁(通过LeaseManager实现)被该DFSClient占据着,无法释放。为此LeaseManager会对超过一定时间不活跃的DFSClient所占用的文件进行Recovery。

        同时,BlockInfoUnderConstruction类有一个成员变量replicas用于存放“expected DataNodes which make up of the pipeline for that Block”. 该成员变量是在pipeline生成之后构造的,也就是说它并不用于指导生成pipeline,它的用途即用于Recovery。需要说明的是,在BlockInfoUnderConstruction的基类BlockInfo中有一个变量triplets用于存在block所有的replication所处的DataNodeStorageInfo。replicas记录的是"expected DataNodes",而triplets记录的是“stored DataNodes”。


Recovery大致过程如下:

1)发生在NameNode中的部分

1. 若文件的所有block都已经处于completed状态,则close文件,并将文件从leaseManager移出,即释放写锁,Recovery过程结束;

2. 若文件的最后一个block处于committed状态,则意味着该block已经写完毕,只是replication数目不够,只需等待block replication流程将该block复制足够的备份即可;

3. 若文件的最后一个block处于UnderConstruction/UnderRecovery状态,则从block的replicas中选择出一个DataNode作为本次Recovery的Primary DataNode;当被选择出的DataNode在下次向NameNode heartbeat时,NameNode会给其返还DNA_RECOVERBLOCK命令

2)发生在DataNode中的部分

1. DataNode在收到DNA_RECOVERBLOCK命令之后,给该命令的中携带的每一个target DataNode发送RPC调用,检测那些DataNode上面是否有对应的block;

2. 对于存在这个block的DN(DataNode),检测这些block的状态,找出长度最小的block,并将所有DN上的这个block都truncate到最小长度;

3. 给NameNode发送commitBlockSynchronization RPC调用,通知NameNode,NameNode会将文件最后一个block标记为committed状态或completed状态,并关闭文件,LeaseManager释放该文件的写锁。

### HDFS 读写过程解释 #### 写数据流程 当客户端向 HDFS 中写入文件时,具体的过程如下: 1. 客户端调用 `create()` 方法创建新文件。此请求被发送给 NameNode。 2. NameNode 执行一系列检查来验证该操作的有效性,比如权限校验以及目标路径是否存在等。 3. 如果一切正常,则由 NameNode 返回一个包含允许写入的信息响应给客户端。 4. 接下来,客户端开始分片上传实际的数据块至 DataNodes。对于每一个待传输的数据包(packet),都会构建出一条管道连接多个DataNodes形成链路结构用于冗余存储目的。 5. 数据按照设定好的复制因子依次传递给各个节点上的 BlockReceiver 实例完成持久化保存工作;与此同时还会同步更新相应的元数据信息回传给NameNode以便其维护全局视图的一致性和准确性。 在整个过程中如果遇到异常情况如网络中断等问题导致部分副本未能成功接收全部内容的话,那么后续阶段将会尝试重新建立新的管道来进行补偿性的重试直至满足预期条件为止[^1]。 #### 读取数据流程 针对从 HDFS 获取资源而言,主要步骤概述如下: 1. 应用程序发起 open() 请求试图打开指定的目标文件并获取输入流对象实例。 2. 同样先经过一轮初步审核之后再交予负责管理命名空间的组件处理——即NameNode。 3. 基于所处位置等因素考虑,后者会选择最优策略决定哪些具体的Datanodes可以提供服务支持,并把它们的相关地址列表反馈回去供前者参考利用。 4. 此刻应用程序便可以直接联系这些候选者之一建立起直接通信渠道进而实施真正的I/O行为。 5. 随着指针不断向前推进接近终点线,在每抵达一个新的block边界之际都需要重复执行上述第3步动作以确保始终能够选取到最合适的供应源继续前进直到整个文档遍历结束。 值得注意的是为了提高效率减少延迟现象的发生频率,Hadoop框架内部实现了诸如短路本地读等功能特性使得某些特殊场景下的性能表现更为出色[^2]。 ```python from hdfs import InsecureClient client = InsecureClient('http://localhost:9870', user='hdfs') with client.read('/example.txt') as reader: content = reader.read() print(content.decode()) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值