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

dtcbnfnu  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(359)

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

xjreopfe1#

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

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

是的,每个键的所有值仍然被排序并复制到reducer中,这是一种“浪费”,但我并没有找到解决这个问题的方法。你可以在一个组合器中做类似的事情,让它只为每个键输出x,但是根据你的键/Map器的分布,这只会有一点点帮助。

lsmepo6l

lsmepo6l2#

我认为您可能会感到困惑,因为reduce阶段输出的记录的格式是(k,v),而不是(k,{v,v,v})。现在,map阶段输出的记录的格式是(k,{v,v,v}),由reducer来压缩这些中间值。如果您正在运行自己的基于java的mapreduce作业,可以尝试通过代码限制每个阶段输出的记录数,但这并不完全符合bigdata范式。有必要对您的数据/当前解决方案/所需输出进行更多的说明。

相关问题