0

这是我的问题。我有一个大数据集可以使用,我需要限制每个键的最大值。有时我每个键有 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);
    }
4

2 回答 2

2

我认为您可能会感到困惑,因为 reduce 阶段的记录输出形式为 (K,V),而不是 (K, {V,V,V})。现在,从 Map 阶段输出的记录采用 (K, {V,V,V}) 的形式,并且由 reducer 来压缩这些中间值,但它认为合适。如果您正在运行自己的基于 Java 的 MapReduce 作业,您可以尝试通过代码限制每个阶段输出的记录数,但这并不完全符合大数据范式。有必要进一步澄清您的数据/当前解决方案/所需输出。

于 2013-02-07T21:50:36.943 回答
1

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

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

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

于 2013-02-07T22:14:21.487 回答