我想知道用于创建不同输出文件的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_path-r-00000')。如果您使用c,并且有两个reducer写入相同的失败名称,则要提交的最后一个任务将覆盖已提交的第一个任务的内容,否则会出现错误(我不确定哪个)。
简而言之,a是最佳选择。
关于java - MultipleOutputs与SideEffectFile,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14406765/