我有一个需要将结果输出到不同目录的reducer,以便我们以后可以将输出作为Hive的输入用作分区表。 (Hive根据文件夹名称创建分区)。为了写出这些位置,我们目前没有使用任何Hadoop框架来实现这一点,我们只是写到“Hadoop背后”的不同位置,可以这么说。换句话说,我们没有使用hadoop的API来输出这些文件。
我们遇到mapred.reduce.tasks.speculative.execution
设置为true
的问题。我理解这种情况是因为同一任务的多个任务尝试写入同一位置。
有没有办法正确使用Hadoop的API从同一个reducer输出到几个不同的文件夹,这样我也可以使用mapred.reduce.tasks.speculative.execution=true
? (我知道MultipleOutputs,我不确定是否支持推测性执行。)
如果是这样,有没有办法将和输出到S3?
答案 0 :(得分:3)
Hadoop通常处理推测性执行的方式是为每个任务尝试创建一个输出文件夹(在实际HDFS输出目录的_temporary子文件夹中)。
OutputCommitter
的{{1}}然后只是在任务成功时将临时任务文件夹的内容移动到实际的输出文件夹,并删除那些失败/中止的其他临时任务文件夹(这是大多数OutputFormat
s)
因此,对于您的情况,如果您正在写入作业输出文件夹之外的文件夹,那么您将需要扩展/实现您自己的输出提交者。我在创建文件时遵循相同的原则 - 包括完整的任务ID(包括尝试ID),以避免在推测性执行时发生名称冲突。如何跟踪在作业中创建的文件并在中止/失败方案中管理删除取决于您(对于任务ID可能有一些文件?)
答案 1 :(得分:0)