Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当hadoop中的所有数据节点都失败时会发生什么?_Hadoop_Hdfs - Fatal编程技术网

当hadoop中的所有数据节点都失败时会发生什么?

当hadoop中的所有数据节点都失败时会发生什么?,hadoop,hdfs,Hadoop,Hdfs,我从hadoop操作中了解到,如果数据节点在写入过程中失败 将创建一个包含剩余数据节点的新复制管道 打开并继续写入。在这一点上,事情基本上回到了过去 正常,写入操作将继续,直到文件关闭。这个 namenode将注意到文件中的一个块是 在“已复制”下,将安排创建新的复制副本 异步的。客户端可以从多个失败的数据节点恢复 前提是至少写入了最少数量的副本(由 默认值为1) 但是如果所有的数据节点都失败了会发生什么呢?i、 例如,未写入的复制副本的最小数量? 客户端是否会要求namenode提供新的数据节

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

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

但是如果所有的数据节点都失败了会发生什么呢?i、 例如,未写入的复制副本的最小数量? 客户端是否会要求namenode提供新的数据节点列表?还是工作会失败

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


假设namenode告诉客户端将块B1写入Rack1中的数据节点D1、Rack2中的D2和Rack1中的D3。集群中可能还有其他机架(机架4、5、6等)。如果Rack1和Rack2在写入过程中失败,客户机知道数据没有成功写入,因为它没有从datanodes接收到ACK,此时,它会要求Namenode提供新的datanodes集吗?可能在还活着的架子上吗?

好的,我知道你在问什么了。DFSClient将从namenode中获得一个datanodes列表,它应该在其中写入一个文件块(例如a)。DFSClient将迭代该数据节点列表,并在这些位置写入块A。如果块写入在第一个datanodes中失败,它将放弃块写入,并向namenode请求一组新的datanodes,以便再次尝试写入

下面是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;
}

谢谢你的答复。我知道,如果所有数据节点都出现故障,数据将丢失,这种情况也非常罕见。很抱歉,可能是我的问题不清楚,所以我在问题上添加了一个注释。很抱歉,我找不到我问题的答案,您没有理解哪一部分,或者我理解错了您的问题?我真的很好奇?我想这对我也有帮助!感谢客户端C1正在将块B1写入数据节点D1。D2和D3正在排队。在D1上执行写入操作时,节点D1、D2和D3失败。现在,C1应该写入的数据节点中没有一个是活动的。在这一点上会发生什么?C1是否会尝试从namenode获取新的数据节点列表(可能是D4、D5、D6)?还有一个问题,如果块B1在所有数据节点中损坏,会发生什么?i、 例如,如果校验和不正确。塔克斯