HDFS 写入时可能出现的问题及处理机制

HDFS 写入时可能出现的问题

  1. client 崩溃
  2. DataNode 故障
  3. nameNode 故障

前两种故障的解决方法如下:

HDFS 写入过程 DataNode 出错如何处理

以客户端写入过程中出错,客户端主动发起数据块恢复为例。

当数据节点出现故障后,客户端会调用 recoverBlock 方法进行恢复。该方法会从所有参与到该写入过程的正常节点中选出一个作为主节点,主节点需要获取所有参与到此次写入的节点信息以便于进行数据块恢复,过程如下:

  1. 首先主节点会获取数据块的恢复信息,因为是恢复节点数据块,必须要将数据节点上对于此数据块操作的线程中断,避免恢复时受到这些线程的影响。同时,处于恢复状态的数据块的数据文件和校验信息可能会不一致,所以在获取数据块信息时先对数据块进行一次校验。当当主节点获取到所有参与了写操作的正常节点的数据块信息后,计算得到所有需要恢复的节点以及需要恢复到的数据块长度(取所有数据节点中对应的数据块的最小值),之后再对数据块进行同步,同步过程如下:
  2. 主节点向 namenode 申请一个新的版本号(根据 namenode 中的租约信息获得),更新所有正常状态的数据块版本号,当故障节点恢复后上报过时的数据块,再将其删除
  3. 主节点根据获得的数据块版本号以及数据块长度构建新的数据块信息,然后和其他数据节点同步数据块
  4. 同步向 namenode 上报此次恢复的结果
  5. 最后 recoverBlock 会返回一个新的 locatedblock 对象,根据其中的 locs 变量重新建立 pipline 继续写入数据
  6. 数据块写完之后,blockreceive 上报数据后,无论是否发生过故障,namenode 都会检查该文件当前拥有的副本数,通过循环检查文件当前拥有的所有数据快,若不满足会执行数据块的复制

写入过程客户端崩溃怎么处理(租约恢复)

客户端崩溃时便不可能周期性的更新租约,此时 namenode 便可以感知到。

当数据写入过程中客户端异常退出时,同一数据块的不同副本可能处于不一致的状态,此时需要选择某一副本作为主数据节点,协调其他数据节点,将该数据块恢复到他们中的最小长度。数据块恢复配合配合租约恢复是 HDFS 中故障恢复的重要机制。

租约恢复的过程

  1. 选取一个最近一次进行汇报的数据节点作为主恢复节点
  2. 然后向这个数据节点发送租约恢复指令,Namenode会通过心跳将租约恢复的指令下发给该恢复节点。
  3. 主恢复节点向数据流管道中参与租约恢复的数据节点收集副本信息
  4. 从该数据块的所有副本中选取一个最佳状态(多个副本中选择最小长度最为恢复的最终标准)
  5. 主恢复节点同步其他数据节点上该数据块副本至目标状态,同步结束后这些副本的版本号以及长度将一致
  6. 主恢复节点向 namenode 报告此次恢复的结果
  7. namenode 更新该文件的元数据信息
  8. namenode 回收该文件租约并关闭文件
  • 为什么在多个副本中选择最小长度作为最终更新一致的标准?

想想写入流水线过程,如果 Client 挂掉导致写入中断后,对于流水线上的多个 DataNode 收到的数据在正常情况下应该是一致的。但在异常情况下,排在首位的收到的数据理论上最多,末位的最少,由于数据接收的确认是从末位按反方向传递到首位再到 Client 端。所以排在末位的 DataNode 上存储的数据都是实际已被确认的数据,而它上面的数据实际在不一致的情况也是最少的,所以算法里选择多个节点上最小的数据长度为标准来同步到一致状态。

-----------本文结束感谢您的阅读-----------
0%