По какой-то причине этот скрипт порождает 60 000 картографических заданий на небольшом входе:
A1 = LOAD '$directory1' USING CustomLoader AS key:chararray;
A = FOREACH A1 GENERATE CustomParser(key) AS key:chararray;
B = LOAD '$filename1' USING PigStorage AS (key:chararray);
result = JOIN A BY key, B BY key USING 'replicated';
directory1 содержит несколько файлов, которые составляют около 10 000 строк данных, а filename1 также содержит ~10 000 строк данных, все из которых по существу являются короткими строками. И каталог, и файл хранятся в HDFS. Ни один из них не является особенно большим, в масштабе от 10 до 100 килобайт. Однако, когда я запускаю скрипт в Hadoop, он порождает 60 000 картографических заданий. Это приводит к множеству других проблем - иногда диспетчеру приложений не хватает памяти, иногда он зависает на этапе перемешивания и другим ошибкам нехватки памяти различного рода.
Не похоже, что для такого небольшого входа нужно создавать так много разбиений. Я пытался увеличить max.CombinedSplitSize, mapred.min.split.size и dfs.block.size, но ничего не повлияло на количество карт (что имеет смысл, потому что я работаю с небольшим количеством небольших файлов) . Потенциально я мог бы продолжать увеличивать ресурсы, затрачиваемые на работу, но в какой-то степени эти значения находятся вне моего контроля.
Возможно, стоит отметить, что этот скрипт отлично работает локально — эта проблема возникает только тогда, когда он работает в реальном кластере Hadoop и фактически читает из HDFS.
Кто-нибудь еще сталкивался с подобной проблемой, и если да, то что вы изменили, чтобы решить проблему?