dbt에서 BigQuery DataFrames 사용

dbt (데이터 빌드 도구)는 최신 데이터 웨어하우스 내에서 데이터 변환을 위해 설계된 오픈소스 명령줄 프레임워크입니다. dbt는 재사용 가능한 SQL 및 Python 기반 모델을 만들어 모듈식 데이터 변환을 지원합니다. 이 도구는 ELT 파이프라인의 변환 단계에 중점을 두고 대상 데이터 웨어하우스 내에서 이러한 변환의 실행을 조정합니다. 자세한 내용은 dbt 문서를 참고하세요.

dbt에서 Python 모델은 dbt 프로젝트 내에서 Python 코드를 사용하여 정의되고 실행되는 데이터 변환입니다. 변환 로직을 위한 SQL을 작성하는 대신 Python 스크립트를 작성하면 dbt가 이를 조정하여 데이터 웨어하우스 환경 내에서 실행합니다. Python 모델을 사용하면 SQL로 표현하기에 복잡하거나 비효율적일 수 있는 데이터 변환을 실행할 수 있습니다. 이렇게 하면 Python의 기능을 활용하면서도 dbt의 프로젝트 구조, 오케스트레이션, 종속 항목 관리, 테스트, 문서화 기능을 계속 사용할 수 있습니다. 자세한 내용은 Python 모델을 참고하세요.

dbt-bigquery 어댑터는 BigQuery DataFrames에 정의된 Python 코드 실행을 지원합니다. 이 기능은 dbt Clouddbt Core에서 사용할 수 있습니다. 최신 버전의 dbt-bigquery 어댑터를 클론하여 이 기능을 사용할 수도 있습니다.

필요한 역할

dbt-bigquery 어댑터는 OAuth 기반 인증과 서비스 계정 기반 인증을 지원합니다.

OAuth를 사용하여 dbt-bigquery 어댑터에 인증하려는 경우 관리자에게 다음 역할을 부여해 달라고 요청하세요.

서비스 계정을 사용하여 dbt-bigquery 어댑터에 인증하려는 경우 관리자에게 사용하려는 서비스 계정에 다음 역할을 부여해 달라고 요청하세요.

서비스 계정을 사용하여 인증하는 경우 사용할 서비스 계정에 서비스 계정 사용자 역할(roles/iam.serviceAccountUser)이 부여되어 있는지도 확인합니다.

Python 실행 환경

dbt-bigquery 어댑터는 Colab Enterprise 노트북 실행자 서비스를 사용하여 BigQuery DataFrames Python 코드를 실행합니다. Colab Enterprise 노트북은 모든 Python 모델에 대해 dbt-bigquery 어댑터에 의해 자동으로 생성되고 실행됩니다. 노트북을 실행할Trusted Cloud 프로젝트를 선택할 수 있습니다. 노트북은 모델의 Python 코드를 실행하며, 이 코드는 BigQuery DataFrames 라이브러리에서 BigQuery SQL로 변환됩니다. 그러면 구성된 프로젝트에서 BigQuery SQL이 실행됩니다. 다음 다이어그램은 제어 흐름을 보여줍니다.

노트북용 BigQuery DataFrames Python 실행 환경

프로젝트에 아직 사용 가능한 노트북 템플릿이 없고 코드를 실행하는 사용자에게 템플릿을 만들 권한이 있는 경우 dbt-bigquery 어댑터는 기본 노트북 템플릿을 자동으로 만들고 사용합니다. dbt 구성을 사용하여 다른 노트북 템플릿을 지정할 수도 있습니다.

노트북을 실행하려면 코드와 로그를 저장할 스테이징 Cloud Storage 버킷이 필요합니다. 하지만 dbt-bigquery 어댑터는 로그를 dbt 로그로 복사하므로 버킷을 살펴볼 필요가 없습니다.

지원되는 기능

dbt-bigquery 어댑터는 BigQuery DataFrames를 실행하는 dbt Python 모델에 다음 기능을 지원합니다.

  • dbt.source() 매크로를 사용하여 기존 BigQuery 테이블에서 데이터를 로드합니다.
  • dbt.ref() 매크로를 사용하여 다른 dbt 모델에서 데이터를 로드하여 종속 항목을 빌드하고 Python 모델로 DAG (방향 그래프)를 만듭니다.
  • Python 코드 실행과 함께 사용할 수 있는 PyPi의 Python 패키지를 지정하고 사용합니다. 자세한 내용은 구성을 참고하세요.
  • BigQuery DataFrames 모델에 맞춤 노트북 런타임 템플릿을 지정합니다.

