1

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

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

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

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

4

2 回答 2

2

您可以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而不是特定的例外。

但是,它可能会产生副作用,例如您的代码可能会在完全错误的输入上运行,而且如果不是捕获它,它会更早地失败。但是发生这种事情的可能性很小。

编辑:

对于您的第 2 点,您可以使用以下命令设置每个跟踪器允许的最大故障数:

        conf.setMaxTaskFailuresPerTracker(noFailures);

或者

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

于 2013-02-25T22:06:43.840 回答
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  \
于 2014-03-03T23:36:03.207 回答