2

我想知道 MultipleOutputs vs FSDataOutputStream vs Task Side Effect File 用于创建不同输出文件的优势/差异?

一种。使用多个输出:

MultipleOutputs mos;

void configure()
{
    mos.new MultipleOutputs(conf);
}

reduce()
{
    mos.getCollector("desired_path", reporter).collect(new Text(key), new Text(val));
}

湾。使用 FSDataOutputream,我们将输出写入文件系统中所需的路径,如下所示:

    void configure()
   {
       fs = FileSystem.get(conf);
   }


    void reduce()
   {

       Path op = "/custom_path";
   FSDataOutputStream dst = fs.create(op);
   dst.writeBytes(t+" "+uidi+" "+str_sizeval); 
   }            

C。使用任务副作用文件。在这里,我们使用上面的 FSDataOutputStream 将输出写入 FileOutputFormat.getWorkOutputPath() 返回的路径,而不是使用自定义的所需路径。

将所需输出写入输出路径以外的路径的最佳方法是什么?

4

1 回答 1

2

a & c 或多或少是相同的东西,并且与 b 相比具有明显的优势,因为它们由输出提交者管理。

将 b 与推测执行结合使用意味着您要么会得到一个错误(两个东西试图写入同一个文件),要么可能会损坏结果。

a & c 没有这个问题,因为它们正在输出到 HDFS 上的临时任务尝试文件夹,当提交任务尝试时,其内容会移动到实际输出文件夹(因此您不会遇到推测执行的问题) .

a 也是比 c 更好的选择,因为它管理文件的唯一性 - 每个文件都用一个额外的任务 ID 命名(例如“desired_pa​​th-r-00000”)。如果你使用 c,并且有两个 reducer 写入相同的失败名称,最后一个提交的任务将覆盖第一个提交的任务的内容,否则你会得到一个错误(我不确定是哪个)。

所以简而言之,a 是最好的选择。

于 2013-01-19T12:55:54.563 回答