Какой эффективный способ подсчета строк в Pig?

Каков эффективный способ подсчета в Pig? Мы можем выполнить GROUP ALL, но для этого дан только 1 редуктор. Когда размер данных очень велик, скажем, n терабайт, можем ли мы как-нибудь попробовать несколько редукторов?

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

person Freya Ren    schedule 11.05.2015    source источник
comment
Возможный дубликат PIG, как подсчитать количество строк в псевдоним   -  person WattsInABox    schedule 13.01.2016


Ответы (2)


Вместо того, чтобы напрямую использовать 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)
person Balduz    schedule 12.05.2015

Я просто немного покопаюсь в этой теме, и, похоже, вам не нужно бояться, что одному редуктору придется обрабатывать огромное количество данных, если вы используете последнюю версию Pig. Алгебраические UDF-ы будут обрабатывать COUNT smart, и оно рассчитывается в картографе. Таким образом, редуктору просто нужно иметь дело с агрегированными данными (counts / mapper). Я думаю, что он появился в 0.9.1, но в 0.14.0 определенно есть Это

Алгебраический интерфейс

Агрегатная функция - это функция eval, которая принимает сумку и возвращает скалярное значение. Одним интересным и полезным свойством многих агрегатных функций является то, что их можно вычислять постепенно, распределенным образом. Мы называем эти функции алгебраическими. COUNT - это пример алгебраической функции, потому что мы можем подсчитать количество элементов в подмножестве данных, а затем суммировать счетчики для получения окончательного результата. В мире Hadoop это означает, что частичные вычисления могут выполняться картой и объединителем, а конечный результат может быть вычислен редуктором.

Но мой предыдущий ответ был определенно неправильным:

В группировке вы можете использовать ключевое слово PARALLEL n, которое устанавливает количество редукторов.

Увеличьте параллелизм задания, указав количество сокращаемых задач n. Значение по умолчанию для n - 1 (одна задача сокращения).

person kecso    schedule 12.05.2015
comment
GROUP ALL генерирует одну группу, и группа должна быть только в одном редукторе. Поэтому PARALLEL в этой ситуации не поможет. - person Balduz; 12.05.2015
comment
А как быть с параллельным по умолчанию? SET default_parallel 20;? - person kecso; 12.05.2015
comment
Каждая группа выполняется только в ОДНОМ узле, не имеет значения уровень параллелизма, параллелизм по умолчанию и т. Д. Если вы используете group all, у вас есть огромная группа только в одном узле, независимо от уровня параллелизма. - person Balduz; 12.05.2015
comment
Вероятно, параллель по умолчанию не работает по той же причине, что сказал Бальдуз. Но здесь я кое-что нашел: pig.apache.org/docs/r0. 11.1 / perf.html # parallel pig.exec.reducers.bytes.per.reducer - определяет количество входных байтов на сокращение; значение по умолчанию - 1000 * 1000 * 1000 (1 ГБ). - person kecso; 12.05.2015
comment
Опять же ... каждая группа выполняется в одном узле и только на одном узле. Как видно из официальной документации, group all выполняется только в ОДНОМ узле независимо от уровня параллельности, поскольку он заменяет его на 1: pig.apache.org/docs/r0.11.1/ - person Balduz; 12.05.2015
comment
Да, это явно упомянуто для ключевого слова PARALLEL. Теперь мне стало любопытно, поэтому я попробую, что делает pig.exec.reducers.bytes.per.reducer в этом случае :) (возможно, вы правы, и это тоже не помогает ... посмотрим) - person kecso; 12.05.2015
comment
Безуспешно, в этом случае ничего не происходит. (проверено) Ты прав, Балдуз. - person kecso; 12.05.2015