Автоматизация

Meltano: ELT-конвейеры в YAML и Singer-коннекторы

Meltano собирает загрузки данных из отдельных плагинов и хранит настройки в meltano.yml. Источник читает записи, получатель загружает их, а CLI управляет запуском и состоянием. Такой проект удобно хранить в Git, проверять в pull request и выпускать вместе с кодом.

Звёзды на GitHub
2 648
Дата релиза

Что делает Meltano

Meltano управляет проектом загрузки данных: устанавливает коннекторы, передаёт им настройки, соединяет чтение с записью и сохраняет точку продолжения. Вы управляете проектом через CLI, интерфейс командной строки. Настройки лежат в текстовых файлах, поэтому изменения можно просмотреть до запуска.

ELT означает извлечение, загрузку и последующее преобразование данных. В Meltano чтением обычно занимается Singer tap, записью Singer target. Singer задаёт формат сообщений между ними: описание схемы, записи и состояние чтения. Это похоже на конструктор из деталей, где Meltano отвечает за сборку и запуск.

Когда конвейер в Git удобнее интерфейса

Meltano хорошо ложится на работу команды, которая уже проверяет код в pull request, выпускает изменения через CI/CD и умеет обслуживать фоновые задачи. Источник, настройки и выбранные потоки видны в проекте. Можно воспроизвести окружение и обсудить изменение до того, как оно попадёт в production.

  • У вас уже есть Singer tap для нужной системы.
  • Несколько инженеров меняют конфигурацию и хотят видеть diff.
  • Процессы запускает Airflow, Dagster или другой существующий исполнитель.
  • Выгрузки нужно включить в общий выпуск приложения.

Если пользователи ожидают выбирать источники и смотреть состояние через единый интерфейс, сначала посмотрите Airbyte. Если загрузка должна стать функцией внутри Python-модуля, dlt обычно ближе по форме. Мне кажется, выбирать здесь стоит по ежедневной работе команды: кто будет разбирать остановившуюся загрузку.

Singer taps, targets, варианты и utilities

Компоненты проекта Meltano
КомпонентЗадачаПример
Extractor / tapПрочитать источникtap-gitlab
Loader / targetЗаписать данныеtarget-jsonl или target-postgres
UtilityЗапустить дополнительный инструментdbt или оркестратор
VariantВыбрать реализацию конкретного плагинаmeltanolabs для tap-gitlab

У одного имени плагина бывают несколько реализаций. Variant выбирает автора и реализацию, а не режим скорости. Параметры, поддерживаемые потоки и обновления у вариантов могут отличаться. Смотрите страницу выбранного варианта на MeltanoHub и не переносите настройки от другого без проверки.

Окружение и зависимости

Для Meltano нужен Python; walkthrough перечисляет версии 3.10–3.14 и системы Linux, macOS и Windows. CLI удобно установить через pipx, чтобы его зависимости не смешивались с пакетами приложения. Для Linux/macOS пример ниже использует Bash; команды активации окружения в PowerShell отличаются.

Плагины устанавливаются отдельно. У tap и target бывают собственные требования: версия Python, системная библиотека или драйвер базы. Сначала выберите пару плагинов, затем подбирайте окружение для неё. Сам факт успешной установки Meltano не означает, что все коннекторы установятся.

Первый проект: GitLab → JSONL

Пример сохраняет данные GitLab в файлы JSONL: одна JSON-запись на строку. Нужен доступ к выбранному проекту GitLab и токен с достаточными правами. Так проще увидеть результат без подготовки отдельного хранилища. Установите pipx, если его ещё нет, затем выполните:

Bash: установить Meltano и добавить плагиныBash
pipx install meltano
meltano --version
meltano init gitlab-data
cd gitlab-data
meltano add tap-gitlab --variant=meltanolabs
meltano add target-jsonl --variant=andyh1203
mkdir -p output

Откройте интерактивную настройку tap-gitlab, заполните private_token и проекты, которые доступны вашему аккаунту. Затем задайте интересующий период и поток. В примере выбран один публичный проект; замените его на свой при необходимости.

Настроить источник, проверить выбор и запустить загрузкуBash
meltano config tap-gitlab set --interactive
meltano config tap-gitlab set projects "meltano/meltano"
meltano config tap-gitlab set start_date "2026-10-01T00:00:00Z"
meltano select tap-gitlab commits "*"
meltano select tap-gitlab --list
meltano run tap-gitlab target-jsonl

