Синхронизация проектов DBT на хостах ADO с помощью GitSync

В ADO основное назначение сервиса GitSync — это загрузка и синхронизация DAG Airflow на хостах, но его также можно использовать для проектов DBT. Несмотря на то, что это не является основным сценарием использования сервиса, такая возможность существует при определенной настройке.

Для этого некоторые параметры конфигурации необходимо использовать нестандартным образом. При этом поведение синхронизации может различаться в зависимости от особенностей конфигурации DBT.

Шаг 1. Настройка DBT

Перед настройкой DBT убедитесь, что сервис установлен и работает.

Во время выполнения DBT создает дополнительные каталоги внутри директории проекта, такие как target/ или logs/. Эти каталоги содержат артефакты, создаваемые во время выполнения, и не являются частью Git-репозитория. По возможности рекомендуется хранить их вне синхронизируемого каталога проекта.

ADCM предоставляет следующие параметры для файлов DBT:

  • DBT_PROFILES_DIR — путь к конфигурационному файлу profiles.yml.

  • DBT_LOG_PATH — директория логов.

  • DBT_TARGET — задает значение опции --target-path по умолчанию. Определяет директорию, в которую DBT сохраняет скомпилированные SQL-файлы, логи, манифесты и другие артефакты (по умолчанию это каталог target/ в корневой директории проекта).

Чтобы настроить эти параметры через ADCM:

  1. На странице Clusters выберите нужный кластер.

  2. Перейдите на вкладку Services и выберите сервис DBT.

  3. В разделе параметров dbt-env.sh выберите необходимый параметр и внесите изменения.

  4. Нажмите Save для сохранения изменений.

  5. В раскрывающемся меню Actions выберите Restart, убедитесь, что для параметра Apply configs from ADCM установлено значение true, и нажмите Run.

Структура каталогов проектов должна быть синхронизирована полностью, а не только отдельные файлы.

Рекомендуемая конфигурация:

{
  "directory": "./"
}

Если репозиторий с проектами DBT содержит несколько компонентов, укажите путь к директории проекта.

Дополнительные рекомендации при развертывании проектов DBT с помощью GitSync:

  • Используйте отдельную директорию (target_folder) для каждого проекта DBT.

  • Не размещайте файлы DAG и проекты DBT в одном целевом каталоге.

  • Убедитесь, что синхронизированные файлы доступны для сервиса DBT.

Шаг 2. Настройка GitSync

Перед настройкой GitSync убедитесь, что сервис установлен, а ключ для репозитория с проектами DBT добавлен с помощью действия Upload private key.

Сохранение файлов

Если для GitSync включена опция delete_old_files, он удаляет старые файлы из целевой директории. Такое поведение может привести к удалению артефактов DBT, которые создаются во время выполнения (например, директории target/ и logs/).

Чтобы эти директории не удалялись, отключите удаление старых файлов, добавив в конфигурацию GitSync:

{
  "delete_old_files": false
}
ПРИМЕЧАНИЕ
Параметр delete_old_files предназначен для удаления файлов, которые больше не существуют в исходном репозитории. В данном случае он используется для сохранения артефактов, создаваемых во время выполнения, и поэтому не соответствует своему первоначальному семантическому назначению.

Фильтрация файлов

Обычно GitSync синхронизирует файлы DAG с использованием фильтра файлов *.py.

Такой подход не может быть использован для проектов DBT, поскольку они состоят из нескольких типов файлов, включая:

  • *.sql

  • *.yml

  • *.yaml

  • *.json

Для синхронизации всего проекта используйте следующую маску:

{
  "files": "*"
}

Пример конфигурации GitSync для проекта DBT:

{
        "url": "git@ssh.gitlab.example.io:org/dbt-project.git",
        "files": "*",
        "branch": "main",
        "ssh_key": "dbt-key",
        "directory": "./",
        "sync_timeout": 300,
        "sync_interval": 120,
        "target_folder": "/opt/ado/dbt/project",
        "delete_old_files": false
}

Чтобы настроить эти параметры через ADCM:

  1. На странице Clusters выберите нужный кластер.

  2. Перейдите на вкладку Services и выберите сервис GitSync.

  3. Откройте окно редактирования параметра config.json и внесите необходимые изменения.

  4. Нажмите Save для сохранения изменений.

  5. В раскрывающемся меню Actions выберите Restart, убедитесь, что для параметра Apply configs from ADCM установлено значение true, и нажмите Run.

Конфигурация GitSync для синхронизации DAG и проектов DBT
Конфигурация GitSync для одновременной синхронизации DAG и DBT-проектов

Шаг 3. Проверка выполнения DBT

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

Чтобы проверить корректность выполнения DBT-проекта:

  1. Дождитесь завершения первого цикла синхронизации. Интервал синхронизации задается параметром sync_interval. Например, если значение sync_interval равно 120, GitSync проверяет репозиторий и обновляет файлы каждые 120 секунд.

  2. Убедитесь, что файлы проекта доступны в директории, указанной в параметре target_folder. Подключитесь к хосту, на котором установлен GitSync, и проверьте содержимое директории проекта:

    $ ls -la /opt/ado/dbt/project

    Пример вывода:

    drwxr-xr-x  models/
    drwxr-xr-x  macros/
    drwxr-xr-x  seeds/
    -rw-r--r--  dbt_project.yml
    -rw-r--r--  packages.yml
    -rw-r--r--  profiles.yml

    Убедитесь, что структура проекта соответствует содержимому исходного Git-репозитория.

  3. Выполните тестовую команду DBT. Команду можно выполнить вручную на хосте, с помощью действия ADCM или из DAG. Например, в директории проекта запустите команду:

    $ cd /opt/ado/dbt/project
    $ dbt run

    Пример вывода:

    12:35:10  Running with dbt=1.9.0
    12:35:11  Found 8 models, 3 tests, 1 source
    12:35:20  1 of 8 OK created model analytics.orders
    12:35:21  2 of 8 OK created model analytics.customers
    ...
    12:35:35  Finished running 8 models in 25 seconds

    В качестве альтернативы можно запустить команду DBT из DAG с использованием BashOperator. Например:

    from airflow.operators.bash import BashOperator
    
    run_dbt = BashOperator(
        task_id="run_dbt",
        bash_command="""
            cd /opt/ado/dbt/project &&
            dbt run
        """
    )
  4. Убедитесь, что после выполнения проекта DBT создал нужные артефакты. В директории проекта должны присутствовать каталоги target/ и logs/.

    Пример вывода команды ls:

    drwxr-xr-x  logs/
    drwxr-xr-x  target/
    drwxr-xr-x  models/
    -rw-r--r--  dbt_project.yml

    Директория target/ содержит скомпилированные SQL-файлы, манифесты и метаданные. Директория logs/ содержит логи выполнения DBT.

  5. После следующего цикла синхронизации GitSync убедитесь, что директории target/, logs/ и прочие файлы не были удалены:

    $ ls -la /opt/ado/dbt/project

    Если параметр delete_old_files установлен в значение false, GitSync должен сохранить эти директории и их содержимое. Если директории были удалены после синхронизации, проверьте следующее:

    • параметр delete_old_files имеет значение false;

    • проект DBT использует отдельную директорию target_folder;

    • другие внешние механизмы очистки не удаляют артефакты, создаваемые во время выполнения.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней