如何在MapReduce中恢复失败的执行?

时间:2016-06-27 16:09:12

标签: hadoop mapreduce

我有一个要求说 -

一个。假设我有100GB的文件/数据

湾我已经编写了Map Reduce作业来处理某些逻辑上的数据。

℃。我解雇了Map Reduce作业,但是在读完50GB之后失败了

所以我的问题是 -

我可以从第51 GB恢复Map Reduce作业吗?

如果有人知道如何做,请告诉我,我不想重新处理我在失败前处理的数据。

提前致谢

2 个答案:

答案 0 :(得分:1)

简要回答:不。

这就是为什么使用Hadoop或MPI等大型批处理系统很难的原因。从资源消耗的角度来看,不仅大型工作的重新启动效率低下,而且在心理上也是非常压抑的。这就是为什么您的主要目标是将单个作业的运行时间减少到不超过几个小时。也许有一天可能会实现“暂停”工作和“热修复”代码,但目前我不支持这种代码。

解决方案#1。将您的工作分成容易出错的可并行化作业和最终无错误的不可并行化作业。请考虑以下示例:您从Web服务器获得了数百GB的文本访问日志,并且您希望编写将打印不同浏览器流行程度的作业。如果将解析和聚合(求和)组合到一个巨大的工作中,那么它的运行时间将是几天的顺序,并且它将失败的可能性非常高,因为文本日志通常由于不明确而难以解析。更好的想法是将这份工作分成两个独立的工作:

  1. 第一项工作全权负责解析日志文件。它只打印浏览器字符串作为输出,甚至不需要任何reducer。这项工作是所有错误的99%,因为这里是解析“狂野”数据的地方。此作业是可并行化的,因为您可以将输入分成块并分别处理每个块,以便在10-30分钟内处理每个块。如果某个块的作业失败,则修复它并重新启动; 30分钟不是一大损失。

  2. 第二个工作是从第一个工作的实例获取输出并执行聚合的大工作。由于聚合代码非常简单,因此该作业不太可能失败。

  3.            chunk(20G)->parse-job(20G)->browsers(0.5G)
               chunk(20G)->parse-job(20G)->browsers(0.5G)
    input(1T)->chunk(20G)->parse-job(20G)->browsers(0.5G)->aggregate-job->output
                  ...         ....             ...
               chunk(20G)->parse-job(20G)->browsers(0.5G)
    

    解决方案#2。有时,即使输入数据的某些部分被删除,您也可能对结果感到满意。在这种情况下,您可以将选项mapred.max.map.failures.percent和/或mapred.max.reduce.failures.percent设置为非零值。

答案 1 :(得分:0)

如果您的整个作业失败,则输出会被清除,因此您无法处理任何内容。但是,Hadoop重试失败的作业任务。因此,只要您的故障在预先配置的尝试次数内可以恢复,作业就不会失败,您也不会从已完成的任务中丢失输出。

如果您的失败无法恢复,那么在大多数情况下这是您的错,您可能需要执行以下一项或多项操作:

  • 修复您的代码,即使是简单的错误也可能导致您的所有任务始终失败
  • 使用更少的资源(例如照顾可用内存)
  • 更好地划分问题(看看某些任务是否提供了比其他任务更多的数据,或确保任务输入被分成更小的块)
  • 拥有更大的群集容量。