Папка output должна существовать до запуска: target-jsonl не создаёт её автоматически. Откройте полученные файлы и проверьте поля нескольких записей. Затем повторите запуск и посмотрите, как выбранный tap сохраняет и использует состояние. JSONL здесь нужен для знакомства; это не обещание дедупликации как в SQL-хранилище.

Что хранить в meltano.yml и в Git

Проект содержит meltano.yml с плагинами и настройками, окружения и lock-файлы описаний плагинов. Эти файлы помогают воспроизвести сборку. Lock-файл фиксирует определение плагина; версию исполняемого пакета при необходимости закрепляйте через pip_url отдельно.

Фрагмент meltano.yml: плагины из первого примераYAML
plugins:
  extractors:
    - name: tap-gitlab
      variant: meltanolabs
      pip_url: git+https://github.com/MeltanoLabs/tap-gitlab.git
  loaders:
    - name: target-jsonl
      variant: andyh1203
      pip_url: target-jsonl

Это фрагмент конфигурации, а не замена всего файла, который создал meltano init. Секреты и рабочие каталоги не нужно коммитить. При выпуске проверяйте diff, устанавливайте зависимости воспроизводимо и отдельно храните данные о том, что уже загружено.

Секреты и настройки dev, staging, prod

Meltano разделяет обычную конфигурацию и чувствительные значения. Секреты можно передавать через переменные окружения или .env; интерактивная настройка использует отметки чувствительных параметров. Не вписывайте токен прямо в YAML, который попадёт в Git.

Bash: включить окружение для запускаBash
meltano environment list
export MELTANO_ENVIRONMENT=dev
meltano run tap-gitlab target-jsonl

Окружения позволяют хранить отдельные настройки для разработки и production в одном проекте. Используйте разные получатели и права доступа: пробная загрузка не должна писать в таблицы рабочего отчёта. Перед запуском проверьте выбранное окружение, а вывод конфигурации с секретами не отправляйте в общий лог.

Выбрать потоки и способ репликации

Tap сначала определяет доступные потоки и поля. Meltano позволяет выбрать нужные сущности и исключить лишние атрибуты. Но способность обнаруживать схему и применять выбор зависит от коннектора. Перед настройкой проверьте его capabilities, список поддерживаемых действий.

Методы чтения Singer-коннекторов
МетодЧто читаетОграничение
FULL_TABLEВсю таблицу при каждом запускеПовторное чтение растёт вместе с таблицей
INCREMENTALНовые и изменённые записи по ключу репликацииОбычный курсор не видит физические удаления
LOG_BASEDСобытия журнала базыНужна поддержка базы и конкретного tap

Для инкрементов нужен пригодный ключ, например updated_at. Возрастающий id ловит новые строки, но не обязательно изменения старых. Если требуется текущая версия каждой сущности, проверьте ещё и поведение target: как он записывает обновления и устраняет повторные версии.

Состояние: откуда продолжить после запуска

Состояние хранит отметку, до которой конвейер дошёл. Для meltano run идентификатор состояния зависит от extractor, loader и окружения. Следующий запуск использует эту отметку, чтобы продолжить чтение. Переименование пары или окружения может означать другое состояние, поэтому такие изменения стоит проверять отдельно.

По умолчанию состояние можно хранить в системной базе Meltano. Доступны также локальная файловая система, S3, Azure Blob Storage и Google Cloud Storage. Для облачных вариантов нужны соответствующие extras. В одноразовом контейнере состояние нельзя оставлять только на исчезающем диске.

Запуски по расписанию и преобразования

В Meltano job описывает последовательность задач. К нему можно добавить расписание. Но запись расписания в YAML ещё не запускает фоновый исполнитель. Для регулярного выполнения нужен работающий оркестратор или ваша система запуска. Документация описывает интеграцию с Airflow.

Определить задачу и ежедневное расписаниеBash
meltano job add gitlab-to-jsonl --tasks "tap-gitlab target-jsonl"
meltano schedule add daily-gitlab --job gitlab-to-jsonl --interval "@daily"

Преобразования можно поставить следующим шагом через utility, например dbt. Сначала загрузка должна успешно завершиться, потом строятся витрины и проверяется качество. Так отказ API не приведёт к публикации отчёта с частично обновлёнными таблицами.

Как подключить внутренний API

