嗨,我已经写了一个mapreduce的工作,这是一般解析xml文件。我能够解析一个xml文件并正确生成所有的键值对。所以我并联运行6个不同的减速器。
现在我面临的问题是reducer将两个不同的键值对放在同一个文件中,剩余的4个键值放在单个文件中。简而言之,在reducer输出的6个文件中,我得到了4个带有单个键值对的文件,1个带有两个键值对的文件,1个没有任何键值对的文件。
我试着在google和各种论坛上做研究,唯一的结论是我需要一个分区器来解决这个问题。我是新的hadoop,所以有人可以把一些光在这个问题上,并帮助我解决这个问题。
我正在研究一个伪节点集群,并使用java作为编程语言。我不能在这里分享代码,但仍然试图简单地描述这个问题。
让我知道更多的信息是需要的,并提前感谢。
2条答案
按热度按时间ql3eal8s1#
对于6个减速机只有6个键并不是hadoop的最佳利用——虽然6个减速机中的每一个都可以使用单独的减速机,但这并不能保证。
键不能在减速机上分开,所以如果你有少于6个键,那么只有减速机的一个子集有工作要做。您应该考虑重新考虑您的密钥分配(也许输入文件适合hadoop),也许可以使用这样一个系统,即有足够的密钥在reducer中均匀分布。
编辑:我相信你想要的是
MultipleOutputFormat
,该方法generateFileNameForKeyValue(key, value, name)
,允许您为每个键生成一个要写入的文件,而不是每个键只生成一个文件Reducer
.monwx1rj2#
默认情况下,hadoop使用默认的哈希分区器-单击此处,类似
key.hashcode()&integer.max\u value)%numreducetasks将返回一个介于0到numreducetasks之间的数字,在您的示例中,范围是0到5,因为numreducetask=6
捕获就在那一行本身——两个这样的语句可能返回相同的数字。因此,两个不同的键可以连接到同一个减速器。例如-
我会还给你4分,
也会还给你4。
所以,我在这里建议的是,如果您想确保所有6个键都由6个不同的reducer处理,那么您需要创建自己的partitioner来获得所需的内容。
如果您有任何混淆,并且使用job类指定了如下所示的自定义分区器,请查看此链接以创建自定义分区器。
job.setPartitioner(<YourPartionerHere.class>);
希望这有帮助。