Pub/Sub로 데이터 내보내기(역방향 ETL)

이 문서에서는 BigQuery에서 Pub/Sub로 역방향 추출, 변환, 로드(RETL)를 설정하는 방법을 설명합니다. 이렇게 하려면 연속 쿼리에서 EXPORT DATA을 사용하여 BigQuery에서 Pub/Sub 주제로 데이터를 내보내면 됩니다.

Pub/Sub에 대한 RETL 워크플로를 사용하여 BigQuery의 분석 기능을 Pub/Sub의 확장 가능한 비동기 전역 메시지 서비스와 결합할 수 있습니다. 이 워크플로를 사용하면 이벤트 기반 방식으로 다운스트림 애플리케이션 및 서비스에 데이터를 제공할 수 있습니다.

기본 요건

서비스 계정을 만들어야 합니다. 결과를 Pub/Sub 주제로 내보내는 연속 쿼리를 실행하려면 서비스 계정이 필요합니다.

연속 쿼리 결과를 메시지로 수신하기 위해 Pub/Sub 주제를 생성하고, 대상 애플리케이션이 해당 메시지를 수신할 수 있도록 Pub/Sub 구독을 생성해야 합니다.

필요한 역할

이 섹션에서는 연속 쿼리를 만드는 사용자 계정과 연속 쿼리를 실행하는 서비스 계정에 필요한 역할 및 권한에 대한 정보를 제공합니다.

사용자 계정 권한

BigQuery에서 작업을 만들려면 사용자 계정에 bigquery.jobs.create IAM 권한이 있어야 합니다. 다음 각 IAM 역할은 bigquery.jobs.create 권한을 부여합니다.

서비스 계정을 사용하여 실행되는 작업을 제출하려면 사용자 계정에 서비스 계정 사용자(roles/iam.serviceAccountUser) 역할이 있어야 합니다. 동일한 사용자 계정을 사용하여 서비스 계정을 만드는 경우 사용자 계정에 서비스 계정 관리자(roles/iam.serviceAccountAdmin) 역할이 있어야 합니다. 사용자의 액세스를 프로젝트 내의 모든 서비스 계정이 아닌 단일 서비스 계정으로 제한하는 방법은 단일 역할 부여를 참조하세요.

사용자 계정에 연속 쿼리 사용 사례에 필요한 API를 사용 설정해야 하는 경우 사용자 계정에 서비스 사용량 관리자(roles/serviceusage.serviceUsageAdmin) 역할이 있어야 합니다.

서비스 계정 권한

BigQuery 테이블에서 데이터를 내보내려면 서비스 계정에 bigquery.tables.export IAM 권한이 있어야 합니다. 다음 각 IAM 역할은 bigquery.tables.export 권한을 부여합니다.

서비스 계정이 Pub/Sub에 액세스하려면 서비스 계정에 다음 IAM 역할을 모두 부여해야 합니다.

커스텀 역할을 통해 필요한 권한을 얻을 수도 있습니다.

시작하기 전에

API BigQuery and Pub/Sub 사용 설정

API 사용 설정

Pub/Sub로 내보내기

EXPORT DATA을 사용하여 Pub/Sub 주제로 데이터를 내보냅니다.

콘솔

  1. Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 쿼리 편집기에서 더보기 > 쿼리 설정을 클릭합니다.

  3. 지속적 쿼리 섹션에서 연속 쿼리 모드 사용 체크박스를 선택합니다.

  4. 서비스 계정 상자에서 만든 서비스 계정을 선택합니다.

  5. 저장을 클릭합니다.

  6. 쿼리 편집기에서 다음 문을 입력합니다.

    EXPORT DATA
    OPTIONS (
    format = 'CLOUD_PUBSUB',
    uri = 'https://pubsub.googleapis.com/projects/PROJECT_ID/topics/TOPIC_ID'
    ) AS
    (
    QUERY
    );
    

    다음을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID입니다.
    • TOPIC_ID: Pub/Sub 주제 ID Google Cloud 콘솔의 주제 페이지에서 주제 ID를 가져올 수 있습니다.
    • QUERY: 내보낼 데이터를 선택하는 SQL 문입니다. SQL 문에는 지원되는 작업만 포함되어야 합니다.
  7. 실행을 클릭합니다.

