Главная » Хабрахабр » Apache NiFi: что это такое и краткий обзор возможностей

Apache NiFi: что это такое и краткий обзор возможностей

Сегодня на тематических зарубежных сайтах о Big Data можно встретить упоминание такого относительно нового для экосистемы Hadoop инструмента как Apache NiFi. Это современный open source ETL-инструмент. Распределенная архитектура для быстрой параллельной загрузки и обработки данных, большое количество плагинов для источников и преобразований, версионирование конфигураций – это только часть его преимуществ. При всей своей мощи NiFi остается достаточно простым в использовании.

image

В этой статье я расскажу, чем нас привлек этот инструмент и как мы его используем.
Мы в «Ростелекоме» стремимся развивать работу с Hadoop, так что уже попробовали и оценили преимущества Apache NiFi по сравнению с другими решениями.

Предыстория

Не так давно мы столкнулись с выбором решения для загрузки данных из внешних источников в кластер Hadoop. Продолжительное время для решения подобных задач у нас использовался Apache Flume. К Flume в целом не было никаких нареканий, кроме нескольких моментов, которые нас не устраивали.

Подключение каждого нового источника требовало обязательного вмешательства со стороны команды администраторов.
Вторым моментом были отказоустойчивость и масштабирование. Первое, что нам, как администраторам, не нравилось – это то, что написание конфига Flume для выполнения очередной тривиальной загрузки нельзя было доверить разработчику или аналитику, не погруженному в тонкости работы этого инструмента. Все это затем нужно было как-то мониторить и восстанавливать в случае сбоя.
В-третьих, Flume не позволял загружать данные из различных СУБД и работать с некоторыми другими протоколами «из коробки». Для тяжелых загрузок, например, по syslog, нужно было настраивать несколько агентов Flume и ставить перед ними балансировщик. Для загрузки данных из того же Oracle приходилось брать на вооружение еще один инструмент — Apache Sqoop.
Откровенно говоря, я по своей натуре являюсь человеком ленивым, и мне совсем не хотелось поддерживать зоопарк решений. Конечно, на просторах сети можно было найти способы заставить работать Flume с Oracle или с SFTP, но поддержка таких «велосипедов» — занятие совсем не из приятных. А еще не нравилось, что всю эту работу приходится выполнять самому.

К ним можно отнести Informatica, IBM Datastage, SAS и Pentaho Data Integration. Есть, разумеется, достаточно мощные решения на рынке ETL-инструментов, которые умеют работать с Hadoop. К слову, у нас используется IBM DataStage для ETL на решениях класса Data Warehouse. Это те, о которых чаще всего можно услышать от коллег по цеху и те, что первыми приходят на ум. Опять же, нам не нужна была вся мощь решений такого уровня для выполнения достаточно простых преобразований и загрузок данных. Но так уж исторически сложилось, что использовать DataStage для загрузок в Hadoop наша команда не имела возможности. Что нам требовалось, так это решение с хорошей динамикой развития, умеющее работать со множеством протоколов и обладающее удобным и понятным интерфейсом, с которым способен справиться не только администратор, разобравшийся во всех его тонкостях, но и разработчик с аналитиком, которые зачастую и являются для нас заказчиками самих данных.

Как вы могли понять из заголовка, мы решили перечисленные проблемы с помощью Apache NiFi.

Что такое Apache NiFi

Название NiFi происходит от «Niagara Files». Проект в течение восьми лет разрабатывался агентством национальной безопасности США, а в ноябре 2014 года его исходный код был открыт и передан Apache Software Foundation в рамках программы по передаче технологий (NSA Technology Transfer Program).

Вот некоторые из них: HDFS, Hive, HBase, Solr, Cassandra, MongoDB, ElastcSearch, Kafka, RabbitMQ, Syslog, HTTPS, SFTP. NiFi — это open source ETL/ELT-инструмент, который умеет работать со множеством систем, причем не только класса Big Data и Data Warehouse. Ознакомиться с полным списком можно в официальной документации.

