微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Map Worker 失败时 Mapreduce 的容错

如何解决Map Worker 失败时 Mapreduce 的容错

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

一个map任务先由worker A执行,然后由worker B执行(因为A失败)时,所有执行reduce任务的worker都会收到重新执行的通知。任何尚未从 worker A 读取数据的 reduce 任务将从 worker B 读取数据。

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

解决方法

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

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

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。