Files
nifi-kafka-postgres-lab/README.md
T

301 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
> **Последнее обновление:** 2026-01-08 | **Версия NiFi:** 1.x.x
Учебный стенд для знакомства с Apache NiFi и Kafka: NiFi + NiFi Registry + Postgres + Kafka + Kafka UI.
## Содержание
- [Содержание](#содержание)
- [Быстрый старт](#быстрый-старт)
- [Что сохраняется между перезапусками](#что-сохраняется-между-перезапусками)
- [Адреса и доступы](#адреса-и-доступы)
- [Важно про адреса (внутри Docker и с хоста)](#важно-про-адреса-внутри-docker-и-с-хоста)
- [PostgreSQL](#postgresql)
- [Подключение через DBeaver (удобнее всего)](#подключение-через-dbeaver-удобнее-всего)
- [Через консоль (если нужно)](#через-консоль-если-нужно)
- [Kafka](#kafka)
- [Работа с Kafka](#работа-с-kafka)
- [Базовые команды CLI (опционально)](#базовые-команды-cli-опционально)
- [Примеры flow (шаблоны)](#примеры-flow-шаблоны)
- [Памятка: как импортировать Process Group / Flow в NiFi](#памятка-как-импортировать-process-group--flow-в-nifi)
- [Shared folder (общая папка)](#shared-folder-общая-папка)
- [Полезные команды](#полезные-команды)
- [Проверка работоспособности](#проверка-работоспособности)
- [Checklist](#checklist)
- [Проверка flow](#проверка-flow)
- [Если что-то не работает](#если-что-то-не-работает)
- [Проблемы с запуском контейнеров](#проблемы-с-запуском-контейнеров)
- [Проблемы с подключением в NiFi](#проблемы-с-подключением-в-nifi)
- [Проблемы с Kafka](#проблемы-с-kafka)
- [Проблемы с Postgres](#проблемы-с-postgres)
- [Проблемы с правами доступа](#проблемы-с-правами-доступа)
- [Дополнительная диагностика](#дополнительная-диагностика)
## Быстрый старт
```sh
docker compose up -d
docker compose ps
```
Остановить стенд:
```sh
docker compose stop
```
Запустить обратно (после `stop` состояние сохраняется):
```sh
docker compose start
```
Удалить контейнеры и сеть:
```sh
docker compose down
```
Затем поднять обратно (с сохранённым состоянием в томах):
```sh
docker compose up -d
```
Удалить ещё и тома (volumes) — полный сброс (деструктивно):
```sh
docker compose down -v
```
### Что сохраняется между перезапусками
- `docker compose stop/start` — сохраняется всё (контейнеры не удаляются).
- `docker compose down` — контейнеры удаляются, но тома (volumes) остаются: сохраняются NiFi (`conf`/`state`), NiFi Registry, Postgres.
- `docker compose down -v` — полный сброс: удаляются и контейнеры, и тома (volumes).
Примечание: в этой конфигурации Kafka-сообщения/топики не сохраняются между `docker compose down``up` (чтобы не копить дисковое пространство). Между `stop``start` Kafka сохраняется. Пример подключения тома (volume) для Kafka есть в `docker-compose.yml`.
## Адреса и доступы
- NiFi: http://localhost:18443/nifi/
> 💡 **Примечание:** В текущей конфигурации аутентификация отключена для упрощения обучения. Логин и пароль не требуются.
- NiFi docs: https://nifi.apache.org/documentation/
- Registry: http://localhost:18080/nifi-registry
- Registry docs: https://nifi.apache.org/docs/nifi-registry-docs/
- Kafka UI: http://localhost:8082/
- Kafka UI docs: https://docs.kafka-ui.provectus.io/
## Важно про адреса (внутри Docker и с хоста)
> ⚠️ **Критически важно:** Если вы настраиваете подключение *в NiFi*, то `localhost` почти всегда будет неправильным (NiFi живёт в контейнере).
Используйте имена сервисов из `docker-compose.yml`:
- Postgres (из NiFi): `jdbc:postgresql://postgres:5432/app`
- Kafka (из NiFi): `kafka:29092`
- Registry (из NiFi): `http://registry:18080`
А с локальной машины:
- Postgres: `jdbc:postgresql://localhost:5437/app`
- Kafka: `localhost:9092`
## PostgreSQL
JDBC-драйвер для Postgres лежит в `drivers/` и монтируется в контейнер NiFi как `/opt/nifi/nifi-current/drivers/`.
Параметры для DBCP в NiFi:
- Database Connection URL: `jdbc:postgresql://postgres:5432/app`
- Database Driver Class Name: `org.postgresql.Driver`
- Database Driver Location(s): `/opt/nifi/nifi-current/drivers/postgresql-42.7.4.jar`
- Database User: `postgres`
- Password: `postgres`
### Подключение через DBeaver (удобнее всего)
Postgres проброшен наружу на порт `5437`, поэтому в DBeaver создайте подключение со следующими параметрами:
- Host: `localhost`
- Port: `5437`
- Database: `app`
- Username: `postgres`
- Password: `postgres`
Если DBeaver предложит скачать драйвер — соглашайтесь скачать/установить драйвер PostgreSQL.
Инициализация демо-схем/таблиц:
```sh
docker compose exec -T postgres psql -U postgres -d app -f /nifi-templates/SampleKafka2Postgres.sql
```
Запускайте это после первого старта или после `docker compose down -v` (скрипт не идемпотентный: при повторном запуске будут ошибки про существующие схемы/таблицы).
### Через консоль (если нужно)
Просмотр данных:
```sh
docker compose exec -it postgres bash -c "export PGPASSWORD=postgres; psql -U postgres -d app"
select * from ods.samplekafka2postgres order by id desc limit 10;
```
## Kafka
- С локальной машины (например, для консольных утилит): `localhost:9092`
- Из NiFi (внутри Docker): `kafka:29092`
### Работа с Kafka
> 💡 **Рекомендация:** Для большинства задач используйте **Kafka UI** (http://localhost:8082/) — это удобный и наглядный веб-интерфейс для просмотра топиков, сообщений и consumer groups.
**Kafka CLI** (командная строка) полезен для:
- Автоматизации и скриптов
- Продвинутых операций (например, изменение конфигурации топиков)
- Быстрой проверки без браузера
#### Базовые команды CLI (опционально)
Все команды выполняются через `docker compose exec kafka`:
**Чтение сообщений:**
```sh
docker compose exec kafka kafka-console-consumer.sh \
--bootstrap-server localhost:9092 \
--topic Sample2Kafka \
--from-beginning
```
**Запись сообщений:**
```sh
docker compose exec kafka kafka-console-producer.sh \
--bootstrap-server localhost:9092 \
--topic Sample2Kafka
```
Пример JSON-сообщения: `{"dttm": 1704698992000, "txt": "Тестовое сообщение"}`
**Просмотр списка топиков:**
```sh
docker compose exec kafka kafka-topics.sh --bootstrap-server localhost:9092 --list
```
## Примеры flow (шаблоны)
Короткий гайд для менти по JSON-версии потоков: `MENTEE_GUIDE_JSON_FLOWS.md`.
В `nifi-templates/` лежат примеры:
- `Sample2Kafka.json` — публикует JSON-сообщения в Kafka topic `Sample2Kafka`
- `SampleKafka2Postgres.json` — читает JSON из Kafka topic `Sample2Kafka` и пишет в Postgres (в `stg.samplekafka2postgres`, затем вызывает `ods.load_samplekafka2postgres()`)
- `Sample2Kafka-avro.json` / `SampleKafka2Postgres-avro.json` — Avro-версии потоков
### Памятка: как импортировать Process Group / Flow в NiFi
Файлы нужно загружать через браузер с вашей машины (каталог `nifi-templates/`).
Название пункта может отличаться в зависимости от UI/версии, но смысл один — “загрузить process group/flow definition из файла”:
1) В верхнем меню найдите действие вроде `Upload` / `Import` / `Process Group` → выберите загрузку из файла.
2) Выберите `nifi-templates/SampleKafka2Postgres.json` (или `Sample2Kafka.json`) и разместите process group на канвасе.
После импорта, как правило, нужно:
- перейти внутрь process group;
- включить Controller Services (Configure → `Controller Services` → Enable, или “enable all controller services”);
- затем запустить процессоры.
Рекомендуемый минимальный сценарий:
1) topic `Sample2Kafka` вручную создавать обычно не требуется: он создаётся автоматически при первой попытке записи (если в Kafka включено автосоздание топиков; по умолчанию оно включено). Если по какой-то причине topic не появился — создайте его в Kafka UI.
2) Импортируйте flow в NiFi (в зависимости от UI: import/upload template для `.xml` или import flow definition для `.json`). Если вы импортировали раньше, то после `docker compose down` flow сохранится.
3) Внутри flow включите Controller Services, затем запустите процессоры.
Kafka UI уже настроен в `docker-compose.yml`:
- Cluster name: `Kafka Cluster`
- Bootstrap Servers: `kafka:29092`
## Shared folder (общая папка)
Каталог `shared-folder/` на хосте смонтирован в контейнер NiFi как `/opt/nifi/nifi-current/ls-target` (удобно для ListFile/GetFile).
Если после запуска контейнеров возникают проблемы с правами: `sudo chown -R $USER shared-folder`.
## Полезные команды
```sh
docker compose logs -f nifi
docker compose logs -f kafka
docker compose exec postgres bash
```
Для доступа из NiFi к сервисам на локальной машине используйте `host.docker.internal` вместо `localhost`.
## Проверка работоспособности
После запуска стенда проверьте, что все компоненты работают корректно:
### Checklist
- [ ] **NiFi UI открывается** по адресу http://localhost:18443/nifi/ (аутентификация не требуется)
- [ ] **Kafka UI показывает кластер** по адресу http://localhost:8082/
- [ ] **В Kafka UI виден topic `Sample2Kafka`** (если flow уже запущен)
- [ ] **Postgres отвечает на подключение** через DBeaver или консоль:
```sh
docker compose exec -it postgres bash -c "export PGPASSWORD=postgres; psql -U postgres -d app -c 'SELECT version();'"
```
- [ ] **Контейнеры запущены** (все в статусе `Up`):
```sh
docker compose ps
```
### Проверка flow
Если вы импортировали и запустили примеры flow:
- [ ] В NiFi процессоры запущены (зелёный индикатор)
- [ ] В Kafka UI в topic `Sample2Kafka` появляются сообщения
- [ ] В Postgres таблица `ods.samplekafka2postgres` заполняется данными:
```sh
docker compose exec -it postgres bash -c "export PGPASSWORD=postgres; psql -U postgres -d app -c 'SELECT COUNT(*) FROM ods.samplekafka2postgres;'"
```
## Если что-то не работает
### Проблемы с запуском контейнеров
**Симптом:** Контейнеры не запускаются или сразу падают.
- **Решение:** Проверьте логи:
```sh
docker compose logs -f nifi
docker compose logs -f kafka
docker compose logs -f postgres
```
- NiFi может запускаться 1–3 минуты — это нормально.
**Симптом:** Ошибка "port is already allocated".
- **Решение:** Порты заняты. Измените проброс портов в `docker-compose.yml` или остановите процессы, использующие эти порты.
### Проблемы с подключением в NiFi
**Симптом:** Процессор в NiFi не подключается к Kafka или Postgres.
- **Решение:** Проверьте, что используете адреса "из NiFi" (см. раздел [Важно про адреса](#важно-про-адреса-внутри-docker-и-с-хоста)):
- Postgres: `postgres:5432` (не `localhost:5437`)
- Kafka: `kafka:29092` (не `localhost:9092`)
**Симптом:** Controller Services выключены.
- **Решение:** Внутри process group откройте `Controller Services` → выберите сервисы → `Enable`.
### Проблемы с Kafka
**Симптом:** Сообщения не появляются в Kafka UI.
- **Решение:**
- Проверьте, что процессор `PublishKafkaRecord_2_6` запущен и растёт счётчик "out"
- Убедитесь, что topic `Sample2Kafka` существует (создаётся автоматически при первой записи)
- Проверьте логи Kafka: `docker compose logs -f kafka`
**Симптом:** Consumer в NiFi не читает сообщения.
- **Решение:**
- Проверьте, что используете правильный `bootstrap.servers`: `kafka:29092`
- Убедитесь, что consumer group не зафиксирован на другом offset (можно создать новый consumer group)
### Проблемы с Postgres
**Симптом:** Ошибка при вставке данных в Postgres.
- **Решение:**
- Проверьте, что таблицы существуют: выполните SQL-скрипт `SampleKafka2Postgres.sql`
- Убедитесь, что JDBC-драйвер подключён: `/opt/nifi/nifi-current/drivers/postgresql-42.7.4.jar`
- Проверьте параметры подключения: `jdbc:postgresql://postgres:5432/app`, пользователь `postgres`, пароль `postgres`
**Симптом:** Таблица пустая, хотя flow работает.
- **Решение:**
- Проверьте, что сообщения проходят фильтр `QueryRecord` (relationship `GOOD_DATE`)
- Посмотрите логи процессора `PutDatabaseRecord` на наличие ошибок
- Убедитесь, что процедура `ods.load_samplekafka2postgres()` существует
### Проблемы с правами доступа
**Симптом:** Ошибки доступа к `shared-folder/`.
- **Решение:** Исправьте права:
```sh
sudo chown -R $USER shared-folder
```
### Дополнительная диагностика
Если проблема не решена:
1. Посмотрите логи всех сервисов: `docker compose logs`
2. Перезапустите проблемный контейнер: `docker compose restart nifi` (или другой сервис)
3. Попробуйте полный сброс: `docker compose down -v && docker compose up -d`
> ⚠️ **Внимание:** Это удалит все данные из Postgres, NiFi и Registry.