当所有数据节点在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中失败时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章
如果映射器在中途失败并且 Hadoop 重试该映射器,自定义计数器会发生啥
当调用winsock 中的recv 函数并且没有收到所有数据时会发生啥?