1

我有一个 reducer,它需要将结果输出到不同的目录,以便我们以后可以将输出用作 Hive 作为分区表的输入。(Hive 基于文件夹名称创建分区)。为了写出这些位置,我们目前没有使用任何 Hadoop 框架来完成这项工作,我们只是在“Hadoop 背后”的不同位置写出,可以这么说。换句话说,我们没有使用 hadoop 的 API 来输出这些文件。

我们遇到了mapred.reduce.tasks.speculative.executionset to的问题true。我理解是这种情况,因为同一任务的多个任务尝试正在写入同一位置。

有没有办法正确使用Hadoop的API从同一个reducer输出到几个不同的文件夹,这样我也可以使用mapred.reduce.tasks.speculative.execution=true?(我知道 MultipleOutputs,我不确定它是否支持推测执行。)

如果是这样,有没有办法做到这一点输出到 S3?

4

2 回答 2

3

Hadoop 通常处理推测执行的方式是为每个任务尝试创建一个输出文件夹(在实际 HDFS 输出目录的 _temporary 子文件夹中)。

当任务成功时, OutputCommitterfor OutputFormatthen 只是将临时任务文件夹的内容移动到实际的输出文件夹,并删除那些失败/中止的其他临时任务文件夹(这是大多数FileOutputFormats 的默认行为)

因此,对于您的情况,如果您要写入作业输出文件夹之外的文件夹,那么您需要扩展/实现自己的输出提交程序。在创建文件时,我会遵循相同的原则——包括完整的任务 ID(包括尝试 ID),以避免在推测执行时发生名称冲突。如何跟踪作业中创建的文件并管理中止/失败场景中的删除取决于您(可能是任务 ID 的一些文件通配符?)

于 2013-02-12T02:47:06.203 回答
0

您可能对此感兴趣: http: //hadoop.apache.org/docs/r2.3.0/api/org/apache/hadoop/mapreduce/lib/output/MultipleOutputs.html

于 2014-04-08T04:49:38.773 回答