这是我的问题。我有一个大的数据集要处理,我需要限制每个键的最大值。有时每个键有10000+个值,这是我所需要的。
那么,如何配置我的作业,使每个键只获得“x”值呢(任何键)后减少阶段。
编辑:这是reduce源代码。我的主要问题是,有时我的内存不足,这是因为stringbuilder变得很大。
也许有一种方法可以通过配置说,“我只需要每个键10.000个值”。如果没有,我必须在我的减速机中添加一些额外的代码。。。
public void reduce(Text domain, Iterable<Text> inLinks, Context context) throws IOException,
InterruptedException {
allInlinks = new StringBuilder();
for (Text text : inLinks) {
allInlinks.append(text.toString());
allInlinks.append(",");
}
allLinksText.set(allInlinks.toString());
context.write(domain, allLinksText);
}
2条答案
按热度按时间xjreopfe1#
像这样简单的事情不管用吗?也许我没有完全理解你的问题。
是的,每个键的所有值仍然被排序并复制到reducer中,这是一种“浪费”,但我并没有找到解决这个问题的方法。你可以在一个组合器中做类似的事情,让它只为每个键输出x,但是根据你的键/Map器的分布,这只会有一点点帮助。
lsmepo6l2#
我认为您可能会感到困惑,因为reduce阶段输出的记录的格式是(k,v),而不是(k,{v,v,v})。现在,map阶段输出的记录的格式是(k,{v,v,v}),由reducer来压缩这些中间值。如果您正在运行自己的基于java的mapreduce作业,可以尝试通过代码限制每个阶段输出的记录数,但这并不完全符合bigdata范式。有必要对您的数据/当前解决方案/所需输出进行更多的说明。