map worker失败时Mapreduce中的容错

map worker失败时Mapreduce中的容错,mapreduce,reducers,mapper,Mapreduce,Reducers,Mapper,最近我在读谷歌的论文,“MapReduce:大型集群上的简化数据处理”。下面的话把我弄糊涂了。上面说 当映射任务首先由工作线程a执行,然后由工作线程B执行时(因为a失败),所有执行reduce任务的工作线程都会收到重新执行的通知。任何尚未从辅助进程A读取数据的reduce任务都将从辅助进程B读取数据 我猜执行reduce任务的工人只是在做他们应该做的事情。如果他们已从工作者A读取数据,则可以继续执行任务。相反,如果他们没有,他们将无法完成任务并向master报告错误。然后,在工人B完成后,大师可

最近我在读谷歌的论文,“MapReduce:大型集群上的简化数据处理”。下面的话把我弄糊涂了。上面说

当映射任务首先由工作线程a执行,然后由工作线程B执行时(因为a失败),所有执行reduce任务的工作线程都会收到重新执行的通知。任何尚未从辅助进程A读取数据的reduce任务都将从辅助进程B读取数据

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

那么,为什么要立即通知他们重新执行?我想 对于一些已经读取了所需数据的还原者来说,这是不必要的 来自工人A

问题是,还原程序不知道他们已经从映射程序中读取了所需的所有数据,因为映射程序已经失败,并且没有完成数据写入

还原程序在mapper完成并读取部分数据之前就开始读取数据。如果不失败,映射器可以生成更多数据

映射程序已生成部分结果文件,然后失败,并已开始新的尝试

通常,映射器和还原器是单线程和确定性的,这允许重新启动和推测执行。假设您没有在mapper(自定义非确定性映射器)中使用一些非确定性函数,如rand()、多线程。网络/洗牌也增加了不确定性。具有多核/多线程的映射器可以在重新启动后生成不同顺序的输出。映射器可以使用其他映射器甚至还原器的输出(例如,现代实现中的映射侧连接)。整个结果应该是确定的,以便能够重新启动,但顺序可能不是,它可以是不同的文件分组和文件数量

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


但是,是否可以使用来自一个映射程序实例(失败)的部分结果和来自另一个映射程序实例(新尝试)的部分结果,如从Map1_尝试1读取文件0000-0004和从Map1_尝试2读取文件0005-0006?仅当mapper始终以相同的顺序生成完全相同数量的文件时。您知道,如果Mapper的整个结果应该是确定性的,那么部分结果可能不是。这取决于实施情况。

我知道你的想法。这里还有一个问题,关于还原程序,他们不知道他们已经从映射程序中读取了他们想要的所有数据。正如您所说,即使在映射程序完成之前,reducer也可以读取部分数据。但最终,它必须先完成数据读取,然后再从用户迭代执行reduce函数。因为reducer应该合并它读取的所有数据,并将所有数据聚合到一个列表中。那么减速机如何识别这个时间呢?@Caka只要检查一下,它应该是_SUCCESS文件以及数据输出文件。