我想知道用于创建不同输出文件的MultipleOutputs与FSDataOutputStream与Task Side Effect File之间的优点/区别吗?

一种。使用MultipleOutputs:

MultipleOutputs mos;

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

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

b。使用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()所确定的路径。

将所需的输出写入除输出路径以外的路径的最佳方法是哪种?

最佳答案

a和c或多或少是同一件事,并且比b具有明显的优势,因为它们由输出提交者管理。

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

a和c不会出现此问题,因为它们将输出到HDFS上的临时任务尝试文件夹,而在执行任务尝试时,其内容将移至实际的输出文件夹(因此您不会遇到推测执行问题) 。

与c相比,a也是更好的选择,因为它管理文件的唯一性-每个文件都使用附加的任务ID命名(对于您的示例为'desired_pa​​th-r-00000')。如果您使用c,并且有两个reducer写入相同的失败名称,则要提交的最后一个任务将覆盖已提交的第一个任务的内容,否则会出现错误(我不确定哪个)。

简而言之,a是最佳选择。

关于java - MultipleOutputs与SideEffectFile,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14406765/

10-10 22:11