当所有数据节点在hadoop中失败时会发生啥?

Posted

技术标签:

【中文标题】当所有数据节点在hadoop中失败时会发生啥?【英文标题】:What happens when all the datanodes fail in hadoop?当所有数据节点在hadoop中失败时会发生什么? 【发布时间】:2013-08-14 08:00:56 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案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;

【讨论】:

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

以上是关于当所有数据节点在hadoop中失败时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

当 PayPal 订阅被取消或失败时会发生啥?

如果映射器在中途失败并且 Hadoop 重试该映射器,自定义计数器会发生啥

namenode启动失败,这是啥原因

当调用winsock 中的recv 函数并且没有收到所有数据时会发生啥?

当 NDB Cluster 中的单个且唯一一个管理节点出现故障时会发生啥

RAFT:当Leader在操作过程中发生变化时会发生啥