我们非常广泛地使用Elastic Map Reduce,并且正在处理越来越多的数据。有时我们的工作失败是因为数据格式不正确。我们不断修改我们的地图脚本以处理各种异常,但有时候仍有一些格式错误的数据会破坏我们的脚本。
即使某些map或reduce作业失败,是否可以将Elastic Map Reduce指定为“继续出错”?
至少,是否有可能增加整个群集失败的失败任务的最小数量(有时,我们在500个左右的工作中只有1个失败的工作,我们希望至少获得这些结果并让群集继续运行。)
此外,虽然我们可以修改我们的map脚本来处理新的异常,但我们使用默认的Hadoop“aggregate”reducer,当失败时,我们无法捕获异常。是否有任何特殊的方法来处理“聚合”减速器中的错误,或者我们是否必须使用上面问题#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 \