Ограничить количество файлов (блоков) в наборе данных hadoop?

У меня проблема с набором данных hadoop, разбитым на слишком много блоков данных.

  1. Учитывая уже существующий набор данных hadoop, есть ли способ объединить его блоки в меньшее, но большее количество блоков?

  2. Есть ли способ дать pig или же hadoop-streaming.jar (cloudera) верхний предел количества блоков, на которые они делят вывод?

1 ответ

Решение
  1. Если вы хотите больший размер блока, установите желаемый размер блока в соответствующем задании только в сценарии PIG.

    set dfs.block.size 134217728;

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

max(minsplitsize, min(maxsplitsize, blocksize))

set mapred.min.split.size 67108864
  1. Ограничение количества созданных блоков невозможно, оно должно контролироваться minsplitsize, maxsplitsize а также blocksize только параметры.

Другим вариантом для уменьшения количества выходных файлов является случайная группировка. Вы можете посмотреть на следующий пример сценария Pig (заменив original, original_fields и произвольно выбранное число 100 на их реальные, разумные замены):

with_rnd = FOREACH original GENERATE *, (int)(RANDOM() * 100) AS rnd;

grouped = GROUP with_rnd BY rnd;

flattened = FOREACH grouped GENERATE FLATTEN(with_rnd);

output = FOREACH flattened GENERATE original_fields;

Очевидно, что это технически ненужная работа, но если ваша функция хранилища не предоставляет другого способа сделать это, она будет работать. Также обратите внимание, что при этом не будет создано 100 файлов, но разумно выбранное число для группировки значительно сократит объем, особенно если исходные данные были сильно отфильтрованы и имели много небольших файлов.

Другие вопросы по тегам