Есть API для написания своего модуля в качестве дополнительного приемника или преобразователя данных. Работа с конкретной СУБД реализуется за счет добавление соответствующего JDBC-драйвера. Примеры можно найти здесь и здесь.

Основные возможности

В NiFi используется веб-интерфейс для создания DataFlow. С ним справится и аналитик, который совсем недавно начал работать с Hadoop, и разработчик, и бородатый админ. Последние двое могут взаимодействовать не только с «прямоугольниками и стрелочками», но и с REST API для сбора статистики, мониторинга и управления компонентами DataFlow.

image
Веб-интерфейс управления NiFi

Ниже я покажу несколько примеров DataFlow для выполнения некоторых обыденных операций.

image
Пример загрузки файлов с SFTP-сервера в HDFS

Результат этого листинга используется для параллельной загрузки файлов всеми нодами кластера процессором «FetchSFTP». В этом примере процессор «ListSFTP» делает листинг файлов на удаленном сервере. После этого, каждому файлу добавляются атрибуты, полученные путем парсинга его имени, которые затем используются процессором «PutHDFS» при записи файла в конечную директорию.

image
Пример загрузки данных по syslog в Kafka и HDFS

После этого каждой группе сообщений добавляются атрибуты о времени их поступления в NiFi и название схемы в Avro Schema Registry. Здесь с помощью процессора «ListenSyslog» мы получаем входной поток сообщений. Вторая ветвь направляется процессору «MergeContent», который агрегирует данные в течение 10 минут, после чего отдает их следующему процессору для преобразования в формат Parquet и записи в HDFS. Далее первая ветвь направляется на вход процессору «QueryRecord», который на основе указанной схемы читает данные и выполняет их парсинг с помощью SQL, а затем отправляет их в Kafka.

Очистка данных в Hive Вот пример того, как еще можно оформить DataFlow:
image
Загрузка данных по syslog в Kafka и HDFS.

NiFi позволяет парсить данные регуляркой, выполнять по ним SQL, фильтровать и добавлять поля, конвертировать один формат данных в другой. Теперь о преобразовании данных. С его помощью можно добавлять переменные и атрибуты к данным, сравнивать и вычислять значения, использовать их в дальнейшем при формировании различных параметров, таких как путь для записи в HDFS или SQL-запрос в Hive. Еще в нем есть собственный язык выражений, богатый различными операторами и встроенными функциями. Подробнее можно прочитать тут.

image
Пример использования переменных и функций в процессоре UpdateAttribute

Пользователь может отслеживать полный путь следования данных, наблюдать за изменением их содержимого и атрибутов.


Визуализация цепочки DataFlow

image
Просмотр содержимого и атрибутов данных

Настроив его, вы получаете возможность управлять изменениями. Для версионирования DataFlow есть отдельный сервис NiFi Registry. Можно запушить локальные изменения, откатиться назад или загрузить любую предыдущую версию.

image
Меню Version Control

На текущий момент поддерживаются следующие механизмы аутентификации: В NiFi можно управлять доступом к веб-интерфейсу и разделением прав пользователей.

  • На основе сертификатов
  • На основе имени пользователя и пароля посредством LDAP и Kerberos
  • Через Apache Knox
  • Через OpenID Connect

Одновременное использование сразу нескольких механизмов не поддерживается. Для авторизации пользователей в системе используются FileUserGroupProvider и LdapUserGroupProvider. Подробнее про это можно прочитать здесь.

Это обеспечивает отказоустойчивость и дает возможность горизонтально масштабировать нагрузку. Как я уже говорил, NiFi умеет работать в режиме кластера. Вместо этого Apache Zookeeper выбирает одну ноду в качестве координатора и одну в качестве primary. Статично зафиксированной мастер-ноды нет. Координатор получает от других нод информацию об их состоянии и отвечает за их подключение и отключение от кластера.
Primary-нода служит для запуска изолированных процессоров, которые не должны запускаться на всех нодах одновременно.

image
Работа NiFi в кластере

image
Распределение нагрузки по нодам кластера на примере процессора PutHDFS

