Мой вариант использования такой. У меня есть несколько таблиц X, которые нужно извлечь из MySQL. Я разделяю их с помощью SplitText, чтобы поместить каждую таблицу в отдельный файл потока и извлекать с помощью GenerateTableFetch и ExecuteSQL.

И я хочу получить уведомление или выполнить какое-то другое действие, когда импорт будет выполнен для всех таблиц. В текстовом процессоре SplitText я направил отношение original к Wait на ${filename} с целевым счетчиком ${fragment.count}. Это будет отслеживать, сколько таблиц сделано.

Но теперь я не могу понять, как узнать, когда определенная таблица готова. GenerateTableFetch разделяет файл потока на несколько в зависимости от размера раздела. Но он не записывает такие атрибуты, как fragment.count, которые я могу использовать для ожидания для каждой таблицы.

Есть ли способ добиться этого? Или, может быть, есть способ узнать в конце всего потока, все ли файлы потока в потоке были обработаны, и ничего не находится в очереди или не обрабатывается?

2
pratpor 15 Сен 2018 в 20:08

2 ответа

Лучший ответ

Пока NiFi не добавил поддержку этого, мне удалось заставить его работать, используя MergeContent. Используйте table_name как Correlation attribute name, а затем используйте отношение merged к процессору Wait, используя ${merge.count} в качестве цели. Обратитесь к скриншотам, если кто-то хочет сделать то же самое.

enter image description here

MergeContent processor

Wait processor

1
pratpor 18 Сен 2018 в 18:43

Если у вас есть автономный экземпляр NiFi (или вы не распространяете файлы потока среди кластера на узлы ExecuteSQL), вы можете вместо этого использовать QueryDatabaseTable, он (по умолчанию) будет выдавать все файлы потока только при обработке всего набора результатов. Если у вас есть все строки в одном потоковом файле, то тот факт, что потоковый файл был передан ниже по потоку, является показателем того, что выборка завершена.

Я написал NIFI-5601, чтобы рассказать об улучшении добавления атрибутов фрагмента. * для передачи файлов, созданных GTF.

2
mattyb 15 Сен 2018 в 17:36