bq

  1. Google Cloud 콘솔에서 Cloud Shell을 활성화합니다.

    Cloud Shell 활성화

    Google Cloud 콘솔 하단에서 Cloud Shell 세션이 시작되고 명령줄 프롬프트가 표시됩니다. Cloud Shell은 Google Cloud CLI가 사전 설치된 셸 환경으로, 현재 프로젝트의 값이 이미 설정되어 있습니다. 세션이 초기화되는 데 몇 초 정도 걸릴 수 있습니다.

  2. 명령줄에서 다음 플래그와 함께 bq query 명령어를 사용하여 연속 쿼리를 실행합니다.

    • 쿼리를 연속으로 만들려면 --continuous 플래그를 true로 설정합니다.
    • --connection_property 플래그를 사용하여 사용할 서비스 계정을 지정합니다.
    bq query --project_id=PROJECT_ID --use_legacy_sql=false \
    --continuous=true --connection_property=service_account=SERVICE_ACCOUNT_EMAIL \
    'EXPORT DATA OPTIONS (format = "CLOUD_PUBSUB", uri = "https://pubsub.googleapis.com/projects/PROJECT_ID/topics/TOPIC_ID") AS (QUERY);'
    

    다음을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID입니다.
    • SERVICE_ACCOUNT_EMAIL: 서비스 계정 이메일입니다. Google Cloud 콘솔의 서비스 계정 페이지에서 서비스 계정 이메일을 가져올 수 있습니다.
    • QUERY: 내보낼 데이터를 선택하는 SQL 문입니다. SQL 문에는 지원되는 작업만 포함되어야 합니다.

API

  1. jobs.insert 메서드를 호출하여 연속 쿼리를 실행합니다. 전달하는 Job 리소스JobConfigurationQuery 리소스에서 다음 필드를 설정합니다.

    • 쿼리를 연속으로 만들려면 continuous 필드를 true로 설정합니다.
    • connection_property 필드를 사용하여 사용할 서비스 계정을 지정합니다.
    curl --request POST \
      'https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/jobs'
      --header 'Authorization: Bearer $(gcloud auth print-access-token) \
      --header 'Accept: application/json' \
      --header 'Content-Type: application/json' \
      --data '("configuration":("query":"EXPORT DATA OPTIONS (format = 'CLOUD_PUBSUB', uri = 'https://pubsub.googleapis.com/projects/PROJECT_ID/topics/TOPIC_ID') AS (QUERY);","useLegacySql":false,"continuous":true,"connectionProperties":["key": "service_account","value":"SERVICE_ACCOUNT_EMAIL"]))' \
      --compressed
    

    다음을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID입니다.
    • QUERY: 내보낼 데이터를 선택하는 SQL 문입니다. SQL 문에는 지원되는 작업만 포함되어야 합니다.
    • SERVICE_ACCOUNT_EMAIL: 서비스 계정 이메일입니다. Google Cloud 콘솔의 서비스 계정 페이지에서 서비스 계정 이메일을 가져올 수 있습니다.

Pub/Sub로 여러 열 내보내기

출력에 여러 열을 포함하려면 열 값을 포함하는 구조체 열을 만든 후 TO_JSON_STRING 함수를 사용하여 구조체 값을 JSON 문자열로 변환하면 됩니다. 다음 예시에서는 JSON 문자열로 형식이 지정된 4개 열의 데이터를 내보냅니다.

EXPORT DATA
  OPTIONS (
    format = 'CLOUD_PUBSUB',
    uri = 'https://pubsub.googleapis.com/projects/myproject/topics/taxi-real-time-rides')
AS (
  SELECT
    TO_JSON_STRING(
      STRUCT(
        ride_id,
        timestamp,
        latitude,
        longitude)) AS message
  FROM `myproject.real_time_taxi_streaming.taxi_rides`
  WHERE ride_status = 'enroute'
);

내보내기 최적화

연속 쿼리 작업 성능이 사용 가능한 컴퓨팅 리소스에 의해 제한되는 것으로 보이면 BigQuery CONTINUOUS 슬롯 예약 할당 크기를 늘려보세요.

제한사항

  • 내보낸 데이터는 단일 STRING 또는 BYTES 열로 구성되어야 합니다. 열 이름은 원하는 대로 지정할 수 있습니다.
  • Pub/Sub로 내보내려면 연속 쿼리를 사용해야 합니다.
  • 연속 쿼리에서 Pub/Sub 주제에 스키마를 전달할 수 없습니다.
  • 스키마를 사용하는 Pub/Sub 주제로 데이터를 내보낼 수 없습니다.
  • NULL 값이 포함된 데이터는 내보낼 수 없습니다. 연속 쿼리에 WHERE message IS NOT NULL 필터를 포함하여 NULL 값을 쿼리 결과에서 제외할 수 있습니다.
  • 내보낸 데이터는 Pub/Sub 할당량을 초과할 수 없습니다.

가격 책정

연속 쿼리에서 데이터를 내보내면 BigQuery 용량 계산 가격 책정을 사용하여 요금이 청구됩니다. 연속 쿼리를 실행하려면 Enterprise 또는 Enterprise Plus 버전을 사용하는 예약 CONTINUOUS 작업 유형을 사용하는 예약 할당이 있어야 합니다.

데이터를 내보낸 후 Pub/Sub 사용 요금이 청구됩니다. 자세한 내용은 Pub/Sub 가격 책정을 참조하세요.