我想听听你对分区和倍增的看法。
假设我有一个包含密钥的文件
0:aaa
1:bbb
0:ccc
0:ddd
...
1:zzz
我想有2个文件:一个文件包含密钥开始 0:
另一个包含以 1:
. 我应该使用哪种方法:
1) 使用自定义分区器,它将解析键并为getpartition()返回0或1。
2) 在reduce阶段使用multipleoutputs.write,方法是解析键并提供 zero
或者 one
对于 namedOutput
multipleoutputs.write的参数。
哪一个更好?对我来说,1)更好,因为缩减器处理单个文件。
2条答案
按热度按时间bweufnob1#
当你说第一个选项更好时,这意味着你受两个值的约束。。假设您得到了其他键值,您可能需要将partitioner或cofiguration更改为设置3个reducer,所以更好的方法是使用multipleoutput
5fjcxozz2#
如果您的工作只是将输入文件拆分为两部分,那么多输出是一个更好的选择,因为您可以在shuffle/sort阶段节省时间(通过运行仅Map的工作)。
现在,如果您有很多输入文件,并且不希望输出文件的数量是您有输入文件数量的2倍,那么使用基于分区的方法将允许您将输入文件合并为2个输出(它们不会很好地命名,但是,multipleoutputs的另一个好处是,但是您可以通过在reducer和laxyoutputformat中使用multipleoutputs来轻松地解决这个问题,以确保空的part-r文件不会作为输出写入)。
所以要回答-这取决于你有多少输入文件,以及你想要多少输出文件。