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
권한을 부여합니다.
- BigQuery 사용자(
roles/bigquery.user
) - BigQuery 작업 사용자(
roles/bigquery.jobUser
) - BigQuery 관리자(
roles/bigquery.admin
)
서비스 계정을 사용하여 실행되는 작업을 제출하려면 사용자 계정에 서비스 계정 사용자(roles/iam.serviceAccountUser
) 역할이 있어야 합니다. 동일한 사용자 계정을 사용하여 서비스 계정을 만드는 경우 사용자 계정에 서비스 계정 관리자(roles/iam.serviceAccountAdmin
) 역할이 있어야 합니다. 사용자의 액세스를 프로젝트 내의 모든 서비스 계정이 아닌 단일 서비스 계정으로 제한하는 방법은 단일 역할 부여를 참조하세요.
사용자 계정에 연속 쿼리 사용 사례에 필요한 API를 사용 설정해야 하는 경우 사용자 계정에 서비스 사용량 관리자(roles/serviceusage.serviceUsageAdmin
) 역할이 있어야 합니다.
서비스 계정 권한
BigQuery 테이블에서 데이터를 내보내려면 서비스 계정에 bigquery.tables.export
IAM 권한이 있어야 합니다. 다음 각 IAM 역할은 bigquery.tables.export
권한을 부여합니다.
- BigQuery 데이터 뷰어(
roles/bigquery.dataViewer
) - BigQuery 데이터 편집자(
roles/bigquery.dataEditor
) - BigQuery 데이터 소유자(
roles/bigquery.dataOwner
) - BigQuery 관리자(
roles/bigquery.admin
)
서비스 계정이 Pub/Sub에 액세스하려면 서비스 계정에 다음 IAM 역할을 모두 부여해야 합니다.
커스텀 역할을 통해 필요한 권한을 얻을 수도 있습니다.
시작하기 전에
Enable the BigQuery and Pub/Sub APIs.
Pub/Sub로 내보내기
EXPORT DATA
문을 사용하여 Pub/Sub 주제로 데이터를 내보냅니다.
콘솔
Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.
쿼리 편집기에서 더보기 > 쿼리 설정을 클릭합니다.
지속적 쿼리 섹션에서 연속 쿼리 모드 사용 체크박스를 선택합니다.
서비스 계정 상자에서 만든 서비스 계정을 선택합니다.
저장을 클릭합니다.
쿼리 편집기에서 다음 문을 입력합니다.
EXPORT DATA OPTIONS ( format = 'CLOUD_PUBSUB', uri = 'https://pubsub.googleapis.com/projects/PROJECT_ID/topics/TOPIC_ID' ) AS ( QUERY );
다음을 바꿉니다.
실행을 클릭합니다.
bq
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
명령줄에서 다음 플래그와 함께
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
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 가격 책정을 참조하세요.