弹性地图减少:继续出错?

时间:2013-02-20 21:39:22

标签: hadoop hadoop-streaming amazon-emr emr

我们非常广泛地使用Elastic Map Reduce,并且正在处理越来越多的数据。有时我们的工作失败是因为数据格式不正确。我们不断修改我们的地图脚本以处理各种异常,但有时候仍有一些格式错误的数据会破坏我们的脚本。

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

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

  3. 此外,虽然我们可以修改我们的map脚本来处理新的异常,但我们使用默认的Hadoop“aggregate”reducer,当失败时,我们无法捕获异常。是否有任何特殊的方法来处理“聚合”减速器中的错误,或者我们是否必须使用上面问题#2中可用的任何内容(增加失败任务的最小数量。)

2 个答案:

答案 0 :(得分:2)

您可以在mapper和reducer中捕获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.对于所有其他mapred配置,请参阅here

答案 1 :(得分:0)

如果我正确地阅读您的问题,您可以让您的群集继续失败,以便在基于ruby的命令行工具emr

中的elastic-mapreduce调用中定义的下一步失败
--jar s3://elasticmapreduce/libs/script-runner/script-runner.jar --args "s3://bucket/scripts/script.sh" --step-name "do something using bash" --step-action CONTINUE  \