2017-01-31 10 views
2

У меня есть скрипт python, который принимает аргументы командной строки для дешифрования файла. Команда питона будет выполняться выглядит следующим образом:Apache Nifi: файлы с использованием GetFile в ExecuteProcess

python decrypt.py -f "file_to_decrypt.enc" -k "private_key_file.txt"

Я пытаюсь забрать эти файлы вверх, используя GetFile процессор в NiFi, который делает работу собирания их, так как я могу видеть имена файлов в журналах.

С другой стороны, у меня есть настройка процесса ExecuteProcess для запуска скрипта python, как указано выше. Однако мне понадобятся имена файлов, которые будут переданы в ExecuteProcess для работы скрипта Python. Поэтому мой вопрос заключается в том, как я могу передать файлы с GetFile в ExecuteProcess process в Apache NiFi?

ответ

4

Вы можете использовать процессор ExecuteStreamCommand вместо ExecuteProcess. Этот процессор принимает входящий файл потока и может обращаться к атрибутам и контенту, тогда как ExecuteProcess - это источник и не принимает входящие файлы потоков.

Я не знаю, нужно ли вам GetFile (получает содержимое файлов); попробуйте ListFile и RouteOnAttribute, чтобы отфильтровать два имени файла, которые вы хотите. Слейте два успешных списка в один файл потока с MergeContent, затем используйте атрибуты и язык выражения ${filename}, чтобы заполнить аргументы команды с и y.txt.

Update

Я построил a template, который выполняет следующие задачи:

  1. Создает файл ключа примера (не действительный ключ)
  2. генерирует пример зашифрован файл данных (не действует шифр текст)
  3. ListFile, UpdateAttribute, RouteOnAttribute, MergeContent, и ExecuteStreamCommand для выполнения командной строки Python расшифровку (осмеян echo)

Примечание, это использует функцию ifElse() языка выражение, которое в настоящее время находится в Nifi master, но еще не выпущен. Это часть выпуска 1.2.0, но если вы построите его с master, вы можете использовать его сейчас.

NiFi ExecuteStreamCommand Template

Я все еще думаю, что EncryptContent или особенно ExecuteScript является более компактным, но это работает.

+0

Будет ли это хорошей идеей для очень больших файлов (50 ГБ и более)? – summerNight

+1

Это было бы лучше, потому что вы не загружаете содержимое файлов (которые 'GetFile') в NiFi вообще. В то время как NiFi использует потоковое вещание для обработки больших данных и уважения к куче, репозиторий контента все равно должен будет содержать эти данные, и производительность пострадает. – Andy

+1

Итак, я нахожусь в точке, где я выполнил шаг «MergeContent», и теперь мне нужно развернуть этот объединенный файл в окне свойств ExecuteStreamCommand. Я посмотрел файл и атрибуты использования, но, насколько я понимаю, они не говорят о том, как выбрать файл из объединенного файла. Когда я делаю что-то вроде '$ {filename}', он просто печатает «имя файла» этого объединенного файла, и я не уверен, как его увидеть. В основном, как я могу указать на 'x.enc' или' y.txt' из объединенного файла потока? – summerNight