Миграция данных из MariaDB в Parquet с помощью Apache NiFi

Иван Гурин Технологии интеграции информационных систем 6 мин

В предыдущей статье Практическое введение в Apache NiFi были рассмотрены базовые концепции NiFi, его место в ETL‑процессах и принципы построения потоков данных.

Здесь мы разберем практический batch‑сценарий: выгрузка данных из MariaDB и сохранение их в виде файла в формате Parquet.

Это типовая задача при построении аналитических конвейеров, data lake и оффлайн‑обработки данных.

Почему Parquet

Parquet - колоночный формат хранения данных, оптимизированный для аналитических нагрузок. Он имеет эффективное сжатие, хранит данные в виде столбцов, имеет хорошую интеграцию с аналитическими движками, например, Spark, Trino, Presto и др. Поэтому Parquet часто используется как выходной формат batch‑выгрузок из OLTP‑баз.

Общая схема потока

В статье используется минимальный, но показательный набор процессоров:

[ExecuteSQL]
      |
      v
[ConvertRecord]
      |
      v
[PutFile]

Где:

  • ExecuteSQL - извлекает данные из MariaDB;
  • ConvertRecord - преобразует записи в формат Parquet;
  • PutFile - сохраняет результат в файловую систему.

Каждый запуск потока формирует один Parquet‑файл.

Исходные данные

Для примера используется таблица со структурой как в предыдущей статье:

CREATE TABLE `ArticleDocuments` (
  `Id` INT(11) NOT NULL AUTO_INCREMENT,
  `Content` LONGTEXT NOT NULL COLLATE 'utf8mb4_general_ci',
  PRIMARY KEY (`Id`)
) COLLATE='utf8mb4_general_ci' ENGINE=InnoDB;

Дополнительные колонки намеренно не используются, чтобы пример оставался максимально наглядным.

Настройка процессоров

ExecuteSQL

Назначение: выполнение SQL‑запроса и получение результата в виде records.

Ключевые настройки:

  • Database Connection Pooling Service: MariaDBConnectionPool
  • SQL select query:
SELECT Id, Content FROM ArticleDocuments

Особенности:

  • результат запроса преобразуется в Avro‑представление;
  • каждая строка таблицы становится record;
  • в данном примере на выходе формируется один FlowFile.

В данном примере RecordReader не используется, так как ExecuteSQL сам формирует Avro‑контент.

ConvertRecord

Назначение: преобразование данных из Avro в Parquet.

Используемая конфигурация:

  • Record Reader: AvroReader
  • Record Writer: ParquetRecordSetWriter

Ключевая идея:

ConvertRecord - это явная и контролируемая точка преобразования форматов данных.

Преимущества такого подхода:

  • отделение извлечения данных от формата хранения;
  • явная схема;
  • возможность легко менять выходной формат.

⚠️ Важно: ParquetRecordSetWriter не работает «из коробки» без дополнительных NAR‑модулей.

PutFile

Назначение: сохранение Parquet‑файла на диск.

Ключевые настройки:

  • Directory: /result/article_documents
  • Conflict Resolution Strategy: replace

Если PutFile работает постоянно, то NiFi будет повторно запускать ExecuteSQL и создавать несколько файлов с одинаковым содержимым. Поэтому рекомендуется использовать однократный запуск потока (Run Once).

Controller Services

MariaDBConnectionPool

Настройки подключения к базе данных MariaDB:

  • Database Connection URL: jdbc:mariadb://mariadb:3306/article
  • Database Driver Class Name: org.mariadb.jdbc.Driver
  • Database Driver Locations: /opt/nifi/nifi-current/drivers/org.mariadb.jdbc_mariadb-java-client-3.3.3.jar
  • Database User: root

AvroReader

Используется без дополнительных настроек. Схема автоматически извлекается из Avro‑контента, полученного от ExecuteSQL.

ParquetRecordSetWriter

Для работы ParquetRecordSetWriter необходимо подключить NAR‑модули:

  • nifi-parquet-nar-2.7.2.nar
  • nifi-hadoop-libraries-nar-2.7.2.nar

Модули можно скачать в репозитории Maven. Версия модуля должна соответствовать версии Apache NiFi. Для подключения NAR‑модулей в docker-контейнер можно использовать следующий Dockerfile для сборки образа:

FROM apache/nifi:2.7.2

# Parquet NAR
COPY nifi/nars/*.nar /opt/nifi/nifi-current/nar_extensions/

# MariaDB JDBC driver
COPY nifi/drivers/org.mariadb.jdbc_mariadb-java-client-3.3.3.jar \
     /opt/nifi/nifi-current/drivers/

Только после добавления NAR‑модулей ParquetRecordSetWriter станет доступен в списке Writer‑ов.

Проверка результата

После выполнения потока:

  1. В каталоге /result/article_documents появляется .parquet‑файл
  2. Его можно открыть с помощью:
    • Spark
    • DuckDB
    • Parquet Viewer
    • Pandas / PyArrow

Методические замечания

  • NiFi отлично подходит для batch‑миграций;
  • для production‑сценариев стоит контролировать размеры файлов, учитывать идемпотентность, обрабатывать возможные ошибки в отдельных процессорах.

Заключение

Связка ExecuteSQL → ConvertRecord → PutFile позволяет без написания кода выгружать данные из MariaDB в формат Parquet.

Apache NiFi в этом сценарии выступает как транспортный и интеграционный слой, подготавливая данные для дальнейшей аналитической обработки.

Помимо Apache NiFi, экспорт данных из MariaDB в формат Parquet может быть выполнен и с помощью других инструментов, таких как DuckDB, Apache Spark и ELT-платформы, выбор которых зависит от объема данных, требований к инфраструктуре и сложности интеграционного сценария.

Формат Parquet делает такие выгрузки удобными и эффективными для работы в экосистеме Big Data.