Как вы улучшаете производительность в работе со свиньями, у которой есть очень искаженные данные?

Я запускаю сценарий PIG, который выполняет GROUP BY и вложенный FOREACH, выполнение которого занимает несколько часов из-за одной или двух задач сокращения. Например:

B = GROUP A BY (fld1, fld2) parallel 50;

C = FOREACH B {
   U = A.fld1;
   DIST = DISTINCT U;
   GENERATE FLATTEN(group), COUNT_STAR(DIST);
}

Изучив счетчики для медленных задач, я понял, что похоже, что два редуктора обрабатывают намного больше данных, чем другие задачи. В основном, я понимаю, что данные очень искажены, и поэтому задачи, которые "медленный" на самом деле делают больше работы, чем быстрые задачи. Я'Мне просто интересно, как улучшить производительность? Я ненавижу увеличивать параллелизм, пытаясь разделить работу, но разве это единственный путь?

Ответы на вопрос(1)

Первый вариант - использовать пользовательский разделитель.Проверьте документацию наGROUP для получения дополнительной информации (проверитьPARTITION BYконкретно). К сожалению, вам, вероятно, придется написать свой собственный разделитель здесь. В своем настраиваемом секционере отправьте первый огромный набор ключей в редуктор 0, отправьте следующий набор в редуктор 1, а затем выполните стандартное разбиение хеша на чтоосталось. Это позволяет одному редуктору работать исключительно с большими, а другие получают несколько наборов ключей. Это неТем не менее, я всегда решаю проблему с плохим перекосом.

Насколько ценен счет для этих двух огромных наборов данных? Я вижу огромный перекос, когда такие вещи, какNULL или пустая строка. Если они неt, что ценно, отфильтруйте их перед.GROUP BY

Ваш ответ на вопрос