2013-02-20 40 views
1

我们使用弹性的Map Reduce相当广泛,并与它正在处理越来越多的数据。有时我们的工作失败,因为数据格式不正确。我们不断修改我们的地图脚本以处理各种异常情况,但有时仍会有一些格式错误的数据管理我们的脚本。弹性地图缩小:继续出错?

  1. 即使某些map或reduce作业失败,是否可以将Elastic Map Reduce指定为“继续出错”?

  2. 至少,是否有可能增加整个集群失败的失败任务的最小数量(有时,我们在500个左右的任务中只有1个失败的任务,并且我们希望至少获得这些任务结果,并在集群继续运行。)

  3. 此外,虽然我们可以修改我们的映射脚本来处理新的异常,我们使用默认的Hadoop的“聚合”减速,以及当出现故障时,我们也没有办法赶上一个例外。有没有在“聚合”减速处理错误任何特殊的方式,还是必须与上面的问题#2提供什么给我们的工作(增加的失败任务的最低数量。)

回答

2

你可能赶上Exception两个映射器和减速机和catch块中有类似下面的计数器:

catch (Exception ex){ 
    context.getCounter("CUSTOM_COUNTER", ex.getMessage()).increment(1); 
    System.err.println(GENERIC_INPUT_ERROR_MESSAGE + key + "," + value); // also log the payoad which resulted in the exception 
    ex.printStackTrace(); 
} 

如果异常消息是你本来预期,也可以是计数器的值是可以接受的,那么你可以很好的继续使用结果或调查日志。我知道捕,不建议Exception但如果你想“继续错误”,那么它几乎同样的事情。由于集群成本受到威胁,我认为我们最好赶上Excpetion而不是特定的例外情况。

虽然,可能有副作用吧,比如你的代码可能运行于完全错误输入,但是对于抓住它就会失败早得多。但是发生这种事情的可能性非常小。

编辑:

对于你的观点#2,您可以通过设置每个跟踪允许失败的最大数量如下:

 conf.setMaxTaskFailuresPerTracker(noFailures); 

OR

的配置,你必须设置为mapred.max.tracker.failures。如您所知,默认值为4.对于所有其他映射配置,请参阅here

+0

感谢下一步,我是能够实际发现错误并将其修复到我的映射器中。我的确有一个相当详尽的try/catch逻辑,但它在我的情况下并不奏效,因为mapper正确地输出了一行 - 其中有一个换行符!一旦这个问题得到解决,整个事情就能正常工作。 – Suman 2013-02-25 23:01:19

+1

我试图找出是否有比映射器try/catch语句其他任何东西 - 在Hadoop中本身的东西,让工作继续完成,即使在一个地图或减速故障的情况下。 – Suman 2013-02-25 23:01:52

+0

感谢您的更新!出于某种原因,我没有得到通知 - 我实际上没有使用Java,我正在使用Hadoop流......我如何指定流中允许的最大失败次数? – Suman 2013-03-04 20:35:02

0

如果我正确读你的问题,你可以在失败群集继续在基于Ruby的命令行工具的弹性MapReduce的通话定义为EMR

--jar s3://elasticmapreduce/libs/script-runner/script-runner.jar --args "s3://bucket/scripts/script.sh" --step-name "do something using bash" --step-action CONTINUE \