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
| Компонент | Задача | Пример |
|---|---|---|
| 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, если его ещё нет, затем выполните:
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 и проекты, которые доступны вашему аккаунту. Затем задайте интересующий период и поток. В примере выбран один публичный проект; замените его на свой при необходимости.
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 отдельно.
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.
meltano environment list
export MELTANO_ENVIRONMENT=dev
meltano run tap-gitlab target-jsonlОкружения позволяют хранить отдельные настройки для разработки и production в одном проекте. Используйте разные получатели и права доступа: пробная загрузка не должна писать в таблицы рабочего отчёта. Перед запуском проверьте выбранное окружение, а вывод конфигурации с секретами не отправляйте в общий лог.
Выбрать потоки и способ репликации
Tap сначала определяет доступные потоки и поля. Meltano позволяет выбрать нужные сущности и исключить лишние атрибуты. Но способность обнаруживать схему и применять выбор зависит от коннектора. Перед настройкой проверьте его capabilities, список поддерживаемых действий.
| Метод | Что читает | Ограничение |
|---|---|---|
| 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.
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 запускает готовый плагин.
- Проверьте спецификацию API и реальные ответы, включая пустые страницы.
- Опишите нужные потоки и JSON-схемы записей.
- Реализуйте авторизацию, лимиты запросов и пагинацию.
- Определите курсор и точку сохранения состояния.
- Добавьте tap как пользовательский плагин и проверьте его с выбранным target.
Самая неприятная ошибка здесь тихая: конвейер зелёный, а последняя страница потеряна. Поэтому проверяйте полноту чтения, а не только отсутствие исключения. Прогон с заранее известным небольшим набором записей обычно полезнее случайной большой выгрузки.
Перенос проекта на сервер
Рабочий запуск требует тех же файлов проекта, установленных плагинов и правильных секретов. Дополнительно решите, где сохраняются состояние и логи, кто запускает расписание и как обновляются пакеты. Контейнер упрощает повторение окружения, но сам не задаёт все эти правила.
meltano install
meltano --environment=prod run tap-gitlab target-jsonlMeltano Cloud закрыт: документация production описывает самостоятельное размещение и использование управляемых сервисов Airflow. На официальном сайте также есть другие продукты и услуги. Их условия не следует считать свойствами бесплатного CLI из этого репозитория.
С чем придётся разбираться самостоятельно
| Вопрос | За что отвечает Meltano | Что проверить отдельно |
|---|---|---|
| Подключение | Передаёт конфигурацию и запускает плагин | Права, сеть и поведение API |
| Инкременты | Хранит и передаёт состояние | Курсор tap и подтверждения записи target |
| Схема | Передаёт каталог и настройки | Типы и совместимость получателя |
| Регулярный запуск | Хранит jobs и schedules | Исполнитель, повторы и уведомления |
Лицензия самого Meltano MIT разрешает использование, изменение и распространение, в том числе в коммерческих проектах, с сохранением уведомлений. Плагины имеют собственные лицензии: проверьте их отдельно. Расходы на серверы, базы и сопровождение не исчезают вместе с платой за CLI.
Как разбирать остановившуюся загрузку
Сначала разделите проблему на чтение и запись. Ошибка tap может означать истёкший токен или неправильный поток; ошибка target, несовместимый тип или недоступную базу. Сверьте вариант плагина и активное окружение. Потом смотрите состояние: нужно понять, какие записи уже записаны и откуда продолжится следующий запуск.
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 |
| dlt | Python-ресурс и pipeline | Описать нестандартную обработку в существующем коде |
Meltano удобен, когда команда хочет воспроизводить загрузки из проекта в Git и использовать Singer-плагины. Перед решением проверьте одну реальную пару tap/target и повторный запуск. Полные обзоры Airbyte и dlt находятся в таблице альтернатив ниже.
Альтернативы Meltano
| Инструмент | Для чего подходит |
|---|---|
| Airbyte | Веб-интерфейс для подключений и готовая платформа загрузок. Удобен, если конфигурацией и статусами пользуются разные люди. |
| dlt | Python-библиотека с ресурсами и автоматическим определением схемы. Удобна, когда данные уже доступны вашему Python-коду. |

