dbt의 개발 구성에 관하여

개시하다


회사 내부에서dbt개발 시 환경 구성을 논의했기 때문에 자신의 구성을 총결하였다.

개요


dbt로 개발 환경, 정식 환경 등을 분할할 때 분리profiles.yml의 target을 통해 디버깅 목적지를 전환할 수 있습니다.그러나 여러 사람이 개발을 진행할 때 같은 환경dbt run에 대해 집행하면 매번 데이터 슈퍼마켓을 고쳐 개발하기 어렵다.
이번에 우리는dbt의 사용자 정의 모델 기능을 채택하여 모든 개발 지점에서 모델을 생성하였다.그러나 무궁무진한 패턴이 생성되면 개발 환경이 분산되기 때문에 github actions를 사용해 CI/CD를 조합해 PR 병합 시 생성된 패턴을 삭제할 수 있다.

견본


여기에 전선이 놓여 있다.
https://github.com/ugmuka/dbt_sample

전제 조건

  • dbt-core를 사용합니다.version: 1.0.4
  • 대상: Snowflake
  • direnv
  • 사용
  • 샘플 데이터로 jaffle_shop 사용
  • 폴더 구성


    .
    ├── README.md
    ├── dbt_packages
    ├── dbt_project.yml
    ├── logs
    ├── macros
    ├── models
    ├── profiles
    ├── requirements.txt
    ├── seeds
    ├── target
    └── venv
    

    분기별 생성 모드


    환경 변수에 분기 이름을 입력하려면direnv를 사용하십시오.
    .envrc
    export CURRENT_BRANCH="$(git branch --show-current | sed -e 's/\//_/g')"
    
    포괄하다로 변환합니다.
    $ echo $CUURENT_BRANCH
    feature_test
    
    다음profiles.yml에 지점 이름을 모드로 설정합니다.
    profiles.yml
    dbt_sample:
      target: dev
      outputs:
        dev:
          type: snowflake
          account: "{{ env_var('SNOWFLAKE_ACCOUNT') }}"
    
          user: "{{ env_var('SNOWFLAKE_USERNAME') }}"
          password: "{{ env_var('SNOWFLAKE_PASSWORD') }}"
    
          role: DEVELOPER_ROLE
          database: TEST_DB
          warehouse: TEST_WH
          schema: "{{ env_var('CURRENT_BRANCH') }}" # branch name
          threads: 1
          client_session_keep_alive: False
          query_tag: DBT
    
    모든 모델의 모드 이름을 설정합니다.
    dbt_project.yml
    name: 'jaffle_shop'
    
    config-version: 2
    version: '0.1'
    
    profile: 'dbt_sample'
    
    model-paths: ["models"]
    seed-paths: ["seeds"]
    test-paths: ["tests"]
    analysis-paths: ["analysis"]
    macro-paths: ["macros"]
    
    target-path: "target"
    clean-targets:
        - "target"
        - "dbt_modules"
        - "logs"
    
    require-dbt-version: [">=1.0.0", "<2.0.0"]
    
    models:
      jaffle_shop:
        materialized: table
        +schema: raw
        staging:
          materialized: view
          +schema: staging
    
    seeds:
      jaffle_shop:
        +database: test_db
        +schema: raw
    
    
    마지막으로 개발자 지점과main 지점에서 이미 정해진 패턴 이름macros 이하custom을 사용합니다schema 값의 매크로를 설정합니다.
    macros/generate_schema_name.sql
    {% macro generate_schema_name(custom_schema_name, node) -%}
    
        {%- set default_schema = target.schema -%}
        {%- if default_schema=='main' or default_schema=='develop' -%}
    
            {{ custom_schema_name }}
    
        {%- else -%}
    
            {{ default_schema }}_{{ custom_schema_name | trim }}
    
        {%- endif -%}
    
    {%- endmacro %}
    
    dbt seed에 테스트 데이터를 삽입하여 실행dbt run.
    Snowflake UI 에서 모드 확인 후
    rawstaging모델 외에도 feature_test_rawfeature_test_staging도 알 수 있다.

    참고 자료


    dbt에 대한 사용자 정의 모드
    https://docs.getdbt.com/docs/building-a-dbt-project/building-models/using-custom-schemas

    PR 결합 후 삭제 모드


    snowsql에서 실행할 수 있도록github actions를 구성합니다 drop schema.
    시크릿을 Snowflak 계정으로 설정하십시오.
    .github/workflows/drop_schema.yml
    name: drop_schema
    on: 
      pull_request:
        types: [closed]
    jobs:
      drop-schema:
        if: github.event.pull_request.merged == true
        runs-on: ubuntu-20.04
        container:
          image: python:3.8-slim
        steps:
          - uses: actions/checkout@v2
          - env:
              BRANCH_NAME: ${{github.head_ref}}
              SNOWSQL_ACCOUNT: ${{secrets.SNOWSQL_ACCOUNT}}
              SNOWSQL_USER: ${{secrets.SNOWSQL_USER}}
              SNOWSQL_DATABASE: ${{secrets.SNOWSQL_DATABASE}}
              SNOWSQL_ROLE: ${{secrets.SNOWSQL_ROLE}}
              SNOWSQL_WAREHOUSE: ${{secrets.SNOWSQL_WAREHOUSE}}
              SNOWSQL_PWD: ${{secrets.SNOWSQL_PWD}}
            run: ./.github/workflows/drop_schema.sh
    
    셸 스크립트에 snowsql을 설치하여 SQL을 실행합니다.
    drop_schema.sh
    #!/bin/bash
    # get snowsql
    apt update
    apt-get install -y curl unzip
    
    curl -O https://sfc-repo.snowflakecomputing.com/snowsql/bootstrap/1.2/linux_x86_64/snowsql-1.2.21-linux_x86_64.bash
    SNOWSQL_DEST=/root/bin SNOWSQL_LOGIN_SHELL=/root/.profile bash ./snowsql-1.2.21-linux_x86_64.bash
    alias snowsql=/root/bin/snowsql
    
    # drop schema
    branch_name="$(echo $BRANCH_NAME | sed -e 's/refs\/heads//g' | sed -e 's/\//_/g')"
    
    sql="drop schema ${branch_name}_raw;"
    /root/bin/snowsql -q "${sql}" 
    
    sql="drop schema ${branch_name}_staging;"
    /root/bin/snowsql -q "${sql}" 
    
    이렇게 하면 적절한 PR을 보내 합병할 수 있다.
    github actions UI 확인 후

    github actions가 정상적으로 끝났습니다. 모드가 삭제되었습니다.

    끝맺다


    dbt의 개발 환경 구성은 아직 최선의 실천을 결정하지 못한 것 같아서 제 디자인을 보여줄 수 있는 기회라고 생각해서 했습니다.더 좋은 방법이 있으면 알려주세요.

    좋은 웹페이지 즐겨찾기