【问题标题】:What's the effective way to count rows in Pig?在 Pig 中计算行数的有效方法是什么?
【发布时间】:2015-05-11 23:27:56
【问题描述】:

在 Pig 中,获取计数的有效方法是什么?我们可以做一个 GROUP ALL,但是只给了 1 个 reducer。当数据量很大时,比如 n TB,我们可以尝试多个 reducer 吗?

  dataCount = FOREACH (GROUP data ALL) GENERATE 
    'count' as metric,
    COUNT(dataCount) as value;

【问题讨论】:

标签: apache-pig reducers


【解决方案1】:

您可以将其分为两个步骤,而不是直接使用GROUP ALL。首先,按某个字段分组并计算行数。然后,执行GROUP ALL 将所有这些计数相加。这样,您就可以并行计算行数。

但是请注意,如果您在第一个 GROUP BY 中使用的字段没有重复项,则结果计数将全部为 1,因此不会有任何差异。尝试使用具有许多重复项的字段来提高其性能。

看这个例子:

a;1
a;2
b;3
b;4
b;5

如果我们首先按第一个字段进行分组,其中有重复项,最终的 COUNT 将处理 2 行而不是 5 行:

A = load 'data' using PigStorage(';');
B = group A by $0;
C = foreach B generate COUNT(A);
dump C;
(2)
(3)
D = group C all;
E = foreach D generate SUM(C.$0);
dump E;
(5)

但是,如果我们按唯一的第二个分组,它将处理 5 行:

A = load 'data' using PigStorage(';');
B = group A by $1;
C = foreach B generate COUNT(A);
dump C;
(1)
(1)
(1)
(1)
(1)
D = group C all;
E = foreach D generate SUM(C.$0);
dump E;
(5)

【讨论】:

    【解决方案2】:

    我只是在这个主题上再深入一点,如果您使用的是最新的 pig 版本,您似乎不必担心单个 reducer 将不得不处理大量数据。 代数 UDF-s 将智能处理 COUNT,并在映射器上计算。所以reducer只需要处理聚合数据(计数/映射器)。 我认为它是在 0.9.1 中引入的,但0.14.0 肯定有它

    代数接口

    聚合函数是一个 eval 函数,它接受一个包并返回 一个标量值。许多聚合的一个有趣且有用的属性 功能是它们可以在分布式中增量计算 时尚。我们称这些函数为代数函数。 COUNT 是一个例子 代数函数,因为我们可以计算一个元素的数量 数据的子集,然后将计数相加以产生最终输出。 在 Hadoop 世界中,这意味着部分计算可以 由 map 和 combiner 完成,最终结果可由下式计算 减速机。

    但我之前的回答肯定是错的:

    在分组中你可以使用PARALLEL n关键字来设置 减速器的数量。

    通过指定reduce的数量来增加作业的并行度 任务, n. n 的默认值为 1(一个 reduce 任务)。

    【讨论】:

    • GROUP ALL 生成一组,一组必须只在一个reducer中。因此PARALLEL 在这种情况下无济于事。
    • 那么默认并行呢? SET default_parallel 20; ?
    • 每组只在一个节点上执行,与并行度、默认并行等无关。如果你使用group all,那么无论你在一个节点上都有一个巨大的组并行度。
    • 可能因为 Balduz 所说的相同原因,默认并行不起作用。但是在这里我发现了一些东西:pig.apache.org/docs/r0.11.1/perf.html#parallelpig.exec.reducers.bytes.per.reducer - 定义每次减少的输入字节数;默认值为 1000*1000*1000 (1GB)。
    • 再次......每个组都在一个节点和仅节点中执行。正如您在官方文档中看到的那样,无论并行级别如何,group all 仅在一个节点中执行,因为它将替换为 1:pig.apache.org/docs/r0.11.1/…
    猜你喜欢
    • 2011-07-13
    • 2013-01-23
    • 2012-08-14
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    • 2017-06-13
    相关资源
    最近更新 更多