我想就Partitioner与MultipleOutputs提出您的意见。
假设我有一个文件,其中包含密钥
0:aaa
1:bbb
0:ccc
0:ddd
...
1:zzz
我想要2个文件:一个文件包含以
0:
开头的键,另一个文件包含以1:
开头的键。我应该使用哪种方法:1)使用自定义分区程序,它将解析键并为getPartition()返回0或1。
2)在归约阶段,通过解析键并为MultipleOutputs.write的
zero
参数提供one
或namedOutput
,使用MultipleOutputs.write。哪一个更好?对我来说,1)更好,因为reduces处理单个文件。
最佳答案
如果您的工作只是将输入文件分为两部分,那么MultipleOutputs是一个更好的选择,因为您可以保存在shuffle / sort阶段(通过运行仅映射作业)。
现在,如果您有很多输入文件,并且不希望输入的文件数量是输入文件的2倍,那么使用基于分区的方法将允许您将输入文件合并为2个输出(但是它们的名字不会很好用) ,这是MultipleOutputs的另一个好处,但是您可以通过在reducer和LaxyOutputFormat中使用MultipleOutputs来确保不将空的part-r文件写入输出中,从而轻松解决此问题。
因此,答案-这取决于您拥有多少个输入文件,以及想要多少个输出文件。