map worker失败时Mapreduce中的容错

The fault tolerance in Mapreduce when map worker fail

最近我在阅读 Google 的论文“MapReduce:大型集群上的简化数据处理”。下面的话让我很困惑。它说

When a map task is executed first by worker A and then later executed by worker B (because A failed), all workers executing reduce tasks are notified of the reexecution. Any reduce task that has not already read the data from worker A will read the data from worker B.

我猜执行reduce任务的woker们只是在做他们应该做的事情。如果他们已经从 worker A 读取了数据,他们就可以继续他们的任务。相反,如果他们没有,他们将无法完成任务并向主人报告错误。然后 master 可以在 worker B 完成后将 reduce 任务重新分配给其他人。那么为什么要立即通知他们重新执行呢?我认为对于一些已经从 worker A 读取了他们想要的数据的 reducer 来说是没有必要的。

So why should they be notified of the reexecution immediately? I think it's unnecessary for some reducers who have read the data they want from worker A

问题是 reducer 不知道他们已经从 mapper 读取了他们想要的所有数据,因为 mapper 已经失败并且没有完成写入数据。

Reducers 在 mapper 完成之前就开始读取数据并读取了部分数据。如果没有失败,Mapper 可以生成更多数据。

Mapper 生成了部分结果文件,然后失败并开始新的尝试。

通常映射器和缩减器是单线程和确定性的,这允许重新启动和推测执行。假设您不使用一些非确定性函数,如 rand(),映射器中的多线程(自定义非确定性映射器)。 network/shuffle 也增加了不确定性。具有多 core/multi 线程的映射器可以在重启后产生不同顺序的输出。映射器可以使用另一个映射器甚至缩减器的输出(例如现代实现中的映射端连接)。整个结果应该是确定性的,以便可以重新启动,但顺序可能不是,它可以是不同的文件分组和文件数量。

如果 reducer 是可交换的并且也是确定性的(通常是),您可以重新启动它并获得相同的结果,如果它是可交换的,行的顺序没有问题。

但是是否可以使用一个映射器实例的部分结果(失败)和另一个映射器实例(新尝试)的部分结果,例如从 Map1_attempt1 读取文件 0000 - 0004 和从 Map1_attempt2 ?仅当映射器始终以相同顺序生成完全相同数量的文件时。你看,如果 Mapper 的整个结果应该是确定性的,部分结果可能不是。这取决于实现。