Если подходящего tap нет, Meltano поддерживает пользовательские плагины. Источник можно написать с Singer SDK, который помогает реализовать схему, потоки, авторизацию и инкрементальное чтение. Сам SDK живёт в отдельном проекте; Meltano запускает готовый плагин.

  1. Проверьте спецификацию API и реальные ответы, включая пустые страницы.
  2. Опишите нужные потоки и JSON-схемы записей.
  3. Реализуйте авторизацию, лимиты запросов и пагинацию.
  4. Определите курсор и точку сохранения состояния.
  5. Добавьте tap как пользовательский плагин и проверьте его с выбранным target.

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

Перенос проекта на сервер

Рабочий запуск требует тех же файлов проекта, установленных плагинов и правильных секретов. Дополнительно решите, где сохраняются состояние и логи, кто запускает расписание и как обновляются пакеты. Контейнер упрощает повторение окружения, но сам не задаёт все эти правила.

Установить плагины существующего проекта и запустить productionBash
meltano install
meltano --environment=prod run tap-gitlab target-jsonl

Meltano Cloud закрыт: документация production описывает самостоятельное размещение и использование управляемых сервисов Airflow. На официальном сайте также есть другие продукты и услуги. Их условия не следует считать свойствами бесплатного CLI из этого репозитория.

С чем придётся разбираться самостоятельно

Границы ответственности Meltano
ВопросЗа что отвечает MeltanoЧто проверить отдельно
ПодключениеПередаёт конфигурацию и запускает плагинПрава, сеть и поведение API
ИнкрементыХранит и передаёт состояниеКурсор tap и подтверждения записи target
СхемаПередаёт каталог и настройкиТипы и совместимость получателя
Регулярный запускХранит jobs и schedulesИсполнитель, повторы и уведомления

Лицензия самого Meltano MIT разрешает использование, изменение и распространение, в том числе в коммерческих проектах, с сохранением уведомлений. Плагины имеют собственные лицензии: проверьте их отдельно. Расходы на серверы, базы и сопровождение не исчезают вместе с платой за CLI.

Как разбирать остановившуюся загрузку

Сначала разделите проблему на чтение и запись. Ошибка tap может означать истёкший токен или неправильный поток; ошибка target, несовместимый тип или недоступную базу. Сверьте вариант плагина и активное окружение. Потом смотрите состояние: нужно понять, какие записи уже записаны и откуда продолжится следующий запуск.

Посмотреть выбранные потоки и отдельно вызвать справку плагинаBash
meltano select tap-gitlab --list
meltano invoke tap-gitlab --help
meltano state list

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

Проверка конвейера перед выпуском

Возьмите небольшой известный набор и проверьте первую загрузку. Затем измените запись и запустите процесс повторно. Сверьте ключи и количество строк на стороне получателя. Такая проверка быстро обнаружит неверный курсор или режим записи, даже если оба плагина завершаются без ошибки.

  • Пустой источник не приводит к случайному удалению данных.
  • Повторное чтение не создаёт незапланированные дубли.
  • Истёкший доступ приводит к понятной ошибке, а не успешной пустой выгрузке.
  • После прерывания понятно, какие записи уже подтверждены target.
  • Production-окружение пишет в нужную базу и использует свои секреты.

Зафиксируйте ожидаемый результат рядом с проектом. Когда обновится tap или target, команда сможет сравнить поведение на том же наборе, а не заново угадывать, что считается правильной загрузкой.

Meltano, Airbyte или dlt

Выбор инструмента под способ работы команды
ИнструментЕдиница работыПрактический выбор
MeltanoПроект YAML и плагины CLIПроверять конфигурацию и выпуски в Git
AirbyteПодключение в веб-интерфейсеУправлять несколькими стандартными загрузками через UI
dltPython-ресурс и pipelineОписать нестандартную обработку в существующем коде

Meltano удобен, когда команда хочет воспроизводить загрузки из проекта в Git и использовать Singer-плагины. Перед решением проверьте одну реальную пару tap/target и повторный запуск. Полные обзоры Airbyte и dlt находятся в таблице альтернатив ниже.

Альтернативы Meltano

Инструменты для похожих задач
ИнструментДля чего подходит
AirbyteВеб-интерфейс для подключений и готовая платформа загрузок. Удобен, если конфигурацией и статусами пользуются разные люди.
dltPython-библиотека с ресурсами и автоматическим определением схемы. Удобна, когда данные уже доступны вашему Python-коду.

Полезные ссылки