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, но для этого ответа я хотел бы отговорить вас использовать его для решения вашего варианта использования:)