2017-02-01 6 views
0

Я использую процессор ListS3 для получения файлов от S3 и прокладывания его в процессор RouteOnAttribute. Оттуда я использую Route to Property name как Routing Strategy и назначая базы свойств, на которых хранятся файлы, которые я слушаю.Процессор Nifi ListS3 не возвращает полный путь для файлов, хранящихся в S3

Я могу видеть все файлы, которые я хочу, но ничего не могу с ними поделать, потому что мой другой процессор по линии нуждается в full path этих файлов. Я использую скрипт python, который принимает file path как аргументы строки cmd.

Как извлечь полный абсолютный путь к файлам из S3?

ответ

2

Вы можете перечислить, загружать и сохранять S3 файлы локально, используя последовательность процессоров Nifi как следующее:

  1. ListS3 - получить ссылки на S3 объекты, которые вы можете выбирать. Выход из ListS3 содержит только ссылки на объекты, а не само содержание, в атрибутах:

    • s3.bucket - имя ведра, как my-bucket
    • файла - ключ объекта, как path/to/file.txt
  2. FetchS3Object - для загрузки содержимого объекта из S3 с помощью ведра и ключ от ListS3 выше.

  3. PutFile - хранить файл локально. Укажите свойство Directory, где вы хотите, чтобы файлы были размещены /path/to/directory. filename атрибуты из S3 будут содержать относительные пути от ключей S3, поэтому они будут добавлены к Directory по умолчанию.

Вы можете собрать локальные пути для вашего сценария Python с использованием Nifi языка выражений:

/path/to/directory/${filename} 
+0

Итак, могу ли я использовать его как питон скрипт CMD арг строки? что-то вроде 'python myscript.py -file 's3: // $ {s3.bucket}/$ {filename}" '? – summerNight

+0

Да, вы можете использовать его для определения аргументов для 'ExecuteStreamCommand', выполняющих скрипт Python. – James

+0

Возможно, я что-то не понимаю, мой скрипт python продолжает метать ошибки 'file not found'. Вы уверены, что мне не нужно использовать 'PutFile' или что-то вроде этого, чтобы сначала сохранить файлы s3 локально? – summerNight