在 hadoop 2.0 中,默认的复制因子是 3。可接受的节点故障数是 3-1=2。
因此,在 100 个节点的集群上,如果一个文件被分成 10 个部分(块),复制因子为 3,则所需的总存储块为 30。如果包含块 X 及其副本的任何 3 个节点失败,则文件为不可恢复。即使集群有 1000 个节点或文件被分成 20 个部分,集群上 3 个节点的故障仍然可能对文件造成灾难性影响。
现在步入hadoop 3.0。
使用纠删码,正如 Hadoop 所说,它提供了相同的持久性和 50% 的存储效率。并且基于 Reed-Solomon 方法的工作原理(即对于 k 个数据块和 n 个奇偶校验块,至少应可访问 (k+n) 个块中的 k 个,以使文件可恢复/可读)
所以对于上面的同一个文件——有10个数据块,为了将数据效率保持在50%,可以添加5个奇偶校验块。因此,从 10+5 个块中,至少有 10 个块应该可供文件访问。而在 100 个节点的集群上,如果 15 个块中的每一个都存储在一个单独的节点上,那么如您所见,总共 5 个节点故障是可以接受的。现在在 1000 个节点的集群上存储相同的文件(即 15 个块)不会对可接受的节点故障的数量产生任何影响 - 它仍然是 5。
但这里有趣的部分是 - 如果相同的文件(或另一个文件)被分割分成 20 个块,然后添加 10 个奇偶校验块,然后在 100 个节点的集群上总共保存 30 个块,可接受的节点故障数为 10。
我想在这里说明的一点是 -
在 hadoop 2 中,可接受的节点故障数是 ReplicationFactor-1,并且显然基于复制因子。这是一个集群范围的属性。
但是在 hadoop 3 中,假设存储效率固定为 50%,那么对于不同的文件来说,可接受的节点故障数似乎是不同的,具体取决于它被分成的块数。
那么,如果上述推论正确,任何人都可以发表评论吗?以及如何确定任何集群可接受的节点故障?
(而且我不想让它在上面变得复杂,所以没有讨论只有一个块的文件的边缘情况。但我猜该算法将足够聪明,可以按原样复制它或使用奇偶校验数据复制它,以便数据持久性设置得到保证。)
编辑:
这个问题是我对 EC 提出的一系列问题的一部分 - 其他问题如下 -
Hadoop 3.0 擦除编码:对 MR 作业性能的影响?