dbt-bigquery 어댑터는 다음 구체화 전략을 지원합니다.

  • 테이블 매터리얼라이제이션: 각 실행마다 데이터가 테이블로 다시 빌드됩니다.
  • 병합 전략을 사용한 증분 구체화: 새 데이터 또는 업데이트된 데이터가 기존 테이블에 추가되며, 종종 병합 전략을 사용하여 변경사항을 처리합니다.

BigQuery DataFrames를 사용하도록 dbt 설정

dbt Core를 사용하는 경우 BigQuery DataFrames와 함께 사용하려면 profiles.yml 파일을 사용해야 합니다. 다음 예에서는 oauth 메서드를 사용합니다.

your_project_name:
  outputs:
    dev:
      compute_region: us-central1
      dataset: your_bq_dateset
      gcs_bucket: your_gcs_bucket
      job_execution_timeout_seconds: 300
      job_retries: 1
      location: US
      method: oauth
      priority: interactive
      project: your_gcp_project
      threads: 1
      type: bigquery
  target: dev

dbt Cloud를 사용하는 경우 dbt Cloud 인터페이스에서 직접 데이터 플랫폼에 연결할 수 있습니다. 이 시나리오에서는 profiles.yml 파일이 필요하지 않습니다. 자세한 내용은 profiles.yml 정보를 참고하세요.

다음은 dbt_project.yml 파일의 프로젝트 수준 구성 예입니다.

# Name your project! Project names should contain only lowercase characters
# and underscores. A good package name should reflect your organization's
# name or the intended use of these models.
name: 'your_project_name'
version: '1.0.0'

# Configuring models
# Full documentation: https://docs.getdbt.com/docs/configuring-models

# In this example config, we tell dbt to build all models in the example/
# directory as views. These settings can be overridden in the individual model
# files using the config(...) macro.

models:
  your_project_name:
    submission_method: bigframes
    notebook_template_id: 7018811640745295872
    packages: ["scikit-learn", "mlflow"]
    timeout: 3000
    # Config indicated by + and applies to all files under models/example/
    example:
      +materialized: view

일부 매개변수는 Python 코드 내에서 dbt.config 메서드를 사용하여 구성할 수도 있습니다. 이러한 설정이 dbt_project.yml 파일과 충돌하는 경우 dbt.config가 있는 구성이 우선 적용됩니다.

자세한 내용은 모델 구성dbt_project.yml을 참고하세요.

구성

Python 모델에서 dbt.config 메서드를 사용하여 다음 구성을 설정할 수 있습니다. 이러한 구성은 프로젝트 수준 구성보다 우선 적용됩니다.

구성 필수 사용
submission_method submission_method=bigframes
notebook_template_id 아니요 지정하지 않으면 기본 템플릿이 생성되고 사용됩니다.
packages 아니요 필요한 경우 Python 패키지 목록을 추가로 지정합니다.
timeout 아니요 선택사항: 작업 실행 시간 제한을 연장합니다.

Python 모델 예시

다음 섹션에서는 시나리오 예시와 Python 모델을 보여줍니다.

BigQuery 테이블에서 데이터 로드

기존 BigQuery 테이블의 데이터를 Python 모델의 소스로 사용하려면 먼저 YAML 파일에서 이 소스를 정의합니다. 다음 예는 source.yml 파일에 정의되어 있습니다.

version: 2

sources:
  - name: my_project_source   # A custom name for this source group
    database: bigframes-dev   # Your Google Cloud project ID
    schema: yyy_test_us       # The BigQuery dataset containing the table
    tables:
      - name: dev_sql1        # The name of your BigQuery table

그런 다음 이 YAML 파일에 구성된 데이터 소스를 사용할 수 있는 Python 모델을 빌드합니다.

def model(dbt, session):
    # Configure the model to use BigFrames for submission
    dbt.config(submission_method="bigframes")

    # Load data from the 'dev_sql1' table within 'my_project_source'
    source_data = dbt.source('my_project_source', 'dev_sql1')

    # Example transformation: Create a new column 'id_new'
    source_data['id_new'] = source_data['id'] * 10

    return source_data

다른 모델 참조

다음 예와 같이 다른 dbt 모델의 출력에 종속되는 모델을 빌드할 수 있습니다. 이는 모듈식 데이터 파이프라인을 만드는 데 유용합니다.

def model(dbt, session):
    # Configure the model to use BigFrames
    dbt.config(submission_method="bigframes")

    # Reference another dbt model named 'dev_sql1'.
    # It assumes you have a model defined in 'dev_sql1.sql' or 'dev_sql1.py'.
    df_from_sql = dbt.ref("dev_sql1")

    # Example transformation on the data from the referenced model
    df_from_sql['id'] = df_from_sql['id'] * 100

    return df_from_sql

패키지 종속 항목 지정

Python 모델에 MLflow 또는 Boto3와 같은 특정 서드 파티 라이브러리가 필요한 경우 다음 예와 같이 모델 구성에서 패키지를 선언할 수 있습니다. 이러한 패키지는 실행 환경에 설치됩니다.

