分区程序或多输出

时间:2013-11-30 05:35:05

标签: hadoop mapreduce hadoop-partitioning reducers partitioner

我想就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参数提供onenamedOutput

哪一个更好?对我来说,1)更好,因为Reducer处理单个文件。

2 个答案:

答案 0 :(得分:0)

如果你的工作只是将输入文件分成两部分,那么MultipleOutputs是一个更好的选择,因为你可以节省洗牌/排序阶段(通过运行一个只有地图的工作)。

现在,如果您有大量输入文件,并且不希望输入文件的数量是输入文件的2倍,那么使用基于分区器的方法将允许您将输入文件合并为2个输出(它们不会是但是很好地命名了MultipleOutputs的另一个好处,但你可以通过在reducer和LaxyOutputFormat中使用MultipleOutputs来确保空的part-r文件不会被写为输出来轻松解决这个问题。

所以要回答 - 这取决于你有多少输入文件,以及你想要多少输出文件。

答案 1 :(得分:0)

当你说第一个选项更好时意味着你绑定2个值..假设你得到其他键值你可能需要更改你的分区器或cofiguration来设置3个reducer,所以更好的想法是使用multipleoutputs