如何限制Hadoop中每个键的最大值?

时间:2013-02-07 21:40:33

标签: configuration hadoop mapreduce

这是我的问题。 我有一个大数据集可以使用,我需要限制每个键的最大值。有时我每个键有10000多个值,这就是我需要的。

那么如何配置我的工作以获得每个键的'x'值? (减少阶段后的任何关键)。

编辑:这是减少源代码。我的主要问题是有时我会得到一个OutOfMemory,这是因为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 个答案:

答案 0 :(得分:2)

我认为你可能会感到困惑,因为减少阶段的记录输出形式为(K,V),而不是(K,{V,V,V})。现在,Map阶段输出的记录的形式为(K,{V,V,V}),并且由减速器决定压缩这些中间值,但它认为合适。如果您正在运行自己的基于Java的MapReduce作业,则可以尝试通过代码限制每个阶段输出的记录数,但这并不完全符合bigdata范例。有必要对您的数据/当前解决方案/所需输出进行更多说明。

答案 1 :(得分:1)

像这样简单的事情不起作用吗?也许我不完全理解你的问题。

reduce(Key key, Iterator<Value> values) {
    int count = 0;
    while (values.hasNext()) {
        if (count < x) {
            // do whatever
            count++;
        } else {
            return;
        }
    }
}

是的,有一些“浪费”,因为每个键的所有值仍然被排序并复制到reducer,但我真的没有看到解决方法。你可以在一个Combiner中做类似的事情,并且每个键只输出x,但是根据你的键/映射器的分布,这只是有点帮助。