4

我从 hadoop 操作中读到,如果数据节点在写入过程中失败,

打开包含剩余数据节点的新复制管道并继续写入。至此,事情基本恢复正常,写操作继续进行,直到文件关闭。namenode 会注意到文件中的一个块复制不足,并将安排异步创建一个新的副本。客户端可以从多个失败的数据节点中恢复,前提是至少写入了最少数量的副本(默认情况下,这是一个)。

但是如果所有的数据节点都失败了怎么办?即,未写入最小副本数?客户会要求 namenode 提供新的数据节点列表吗?还是工作会失败?

注意:我的问题不是当集群中的所有数据节点都发生故障时会发生什么。问题是如果客户端应该写入的所有数据节点在写入操作期间都失败了会发生什么

假设 namenode 告诉客户端将 BLOCK B1 写入 Rack1 中的数据节点 D1、Rack2 中的 D2 和 Rack1 中的 D3。集群中可能还有其他机架(机架 4、5、6、...)。如果 Rack1 和 2 在写入过程中失败了,client 没有收到 datanodes 的 ACK 就知道数据没有写入成功,此时会要求 Namenode 给新的 datanodes 集合吗?可能在仍然活着的机架中?

4

1 回答 1

1

好的,我明白了你的要求。DFSClient 将从应该写入文件块(例如 A)的名称节点获取数据节点列表。DFSClient 将遍历该 Datanodes 列表并将块 A 写入这些位置。如果第一个数据节点中的块写入失败,它将放弃块写入并询问namenode一组新的数据节点,它可以尝试再次写入。

这里是来自 DFSClient 的示例代码,它解释了 -

private DatanodeInfo[] nextBlockOutputStream(String client) throws IOException {
    //----- other code ------
    do {
            hasError = false;
            lastException = null;
            errorIndex = 0;
            retry = false;
            nodes = null;
            success = false;

            long startTime = System.currentTimeMillis();
            lb = locateFollowingBlock(startTime);
            block = lb.getBlock();
            accessToken = lb.getBlockToken();
            nodes = lb.getLocations();

            //
            // Connect to first DataNode in the list.
            //
            success = createBlockOutputStream(nodes, clientName, false);

            if (!success) {
              LOG.info("Abandoning block " + block);
              namenode.abandonBlock(block, src, clientName);

              // Connection failed.  Let's wait a little bit and retry
              retry = true;
              try {
                if (System.currentTimeMillis() - startTime > 5000) {
                  LOG.info("Waiting to find target node: " + nodes[0].getName());
                }
                Thread.sleep(6000);
              } catch (InterruptedException iex) {
              }
            }
          } while (retry && --count >= 0);

          if (!success) {
            throw new IOException("Unable to create new block.");
          }
     return nodes;
}
于 2013-08-14T09:36:12.960 回答