Представь, что тебе нужно построить надёжный конвейер для обработки данных между различными системами. Apache NiFi — это мощный инструмент с визуальным интерфейсом, который позволяет создавать такие конвейеры без глубокого программирования. В этой статье я, как Senior DevOps, покажу тебе все этапы установки и настройки NiFi — от простого standalone-режима до кластера.
Подготовка к установке Apache NiFi
Перед началом установки убедись, что система соответствует требованиям:
- Java 8 или выше (рекомендуется OpenJDK 11/17)
- Минимум 2 ГБ оперативной памяти
- 2+ ядра процессора
- Не менее 10 ГБ свободного места на диске
Установка Apache NiFi на Linux
Шаг 1: Установка Java
Давай начнём с установки Java. Для Ubuntu/Debian:
# Обновление пакетов
sudo apt update
# Установка OpenJDK 11
sudo apt install -y openjdk-11-jdk
# Проверка версии Java
java -version
# Установка переменной JAVA_HOME
export JAVA_HOME=$(readlink -f /usr/bin/java | sed 's:/bin/java::')
echo "export JAVA_HOME=$JAVA_HOME" >> ~/.bashrc
Шаг 2: Загрузка и распаковка Apache NiFi
Скачаем последнюю стабильную версию с официального сайта:
# Создадим директорию для установки
sudo mkdir -p /opt/nifi
sudo chown $USER:$USER /opt/nifi
cd /opt/nifi
# Загрузка последней версии NiFi (проверь актуальную версию на сайте)
wget https://downloads.apache.org/nifi/1.23.2/nifi-1.23.2-bin.tar.gz
# Проверка контрольной суммы
wget https://downloads.apache.org/nifi/1.23.2/nifi-1.23.2-bin.tar.gz.sha256
sha256sum -c nifi-1.23.2-bin.tar.gz.sha256
# Распаковка архива
tar -xzf nifi-1.23.2-bin.tar.gz
# Создание симлинка для удобства
ln -s nifi-1.23.2 current
# Очистка архива
rm nifi-1.23.2-bin.tar.gz*
Шаг 3: Базовая настройка конфигурации
Основные настройки находятся в файле /opt/nifi/current/conf/nifi.properties. Давай настроим ключевые параметры:
# Веб-интерфейс будет доступен на всех интерфейсах
nifi.web.http.host=0.0.0.0
nifi.web.http.port=8080
# Директории для хранения данных
nifi.flowfile.repository.directory=./flowfile_repository
nifi.content.repository.directory.default=./content_repository
nifi.database.directory=./database_repository
nifi.provenance.repository.directory.default=./provenance_repository
# Настройки безопасности (отключим для первого запуска)
nifi.security.keystore=
nifi.security.keystoreType=
nifi.security.keystorePasswd=
nifi.security.keyPasswd=
nifi.security.truststore=
nifi.security.truststoreType=
nifi.security.truststorePasswd=
# JVM настройки (можно изменить в nifi-env.sh)
java.arg.2=-Xms512m
java.arg.3=-Xmx1024m
Шаг 4: Запуск Apache NiFi
Запустим NiFi как foreground-процесс для проверки:
# Переходим в директорию NiFi
cd /opt/nifi/current
# Запуск в foreground режиме
./bin/nifi.sh start
# Просмотр логов в реальном времени
tail -f ./logs/nifi-app.log
# Остановка NiFi
./bin/nifi.sh stop
После запуска открой браузер и перейди по адресу http://ваш_сервер:8080/nifi. Должен появиться интерфейс NiFi.
Установка Apache NiFi через Docker
Docker — отличный вариант для быстрого развёртывания и тестирования. Используем официальный образ:
# Запуск последней версии NiFi
docker run \
--name nifi \
-p 8080:8080 \
-d \
apache/nifi:latest
# Запуск с монтированием томов для сохранения данных
docker run \
--name nifi \
-p 8080:8080 \
-v ./flowfile_repository:/opt/nifi/nifi-current/flowfile_repository \
-v ./database_repository:/opt/nifi/nifi-current/database_repository \
-v ./content_repository:/opt/nifi/nifi-current/content_repository \
-v ./provenance_repository:/opt/nifi/nifi-current/provenance_repository \
-d \
apache/nifi:latest
# Запуск с кастомными настройками JVM
docker run \
--name nifi \
-p 8080:8080 \
-e NIFI_JVM_HEAP_INIT="512m" \
-e NIFI_JVM_HEAP_MAX="1024m" \
-d \
apache/nifi:latest
Docker Compose для NiFi
Для более сложных сценариев создадим docker-compose.yml:
version: '3.8'
services:
nifi:
image: apache/nifi:latest
container_name: nifi
ports:
- "8080:8080"
- "8443:8443"
environment:
- NIFI_WEB_HTTP_PORT=8080
- NIFI_WEB_HTTPS_PORT=8443
- NIFI_JVM_HEAP_INIT=512m
- NIFI_JVM_HEAP_MAX=1024m
volumes:
- ./data/flowfile_repository:/opt/nifi/nifi-current/flowfile_repository
- ./data/database_repository:/opt/nifi/nifi-current/database_repository
- ./data/content_repository:/opt/nifi/nifi-current/content_repository
- ./data/provenance_repository:/opt/nifi/nifi-current/provenance_repository
- ./config/nifi.properties:/opt/nifi/nifi-current/conf/nifi.properties:ro
networks:
- nifi-network
networks:
nifi-network:
driver: bridge
Настройка Apache NiFi как системного сервиса
Для production-среды настроим NiFi как systemd сервис:
# Создаём файл сервиса
sudo nano /etc/systemd/system/nifi.service
[Unit]
Description=Apache NiFi
After=network.target
[Service]
Type=forking
User=nifi
Group=nifi
ExecStart=/opt/nifi/current/bin/nifi.sh start
ExecStop=/opt/nifi/current/bin/nifi.sh stop
ExecReload=/opt/nifi/current/bin/nifi.sh restart
Restart=on-failure
RestartSec=10
# Настройки JVM
Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64"
Environment="NIFI_HOME=/opt/nifi/current"
# Лимиты ресурсов
LimitNOFILE=50000
LimitNPROC=10000
[Install]
WantedBy=multi-user.target
# Создаём пользователя nifi
sudo useradd -r -s /bin/bash -d /opt/nifi -m nifi
# Назначаем права
sudo chown -R nifi:nifi /opt/nifi
# Перезагружаем systemd и запускаем сервис
sudo systemctl daemon-reload
sudo systemctl enable nifi.service
sudo systemctl start nifi.service
# Проверяем статус
sudo systemctl status nifi.service
# Просмотр логов
sudo journalctl -u nifi.service -f
Настройка кластера Apache NiFi
Для горизонтального масштабирования настроим кластер. Сравним режимы работы:
| Режим | Standalone | Кластер |
|---|---|---|
| Отказоустойчивость | Нет (Single Point of Failure) | Высокая |
| Масштабируемость | Вертикальная | Горизонтальная |
| Сложность настройки | Низкая | Средняя/Высокая |
Конфигурация кластера из 3 узлов
На каждом узле в файле nifi.properties настраиваем:
# Включаем кластерный режим
nifi.cluster.is.node=true
# Адрес текущего узла (меняем для каждого узла)
nifi.cluster.node.address=nifi-node-1.local
nifi.cluster.node.protocol.port=11443
# Адреса всех узлов кластера
nifi.cluster.nodes=nifi-node-1.local,nifi-node-2.local,nifi-node-3.local
# Настройки выбора лидера
nifi.cluster.leader.election.implementation=org.apache.nifi.cluster.leader.standalone.StandaloneLeaderElectionManager
# Порт для веб-интерфейса (разный на каждом узле)
nifi.web.http.host=0.0.0.0
nifi.web.http.port=8080 # 8081, 8082 на других узлах
Безопасность и аутентификация
Настройка SSL/TLS и аутентификации для production-среды:
# Генерация самоподписанного сертификата для тестов
keytool -genkeypair \
-alias nifi \
-keyalg RSA \
-keysize 2048 \
-keystore keystore.jks \
-validity 365 \
-storepass changeit \
-keypass changeit \
-dname "CN=localhost, OU=NIFI, O=Apache, L=Unknown, ST=Unknown, C=US"
# Экспорт сертификата в truststore
keytool -exportcert \
-alias nifi \
-keystore keystore.jks \
-storepass changeit \
-rfc -file nifi.cert
keytool -importcert \
-alias nifi \
-file nifi.cert \
-keystore truststore.jks \
-storepass changeit \
-noprompt
# Включаем HTTPS в nifi.properties
nifi.web.https.host=0.0.0.0
nifi.web.https.port=8443
# Настройки keystore и truststore
nifi.security.keystore=/opt/nifi/current/conf/keystore.jks
nifi.security.keystoreType=JKS
nifi.security.keystorePasswd=changeit
nifi.security.keyPasswd=changeit
nifi.security.truststore=/opt/nifi/current/conf/truststore.jks
nifi.security.truststoreType=JKS
nifi.security.truststorePasswd=changeit
# Включаем аутентификацию
nifi.security.user.login.identity.provider=single-user-provider
nifi.security.user.authorizer=managed-authorizer
Оптимизация производительности
После установки настрой параметры для максимальной производительности:
- JVM настройки: Увеличь Xmx в зависимости от доступной памяти
- Репозитории: Размести flowfile и provenance репозитории на быстрых SSD
- Потоки: Настрой nifi.bored.yield.duration и nifi.queue.swap.threshold
- Мониторинг: Включи JMX и настрой Prometheus exporter
# Пример оптимизированных JVM параметров в nifi-env.sh
export JAVA_ARGS="-Xms4g -Xmx8g"
export JAVA_ARGS="$JAVA_ARGS -XX:+UseG1GC"
export JAVA_ARGS="$JAVA_ARGS -XX:MaxGCPauseMillis=200"
export JAVA_ARGS="$JAVA_ARGS -Djava.awt.headless=true"
export JAVA_ARGS="$JAVA_ARGS -Djava.net.preferIPv4Stack=true"
Часто задаваемые вопросы (FAQ)
Как проверить, что NiFi работает правильно?
Выполни команду curl -I http://localhost:8080/nifi. Должен вернуться HTTP 200. Также проверь логи на наличие ошибок: tail -f logs/nifi-app.log.
NiFi не запускается, пишет "Unable to start web server"
Скорее всего порт 8080 занят. Измени порт в nifi.properties или останови conflicting service. Проверь: sudo netstat -tlnp | grep :8080.
Как мигрировать потоки данных между инстансами?
Используй функцию "Template" в UI или экспортируй flow.xml.gz из каталога conf. Для кластера используй Registry (NiFi Registry) для version control потоков.
Какие порты нужно открыть в firewall?
Для standalone: 8080 (HTTP) или 8443 (HTTPS). Для кластера: 8080/8443 + 11443 (межузловое общение) + порты для ZooKeeper (2181, 2888, 3888) если используется.
Как обновить NiFi на новую версию?
1. Останови текущий инстанс. 2. Сделай backup conf и flow директорий. 3. Установи новую версию в отдельную директорию. 4. Скопируй конфиги и данные. 5. Запусти и протестируй.
Заключение
Теперь у тебя есть полное руководство по установке Apache NiFi в различных конфигурациях. Начни с standalone-версии для тестирования, затем переходи к Docker для development-среды, и наконец — к кластерной конфигурации для production. Помни, что безопасность и мониторинг — не опции, а обязательные элементы production-развёртывания.