3

Я пытаюсь использовать NiFi для обработки больших CSV-файлов (по потенциально миллиардам записей каждый) с использованием HDF 1.2. Я реализовал поток, и все отлично работает для небольших файлов.Apache NiFi - OutOfMemory Ошибка: превышен верхний предел GC на процессоре SplitText

Проблема заключается в том, что если я пытаюсь нажать размер файла 100MB (1M записей) Я получаю java.lang.OutOfMemoryError: GC overhead limit exceeded от процессора SplitText ответственного разбиения файла на отдельные записи. Я искал это, и это в основном означает, что сборщик мусора выполняется слишком долго, не получая много кучи. Я ожидаю, что это означает, что слишком много файлов потока генерируются слишком быстро.

Как я могу это решить? Я попытался изменить конфигурацию nifi в отношении максимального пространства кучи и других свойств, связанных с памятью, но ничего не работает.

Прямо сейчас я добавил промежуточный SplitText с количеством строк 1К и что позволяет мне избежать ошибки, но я не вижу в этом виде твердого раствора для того, когда размер входящего файла будет потенциально гораздо более чем это, я боюсь, что получаю такое же поведение от процессора.

Любые предложения приветствуются! Спасибо

ответ

4

Причина ошибки в том, что при расщеплении записей 1M с количеством строк 1 вы создаете файлы потока 1M, которые приравнивают 1M объекты Java. В целом подход использования двух процессоров SplitText является общим и позволяет одновременно создавать все объекты. Вероятно, вы можете использовать еще больший размер сплита на первом расколе, возможно, 10k. Для миллиарда записей мне интересно, имеет ли смысл третий уровень, от 1B до 10M, затем от 10M до 10K, затем от 10K до 1, но мне придется играть с ним.

Некоторые дополнительные вещи, которые следует учитывать, увеличивают размер кучи по умолчанию с 512 МБ, что вы, возможно, уже сделали, а также выясните, действительно ли вам нужно разделить до 1 строки. Трудно сказать, не зная ничего о потоке, но во многих случаях, если вы хотите доставить каждую строку где-нибудь, у вас может быть процессор, который читает в большом файле с разделителями и передает каждую строку в пункт назначения. Например, так работают PutKafka и PutSplunk, они могут взять файл с линиями 1M и передать каждую строку в пункт назначения.

+0

Если у вас нет способа «одного выстрела», я обязательно попробую несколько уровней. Что касается PutKafka, я бы прекратил создание Kafka вместе с NiFi в кластере. Игнорируя тот факт, что это потребует некоторых ресурсов кластера, есть ли преимущества с точки зрения производительности или других точек зрения? Спасибо, как всегда, за полезную информацию о поведении NiFi. – riccamini

+1

Ну, я не обязательно говорил, что вам нужно Kafka как часть этого, я больше спрашивал о том, что вы хотите сделать в своем потоке после того, как вы разделились на 1 строку на файл потока, чтобы убедиться, действительно ли вам нужно это делать , Много раз люди просто хотят доставлять эти строки во внешнюю систему, и в этих случаях может быть возможно иметь процессор, который перетекает в большой файл и отправляет каждую строку где-то, не создавая миллионы файлов потока, кафка и splunk были это всего лишь два примера. –

+0

Мне действительно нужно разделить файлы по строкам, а затем применить другое преобразование/нормализацию в каждом из своих полей. Затем я возвращаюсь к каждой линии и экспортирую все на улей. – riccamini

Смежные вопросы