NiFi - Повышение производительности QueryDatabaseTable, превосходящее Sqoop - PullRequest
0 голосов
/ 03 октября 2019

Я использую QueryDatabaseTable для чтения из таблицы PDA / Netezza, в которой имеется около 70 миллионов строк.

Nifi настроен как отдельный узел, а bootstrap.conf отредактирован для предоставления 16 г ОЗУ.

Таблица QueryDatabase использует значения по умолчанию, за исключением

  • Max Rows Per Flow File: 1000000
  • Output Batch Size: 10

В результате получается, чтозаймет довольно много времени, 1,5 часа для полной 70M, или ок. 1M записей в минуту.

  1. Существуют ли другие изменения конфигурации, с которыми я могу поэкспериментировать для повышения производительности?
  2. QueryDatabaseTable внутренне преобразует в Avro, возможно ли пропустить это преобразование и просто использоватьвместо текстового формата из КПК / Netezza возможно повысить производительность?

Планируется также в ближайшее время настроить кластер, но это будет 4 или 6 узлов, поэтому все еще стремятся повысить производительность до 10 минут или меньше. Это возможно?

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

QueryDatabaseTable предназначен для запуска только на первичном узле, так как это один источник для извлечения. Это означает, что он не будет масштабироваться до распределенного / параллельного решения, такого как Sqoop. Также, если гипотетически у вас есть 3 узла в кластере NiFi, но 10 в кластере Hadoop с Sqoop, естественно, вы получите больше параллелизма в последнем.

Однако для этого у NiFi есть шаблон GenerateTableFetch -> ExecuteSQL. Вместо одного процессора на одном узле, выполняющего полную выборку, GenerateTableFetch будет генерировать несколько потоковых файлов, каждый из которых содержит инструкцию SQL для извлечения «страницы» данных из таблицы. Затем вы можете использовать ExecuteSQL для фактического извлечения строк.

GenerateTableFetch по-прежнему выполняется только на первичном узле, но не извлекает сами строки;вместо этого вы распределяете файлы потока между узлами кластера, используя Remote Process Group -> Input Port в том же кластере, или в последних версиях NiFi вы можете использовать соединение с балансировкой нагрузки между GenerateTableFetch и ExecuteSQL.

Как толькофайлы потока распределяются по кластеру, каждый узел может параллельно запускать на них ExecuteSQL и извлекать страницу данных за раз для последующей обработки.

Для выходного формата, начиная с NiFi 1.8.0, существует ExecuteSQLRecordкоторый позволяет вам выводить строки в любом формате, который имеет RecordSetWriter, который включает в себя Avro, JSON, CSV, XML, свободный текст (для пользовательских текстовых форматов), и вы даже можете создавать собственные сценарии для более сложных, проприетарных или текущихнеподдерживаемые форматы. Для полноты есть также процессор QueryDatabaseTableRecord, но для этого ответа я хотел бы отговорить вас использовать его для решения вашего варианта использования:)

0 голосов
/ 04 октября 2019

По моему мнению, 1M строк в час слишком медленно для системы Netezza.

  • Внешние таблицы / выгрузка должны быть в 50-100 раз быстрее
  • single Выберите через ODBC быстрый клиент (я использовал powercenter и SAS) в 5-10 раз быстрее

Обратите внимание, что минимальное время запроса в Netezza близко к 1/8 секунды, что означает, что вам нужно получать полное значение для «денег» в каждом запросе (вполне возможно, кстати), и я подозреваю, что ваш фреймворк пытается«чрезмерно оптимизировать» это за кадром:)

...