HDFS如何检测并删除多余副本块

本文详细介绍了HDFS如何检测并处理过量副本块,包括ReCommission节点重新上线、人为设置副本数、丢失新添加的block记录等场景。通过processOverReplicatedBlock方法选择并处理多余副本,确保集群的副本策略。

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

前言


在HDFS中,每时每刻都在进行着大量block块的创建和删除操作,这些庞大的block块构建起了这套复杂的分布式系统.普通block的读写删除操作一般人都或多或少了解过一些,但是过量的副本清理机制是否有人知道呢,就是overReplicatedBlock的处理,针对过量的副本块,HDFS怎么处理,何时处理,处理的策略机制如何,本文就给大家分享HDFS在这方面的知识.

过量副本块以及发生的场景


过量副本块的意思通俗解释就是集群中有A副本3个,满足标准的3副本策略,但是此时发生了某种场景后,A副本块突然变为5个了,为了达到副本块的标准系数3个,系统就会进行多余2块副本的清除动作,而这个清除动作就是本文所要重点描述的.过量副本块的现象是比较好解释的,那么问题来了,到底有哪些潜在的原因或条件会触发多余副本块的发生呢(在此指的是HDFS中)?本人通过对HDFS源码的阅读,总结出一下3点

  • ReCommission节点重新上线.这类操作是运维操作引起的.节点下线操作会导致大量此节点的block块在集群中大量拷贝,一旦此节点取消下线,之前已拷贝的大量块必然会成为多余的副本块.

  • 人为重新设置block replication副本数.还是以A副本举例,A副本当前满足标准副本数3个,此时用户张三通过使用hdfs的API方法setReplication人为设置副本数为1.此时也会早A副本数多余2个的情况,即使说HDFS中的副本标准系数还是3个.

  • 新添加的block块记录在系统中被丢失.这种可能相对于前2种case的情况,是内部因素造成.这些新添加的丢失的block块记录会在BlockManager进行再次扫描检测,防止出现过量副本的现象.

OK,以上3种情形就是可能发生过量副本块的原因.至于这3种情况是如何一步步的最终调用到处理多余副本块的过程在后面的描述中会再给出,先来看下多余副本块是如何被选出并处理掉的.

OverReplication多余副本块处理


多余副本块的处理分为2个子过程:

  • 多余副本块的选出
  • 选出的多余副本块的处理

我们从源码中进行一一寻找原因,首先副本块的选出.

多余副本块的选择


进入blockManager的processOverReplicatedBlock方法,很显然,方法名已经表明了方法操作的本意了.

/**
 * Find how many of the containing nodes are "extra",          if any.
 * If there are any extras, call chooseExcessReplicates() to
 * mark them in the excessReplicateMap.
 */
private void processOverReplicatedBlock(final Block block, final short replication, final DatanodeDescriptor addedNode, DatanodeDescriptor delNodeHint) {
  

此方法的注释的意思是找出存在”多余”的节点,如果他们是多余的,调用chooseExcessReplicates并标记他们,加入加入到excessReplicateMap中.下面进行细节的处理

// 节点列表变量的声明
Collection<DatanodeStorageInfo> nonExcess = new ArrayList<DatanodeStorageInfo>();
// 从corruptReplicas变量中获取是否存在坏的block所在的节点
Collection<DatanodeDescriptor> corruptNodes = corruptReplicas.getNodes(block);

继续后面的处理

    // 遍历此过量副本块所在的节点列表
    for(DatanodeStorageInfo storage : blocksMap.getStorages(block, State.NORMAL)) {
      final DatanodeDescriptor cur = storage.getDatanodeDescriptor();
      ...
      LightWeightLinkedSet<Block> excessBlocks = excessReplicateMap.get(cur
          .getDatanodeUuid());
      // 如果在当前过量副本图对象excessReplicateMap中不存在
      if (excessBlocks == null || !excessBlocks.contains(block)) {
        //并且所在节点不是已下线或下线中的节点
        if (!cur.isDecommissionInProgress() && !cur.isDecommissioned()) {
          // 并且这个副本块不是损坏的副本块
          // exclude corrupt replicas
          if (corruptNodes == null || !corruptNodes.contains(cur)) {
            // 将此过滤副本块的一个所在节点加入候选节点列表中
            nonExcess.add(storage);
          }
        }
      }
    }

所以从这里看出nonExcess对象其实是一个候选节点的概念,将block副本块所在的节点列表进行多种条件的再判断和剔除.最后就调用到选择最终过量副本块节点的方法

chooseExcessReplicates(nonExcess, block, replication, 
        addedNode, delNodeHint, blockplacement);

进入chooseExcessReplicates方法

    // first form a rack to datanodes map and
    // 首先会形成机架对datanode节点的映射关系图
    BlockCollection bc = getBlockCollection(b);
    final
HDFS 中,`hdfs fsck` 工具是一个非常有用的诊断和修复工具。当遇到损坏或丢失的时,可以使用 `fsck` 来帮助定位问题,结合其他命令手工修复这些问题。以下是关于如何利用 `hdfs fsck` 进行的手工修复步骤介绍。 ### 使用 `hdfs fsck` 定位问题 1. **检查文件系统的完整性**: 首先需要确认哪些路径下存在坏或丢失。你可以通过运行以下命令来扫描整个文件系统: ```bash hdfs fsck / -files -blocks -locations > fsck_report.txt ``` 上述命令将生成一个包含所有文件及其对应详细信息的日志文件 (`fsck_report.txt`),其中包含了每个文件的状态(包括是否有丢失)、编号、所在位置等关键信息。 2. **查找有问题的文件和**: 分析刚才保存的日志文件,特别是那些标注了“CORRUPT”、“MISSING”的条目,确定具体的受影响文件名及对应的block ID。 3. **获取更多信息**: 对于每一个存在问题的,可以通过 `-list-corruptfileblocks` 参数进一步获得其确切的位置和其他相关信息: ```bash hdfs fsck / -list-corruptfileblocks ``` ### 手工修复缺失或损坏的 #### 方案一:尝试从其它副本恢复 4. **验证是否有多余副本可用**: 根据前面收集的信息,如果某个丢失还存在于其他的 DataNode 节点上,则可以直接让 NameNode 将该重新分配给新的目标节点: ```bash hdfs dfsadmin -recoverCorruptBlocks <path_to_file> ``` 5. **等待自动修复完成**: 提交修复请求后,Hadoop 会自动处理复制到合适的节点上去。这个过程可能会花费一些时间取决于集群大小和个人设置。 #### 方案二:手动删除重传数据 6. **移除不可用的记录**: 若确实找不到剩余的有效副本,则只能选择把相关的元数据清理干净再另行补充数据源。注意此步需谨慎操作以免误删重要资料! ```bash hdfs debug recoverLease -path <corrupted_filepath> [-namenodeRpcAddress <nn_address>] ``` 7. **重新上传正确的数据集**: 清理完旧有的错误引用之后就可以按照标准流程再次上传完整的正确版文件至相应目录内替换原有内容了。 8. **验证修复结果**: 最终别忘了再次执行一次全面性的 `hdfs fsck` 测试以确保所有的更改都已生效且没有残留下来的问题。 --- 总结来说,虽然HDFS自带了一定程度上的自动化纠错能力,但在实际应用中难免还是会碰到各种复杂状况下的数据一致性挑战。掌握好 `hdfs fsck` 的基本用法以及了解它的辅助选项能够让我们更好地应对这些突发难题。如果你还需要更多有关维护HDFS稳定运行的经验分享,请参考下方提供的相关问题列表。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值