我想就Partitioner vs MultipleOutputs发表您的意见 假设我有一个包含键的文件
0:aaa
1:bbb
0:ccc
0:ddd
...
1:zzz
我想要2个文件:一个文件包含以0:
开头的密钥,另一个文件包含以1:
开头的密钥。我应该使用哪种方法:
1)使用自定义分区程序,它将解析密钥并为getPartition()返回0或1
2)在reduce阶段使用MultipleOutputs.write,解析密钥并为MultipleOutputs.write的zero
参数提供one
或namedOutput
。
哪一个更好?对我来说,1)更好,因为Reducer处理单个文件。
答案 0 :(得分:0)
如果你的工作只是将输入文件分成两部分,那么MultipleOutputs是一个更好的选择,因为你可以节省洗牌/排序阶段(通过运行一个只有地图的工作)。
现在,如果您有大量输入文件,并且不希望输入文件的数量是输入文件的2倍,那么使用基于分区器的方法将允许您将输入文件合并为2个输出(它们不会是但是很好地命名了MultipleOutputs的另一个好处,但你可以通过在reducer和LaxyOutputFormat中使用MultipleOutputs来确保空的part-r文件不会被写为输出来轻松解决这个问题。
所以要回答 - 这取决于你有多少输入文件,以及你想要多少输出文件。
答案 1 :(得分:0)
当你说第一个选项更好时意味着你绑定2个值..假设你得到其他键值你可能需要更改你的分区器或cofiguration来设置3个reducer,所以更好的想法是使用multipleoutputs