【问题标题】:Hadoop Reducer: How can I output to multiple directories using speculative execution?Hadoop Reducer:如何使用推测执行输出到多个目录?
【发布时间】:2013-01-27 06:25:04
【问题描述】:

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

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

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

如果是这样,有没有办法将输出到S3?

【问题讨论】:

    标签: hadoop speculative-execution


    【解决方案1】:

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

    OutputFormatOutputCommitter 然后在任务成功时简单地将临时任务文件夹的内容移动到实际输出文件夹,并删除那些失败/中止的其他临时任务文件夹(这是默认行为对于大多数FileOutputFormats)

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

    【讨论】:

    • MultipleOutputs 是否以某种方式自动支持推测执行? (我假设“不”。)
    • 是的 - 就像我说的,reducer 输出被写入临时子文件夹 - MultipleOutputs 也将其输出放入这个临时子文件夹
    • 那么我可以使用自定义的 MultipleOutputs 代替自定义的 OutputCommitter,还是除此之外还需要扩展 OutputCommitter?
    • 如果您想将所有内容输出到相同的输出目录(如 part-r-xxxxx)文件,那么您只需要使用 MultipleOutputs。即使您不这样做,也只需在作业完成后移动它们
    【解决方案2】:
    猜你喜欢
    • 1970-01-01
    • 2015-07-15
    • 2014-07-19
    • 2013-11-18
    • 2014-06-04
    • 2015-06-30
    • 2013-02-16
    • 2014-06-09
    • 1970-01-01
    相关资源
    最近更新 更多