Как повысить производительность задания PIG, использующего гиперлоглог Datafu для оценки кардинальности?

Я использую Datafu Hyperloglog UDF для оценки количества уникальных идентификаторов в моем наборе данных. В этом случае у меня есть 320 миллионов уникальных идентификаторов, которые могут появляться в моем наборе данных несколько раз.

Dataset : Country, ID.

Вот мой код:

REGISTER datafu-1.2.0.jar;

DEFINE  HyperLogLogPlusPlus datafu.pig.stats.HyperLogLogPlusPlus();

-- id is a UUID, for example : de305d54-75b4-431b-adb2-eb6b9e546014 
all_ids =
LOAD '$data'
USING PigStorage(';') AS (country:chararray, id:chararray);

estimate_unique_ids =
FOREACH (GROUP all_ids BY country)
GENERATE
    'Total Ids' as label,
    HyperLogLogPlusPlus(all_ids) as reach;

STORE estimate_unique_ids INTO '$output' USING PigStorage();

Используя 120 редукторов, я заметил, что большинство из них завершаются в течение нескольких минут. Однако несколько редукторов были перегружены данными и работали вечно. Я убил их через 24 часа.

Я думал, что Hyperloglog более эффективен, чем реальный подсчет. Что здесь происходит не так?


person mnadig    schedule 16.07.2015    source источник
comment
У вас, скорее всего, есть несколько стран с большинством идентификаторов (т.е. ваши данные искажены). Таким образом, большая часть ваших данных отправляется на 1 редуктор. Это рассматривается здесь (но, похоже, не решено). stackoverflow.com/questions/12867846/   -  person gobrewers14    schedule 18.07.2015


Ответы (1)


В DataFu 1.3.0 реализована алгебраическая реализация HyperLogLog был добавлен. Это позволяет UDF использовать объединитель и, вероятно, улучшит производительность в ситуациях с перекосами.

Однако в комментарии в выпуске Jira обсуждают некоторые другие проблемы с производительностью, которые могут возникнуть при использовании HyperLogLog. Соответствующая цитата ниже:

Следует помнить, что каждый экземпляр HyperLogLogPlus выделяет довольно большой массив байтов. Я не могу вспомнить точные числа, но я думаю, что для точности по умолчанию 20 это сотни КБ. Итак, в вашем примере, если мощность «a» велика, вы собираетесь выделить много больших массивов байтов, которые необходимо будет передать от объединителя к редуктору. Поэтому я бы не стал использовать его в ситуациях «группировать по», если вы не знаете, что мощность ключа довольно мала. Этот UDF лучше подходит для сценариев «сгруппировать все», когда у вас много входных данных. Кроме того, если входные данные намного меньше, чем массив байтов, вам может быть хуже с использованием этой UDF. Если вы можете принять худшую точность, массив байтов можно уменьшить.

person Eyal    schedule 07.03.2016