def model(dbt, session):
    # Configure the model for BigFrames and specify required packages
    dbt.config(
        submission_method="bigframes",
        packages=["mlflow", "boto3"]  # List the packages your model needs
    )

    # Import the specified packages for use in your model
    import mlflow
    import boto3

    # Example: Create a DataFrame showing the versions of the imported packages
    data = {
        "mlflow_version": [mlflow.__version__],
        "boto3_version": [boto3.__version__],
        "note": ["This demonstrates accessing package versions after import."]
    }
    bdf = bpd.DataFrame(data)

    return bdf

기본이 아닌 템플릿 지정

실행 환경을 더 세부적으로 제어하거나 사전 구성된 설정을 사용하려면 다음 예와 같이 BigQuery DataFrames 모델에 기본이 아닌 노트북 템플릿을 지정할 수 있습니다.

def model(dbt, session):
    dbt.config(
        submission_method="bigframes",
     # ID of your pre-created notebook template
        notebook_template_id="857350349023451yyyy",
    )

    data = {"int": [1, 2, 3], "str": ['a', 'b', 'c']}
    return bpd.DataFrame(data=data)

테이블 구체화

dbt가 Python 모델을 실행할 때는 결과를 데이터 웨어하우스에 저장하는 방법을 알아야 합니다. 이를 실현이라고 합니다.

표준 테이블 구체화의 경우 dbt는 실행될 때마다 창고의 테이블을 만들거나 모델의 출력으로 완전히 대체합니다. 이는 기본적으로 또는 다음 예와 같이 materialized='table' 속성을 명시적으로 설정하여 실행됩니다.

def model(dbt, session):
    dbt.config(
        submission_method="bigframes",
     # Instructs dbt to create/replace this model as a table
        materialized='table',
    )

    data = {"int_column": [1, 2], "str_column": ['a', 'b']}
    return bpd.DataFrame(data=data)

병합 전략을 사용한 증분 구체화를 통해 dbt는 새 행 또는 수정된 행으로만 테이블을 업데이트할 수 있습니다. 이는 매번 테이블을 완전히 다시 빌드하는 것이 비효율적일 수 있으므로 대규모 데이터 세트에 유용합니다. 병합 전략은 이러한 업데이트를 처리하는 일반적인 방법입니다.

이 접근 방식은 다음을 실행하여 변경사항을 지능적으로 통합합니다.

  • 변경된 기존 행을 업데이트합니다.
  • 새 행을 추가합니다.
  • 구성에 따라 선택사항: 소스에 더 이상 없는 행을 삭제합니다.

병합 전략을 사용하려면 다음 예와 같이 dbt가 모델의 출력과 기존 테이블 간의 일치하는 행을 식별하는 데 사용할 수 있는 unique_key 속성을 지정해야 합니다.

def model(dbt, session):
    dbt.config(
        submission_method="bigframes",
        materialized='incremental',
        incremental_strategy='merge',
        unique_key='int',  # Specifies the column to identify unique rows
    )

    # In this example:
    # - Row with 'int' value 1 remains unchanged.
    # - Row with 'int' value 2 has been updated.
    # - Row with 'int' value 4 is a new addition.
    # The 'merge' strategy will ensure that only the updated row ('int 2')
    # and the new row ('int 4') are processed and integrated into the table.
    data = {"int": [1, 2, 4], "str": ['a', 'bbbb', 'd']}
    return bpd.DataFrame(data=data)

문제 해결

dbt 로그에서 Python 실행을 관찰할 수 있습니다.

또한 Colab Enterprise 실행 페이지에서 코드와 로그 (이전 실행 포함)를 볼 수 있습니다.

Colab Enterprise 실행으로 이동

결제

BigQuery DataFrames와 함께 dbt-bigquery 어댑터를 사용하면 다음과 같은 요금이 청구됩니다. Trusted Cloud by S3NS

  • 노트북 실행: 노트북 런타임 실행에 대한 요금이 청구됩니다. 자세한 내용은 Notebook 런타임 가격 책정을 참고하세요.

  • BigQuery 쿼리 실행: 노트북에서 BigQuery DataFrames는 Python을 SQL로 변환하고 BigQuery에서 코드를 실행합니다. BigQuery DataFrames 가격 책정에 설명된 대로 프로젝트 구성 및 쿼리에 따라 요금이 청구됩니다.

BigQuery 결제 콘솔에서 다음 결제 라벨을 사용하여 노트북 실행 및 dbt-bigquery 어댑터에 의해 트리거된 BigQuery 실행에 대한 결제 보고서를 필터링할 수 있습니다.

  • BigQuery 실행 라벨: bigframes-dbt-api

다음 단계