Краткое описание архитектуры и компонентов NiFi


Архитектура NiFi-инстанса

Вот основные понятия и компоненты, с которыми сталкивается каждый его пользователь: NiFi опирается на концепцию «Flow Based Programming» (FBP).

Это могут быть как сами данные (например, поток Kafka сообщений), так и результат работы процессора (PutSQL, например), который не содержит данных как таковых, а лишь атрибуты сгенерированные в результате выполнения запроса. FlowFile — сущность, представляющая собой объект с содержимым от нуля и более байт и соответствующих ему атрибутов. Атрибуты представляют собой метаданные FlowFile.

Процессор, как правило, имеет одну или несколько функций по работе с FlowFile: создание, чтение/запись и изменение содержимого, чтение/запись/изменение атрибутов, маршрутизация. FlowFile Processor — это именно та сущность, которая выполняет основную работу в NiFi. Процессор «RouteOnAttribute» читает атрибуты входного FlowFile и принимает решение о его перенаправлении в соответствующее подключение с другим процессором в зависимости от значений атрибутов. Например, процессор «ListenSyslog» принимает данные по syslog-протоколу, на выходе создавая FlowFile’ы с атрибутами syslog.version, syslog.hostname, syslog.sender и другими.

Connection помещает FlowFile в очередь, после чего передает его далее по цепочке. Connection — обеспечивает подключение и передачу FlowFile между различными процессорами и некоторыми другими сущностями NiFi. Можно настроить, как FlowFile’ы выбираются из очереди, их время жизни, максимальное количество и максимальный размер всех объектов в очереди.

Представляет собой механизм организации множества компонентов в одну логическую структуру. Process Group — набор процессоров, их подключений и прочих элементов DataFlow. Для получения и отправки данных из Process Groups используются Input/Output Ports. Позволяет упростить понимание DataFlow. Подробнее об их использовании можно прочитать здесь.

FlowFile Repository — это то место, в котором NiFi хранит всю известную ему информацию о каждом существующем в данный момент FlowFile в системе.

сами передаваемые данные. Content Repository — репозиторий, в котором находится содержимое всех FlowFile, т.е.

Каждый раз, когда с FlowFile происходит какое-либо событие (создание, изменение и т.д.), соответствующая информация заносится в этот репозиторий. Provenance Repository — содержит историю о каждом FlowFile.

Web Server — предоставляет веб-интерфейс и REST API.

Заключение

С помощью NiFi «Ростелеком» смог улучшить механизм доставки данных в Data Lake на Hadoop. В целом, весь процесс стал удобнее и надежнее. Сегодня я могу с уверенностью сказать, что NiFi отлично подходит для выполнения загрузок в Hadoop. Проблем в его эксплуатации у нас не возникает.

А еще у него есть интересный подпроект Apache MiNiFi, который позволяет собирать данные с различных устройств и интегрировать их в DataFlow внутри NiFi. К слову, NiFi входит в дистрибутив Hortonworks Data Flow и активно развивается самим Hortonworks.

Дополнительная информация о NiFi

Пожалуй, на этом все. Спасибо всем за внимание. Пишите в комментариях, если у вас есть вопросы. С удовольствием на них отвечу.


Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

[Перевод] Как автор TV-B-Gone сделал музыкальный синтезатор ArduTouch

Совместимый с Arduino музыкальный инструмент, обучающий цифровой обработке сигналов Статья Митча Альтмана – изобретателя, придумавшего универсальный пульт для выключения телевизоров TV-B-Gone, и организатора хакерских конференций Мне необходимо было научиться извлекать такие звуки! Ребёнком я тянулся к музыке, и меня поражали ...

[Из песочницы] Типизированный DSL в TypeScript из JSX

По сути, это создает возможность писать типизированный DSL используя JSX. У TypeScript есть встроенная поддержка JSX синтаксиса и компилятор TypeScript'а предоставляет годные инструменты по настройке процесса компиляции JSX. Заинтересовавшихся прошу под кат. В этой статье речь пойдет именно про это ...