elasticmap-reduce:出错时继续?

piztneat  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(228)

我们广泛使用弹性Map约简,并用它处理越来越多的数据。有时我们的工作失败是因为数据格式不正确。我们不断修改map脚本以处理各种异常,但有时仍然有一些格式错误的数据破坏了我们的脚本。
即使某些map或reduce作业失败,是否可以将弹性map reduce指定为“出错时继续”?
至少,是否可以增加整个集群失败的最小失败任务数(有时,在500个左右的作业中,我们只有一个失败的作业,我们希望至少获得这些结果,并让集群继续运行。)
另外,虽然我们可以修改map脚本来处理新的异常,但我们使用默认的hadoop“聚合”缩减器,当它失败时,我们无法捕获异常。是否有任何特殊的方法来处理“聚合”缩减器中的错误,或者我们是否必须使用上面问题2中的任何可用方法(增加失败任务的最小数量)

dtcbnfnu

dtcbnfnu1#

如果我没看错您的问题,您可以让集群在出现故障时继续执行基于ruby的emr命令行工具中的elasticmapreduce调用中定义的下一步

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

jgzswidk2#

你可能会抓到 Exception 在mapper和reducer中以及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 而不是特定的例外。
不过,它可能会有副作用,例如您的代码可能在完全错误的输入上运行,如果不是catch,它可能会更早失败。但发生这种事情的可能性非常小。
编辑:
对于第2点,您可以使用以下方法设置每个跟踪器允许的最大故障数:

conf.setMaxTaskFailuresPerTracker(noFailures);


必须设置的配置是 mapred.max.tracker.failures . 如您所知,默认值为4。对于所有其他Map配置,请参见此处。

相关问题