BigLake 테이블 생성 및 관리

이 문서에서는 BigLake 테이블을 구현하는 방법을 설명하고, 사용자가 데이터베이스 테이블 및 권한 관리에 익숙하다고 가정합니다. BigLake 테이블 개요는 BigLake 테이블 소개를 참조하세요.

시작하기 전에

  1. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

    이 튜토리얼에서는 프로덕션 워크로드가 영향을 받지 않도록 테스트 프로젝트를 만드는 것이 좋습니다.

  2. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  3. BigQuery Connection API 사용 설정

    API 사용 설정

    Apache Spark와 같은 오픈소스 엔진에서 BigLake 테이블을 읽으려면 BigQuery Storage Read API를 사용 설정해야 합니다.

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

    Cloud Shell 활성화

  5. 사용 중인 Google Cloud SDK 버전이 366.0.0 이상인지 확인합니다.

    gcloud version
    

    필요한 경우 Google Cloud SDK를 업데이트합니다.

  6. 선택사항: Terraform의 경우 Terraform GCP 버전 4.25.0 이상을 사용합니다. HashiCorp Terraform 다운로드에서 최신 버전을 다운로드할 수 있습니다.

IAM 권한

BigLake 테이블을 사용하려면 조직 내 역할을 기반으로 사용자에게 다음 Identity and Access Management(IAM) 권한이 필요합니다. 사용자 역할에 대한 자세한 내용은 보안 모델을 참조하세요. 권한 부여에 대한 자세한 내용은 리소스에 대해 부여할 수 있는 역할 보기를 참조하세요.

  • 데이터 레이크 관리자:
    • bigquery.connections.create
    • bigquery.connections.delete
    • bigquery.connections.list
    • bigquery.connections.update
  • 데이터 웨어하우스 관리자:
    • bigquery.tables.create
    • bigquery.tables.update
    • bigquery.connections.delegate
  • 데이터 분석가:
    • bigquery.jobs.create
    • bigquery.tables.get
    • bigquery.tables.getData
    • bigquery.readsessions.create

위치 고려사항

Cloud Storage를 사용하여 데이터 파일을 저장하는 경우 최적의 성능을 위해 멀티 리전 버킷이 아닌 Cloud Storage 단일 리전 또는 이중 리전 버킷을 사용하는 것이 좋습니다.

연결 리소스 만들기 및 보기

BigLake는 연결 리소스를 사용하여 데이터 레이크에 액세스합니다. 프로젝트의 단일 테이블 또는 임의 테이블 그룹과 연결 리소스를 연결할 수 있습니다.

클라우드 리소스 연결 만들기

다음 옵션 중 하나를 선택합니다.

콘솔

  1. BigQuery 페이지로 이동

    BigQuery로 이동

  2. 연결을 만들려면 데이터 추가를 클릭한 후 외부 데이터 소스를 클릭합니다.

  3. 연결 유형 목록에서 BigLake 및 원격 함수(Cloud 리소스)를 선택합니다.

  4. 연결 ID 필드에 연결 이름을 입력합니다.

  5. 연결 만들기를 클릭합니다.

  6. 탐색기 창에서 연결 리소스를 만들기 위해 사용한 프로젝트에서 연결을 클릭합니다. 연결 정보가 표시됩니다.

    연결 정보를 확인합니다.

  7. 이후 단계에서 필요하므로 연결 정보 섹션에서 서비스 계정 ID를 복사합니다.

bq

  1. 명령줄 환경에서 연결을 만듭니다.

    bq mk --connection --location=REGION --project_id=PROJECT_ID \
        --connection_type=CLOUD_RESOURCE CONNECTION_ID
    

    --project_id 매개변수는 기본 프로젝트를 재정의합니다.

    다음을 바꿉니다.

    • REGION: 연결 리전
    • PROJECT_ID: 클라우드 프로젝트 ID입니다.
    • CONNECTION_ID: 연결의 ID입니다.

    연결 리소스를 만들면 BigQuery가 고유한 시스템 서비스 계정을 만들고 이를 연결에 연계합니다.

  2. 다른 단계에 필요하므로 서비스 계정 ID를 검색하고 복사합니다.

    bq show --connection PROJECT_ID.REGION.CONNECTION_ID
    

    출력은 다음과 비슷합니다.

    name                          properties
    1234.REGION.CONNECTION_ID     {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
    

Terraform

main.tf 파일에 다음 섹션을 추가합니다.

 ## This creates a cloud resource connection.
 ## Note: The cloud resource nested object has only one output only field - serviceAccountId.
 resource "google_bigquery_connection" "connection" {
    connection_id = "CONNECTION_ID"
    project = "PROJECT_ID"
    location = "REGION"
    cloud_resource {}
}        
다음을 바꿉니다.

  • CONNECTION_ID: 연결의 ID입니다.
  • PROJECT_ID: 클라우드 프로젝트 ID입니다.
  • REGION: 연결 리전

다음 연결 오류가 발생하면 Google Cloud SDK를 업데이트합니다.

Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...

BigQuery AWS 연결 만들기

AWS에 연결하려면 BigQuery AWS 연결을 만들어야 합니다. 연결 리소스를 만들면 BigQuery가 고유 ID를 만들고 이를 연결에 연계합니다.

BigQuery Azure 연결 만들기

BigQuery는 Azure Blob Storage에서 데이터에 안전하게 액세스하는 두 가지 방법을 제공합니다. Google Cloud 서비스 계정에 Azure 애플리케이션에 대한 액세스 권한을 부여하여 ID 제휴를 사용하거나 테넌트에서 Azure Active Directory(AD) 애플리케이션에 대한 액세스 권한을 직접 부여할 수 있습니다.

데이터 레이크에 대한 액세스 설정

다음 단계에서는 BigQuery가 사용자를 대신하여 파일에 액세스할 수 있도록 새 연결 리소스에 데이터 레이크에 대한 읽기 전용 액세스 권한을 부여합니다.

Cloud Storage에 대한 액세스 설정

다음 옵션 중 하나를 선택합니다.

콘솔

서비스 계정이 Cloud Storage 버킷에 액세스할 수 있도록 연결 리소스 서비스 계정에 스토리지 객체 뷰어 IAM 역할(roles/storage.objectViewer)을 부여하는 것이 좋습니다.

콘솔

  1. IAM 및 관리자 페이지로 이동합니다.

    IAM 및 관리자로 이동

  2. 추가를 클릭합니다.

    주 구성원 추가 대화상자가 열립니다.

  3. 새 주 구성원 필드에 앞에서 복사한 서비스 계정 ID를 입력합니다.

  4. 역할 선택 필드에서 Cloud Storage를 선택한 후 스토리지 객체 뷰어를 선택합니다.

  5. 저장을 클릭합니다.

gsutil

gsutil iam ch 명령어를 사용합니다.

gsutil iam ch serviceAccount:MEMBER:objectViewer gs://example-bucket

MEMBER를 이전에 복사한 서비스 계정 ID로 바꿉니다(예: example@gcp-sa-bigquery-condel.iam.gserviceaccount.com).

자세한 내용은 버킷 수준 정책에 주 구성원 추가를 참조하세요.

Terraform

main.tf 파일에 다음 섹션을 추가합니다.

## This grants permissions to the service account of the connection created in the last step.
resource "google_project_iam_member" "connectionPermissionGrant" {
    project = "PROJECT_ID"
    role = "roles/storage.objectViewer"
    member = format("serviceAccount:%s", google_bigquery_connection.connection.cloud_resource[0].service_account_id)
}    

BigLake 테이블로 사용자를 마이그레이션한 후 Cloud Storage에 직접 액세스하도록 해당 권한을 삭제합니다. 직접 파일 액세스를 사용하면 사용자가 BigLake 테이블에 설정된 거버넌스 정책(예: 행 및 열 수준 보안 등)을 우회할 수 있습니다.

Amazon S3에 대한 액세스 설정

S3 데이터에 액세스하려면 AWS 역할에 트러스트 관계를 추가해야 합니다. 하지만 AWS 계정에 커스텀 ID 공급업체가 있으면 커스텀 AWS ID 공급업체 구성의 안내를 따릅니다.

Azure에 대한 액세스 설정

Azure에 연결하는 방법에 따라 Azure 앱에 대한 액세스를 설정하는 단계가 달라집니다. ID 제휴를 사용하여 Azure에 저장된 데이터에 액세스하는 경우 다음 단계를 따르세요.

  1. Azure 애플리케이션에 제휴 사용자 인증 정보를 추가합니다.
  2. BigQuery의 Azure 애플리케이션에 역할을 할당합니다.

제휴되지 않은 ID를 사용한 경우 다음 단계를 따르세요.

  1. Azure AD 서비스 주 구성원을 만듭니다.
  2. BigQuery의 Azure AD 애플리케이션에 역할을 할당합니다.

BigLake 테이블 만들기

BigQuery에서 테이블 만들기에 익숙한 경우 BigLake 테이블 만들기 프로세스도 비슷합니다. 테이블은 BigLake에서 지원되는 모든 파일 형식일 수 있습니다. 자세한 내용은 제한사항을 참조하세요.

Cloud Storage용 BigLake 테이블 만들기

BigLake 테이블을 만들기 전에 데이터 세트가 필요합니다. BigLake 테이블을 만들려면 다음 중 하나를 선택합니다.

콘솔

  1. BigQuery 페이지로 이동

    BigQuery로 이동

  2. 탐색기 창에서 테이블을 만들 데이터 세트를 선택한 후 테이블 만들기를 클릭합니다.

  3. 다음 항목으로 테이블 만들기에서 Google Cloud Storage를 선택한 다음 Cloud Storage 버킷에서 외부 테이블의 데이터 소스를 선택합니다.

  4. 파일 형식에 파일과 일치하는 형식을 선택합니다.

  5. 테이블 필드에 테이블 이름을 입력합니다(예: mytable).

  6. 테이블 유형에서 테이블 유형을 외부 테이블로 설정합니다. 기본적으로 Cloud 리소스 연결을 사용하여 BigLake 테이블 만들기 체크박스가 선택되어 있습니다.

  7. 연결 ID에 대해 이전에 만든 연결을 선택합니다.

  8. 테이블 만들기를 클릭합니다.

SQL

외부 Cloud Storage 테이블에 연결하여 BigLake 테이블을 만들려면 CREATE EXTERNAL TABLE DDL 문을 사용합니다.

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

    BigQuery로 이동

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

    CREATE EXTERNAL TABLE `PROJECT_ID.DATASET.EXTERNAL_TABLE_NAME`
      WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID`
      OPTIONS (
        format ="TABLE_FORMAT",
        uris = ['FILE_PATH']);
    

    다음을 바꿉니다.

    • DATASET: 테이블을 만들려는 BigQuery 데이터 세트의 이름입니다(예: mydataset).
    • EXTERNAL_FILE_NAME: 만들려는 테이블의 이름입니다(예: mytable).
    • TABLE_FORMAT: 만들려는 테이블의 형식입니다(예: PARQUET).
    • FILE_PATH: 만들려는 외부 테이블의 데이터 소스 경로입니다(예: gs://mybucket/myfile.parquet).

  3. 실행을 클릭합니다.

쿼리를 실행하는 방법에 대한 자세한 내용은 대화형 쿼리 실행을 참조하세요.

bq

명령줄 환경에서 @connection 데코레이터를 사용하여 --external_table_definition 매개변수 끝에 사용할 연결을 지정합니다.

bq mk \
    --table \
    --external_table_definition=TABLE_FORMAT=FILE_PATH@projects/PROJECT_ID/locations/REGION/connections/CONNECTION_ID \
    PROJECT_ID:DATASET.EXTERNAL_TABLE_NAME

다음을 바꿉니다.

  • TABLE_FORMAT: 만들려는 테이블의 형식입니다(예: PARQUET).
  • FILE_PATH: 만들려는 외부 테이블의 데이터 소스 경로입니다(예: gs://mybucket/myfile.parquet).
  • DATASET: 테이블을 만들려는 BigQuery 데이터 세트의 이름입니다(예: mydataset).
  • EXTERNAL_TABLE_NAME: 만들려는 테이블의 이름입니다(예: mytable).

Terraform

main.tf 파일에 다음 섹션을 추가합니다. 스키마 자동 감지를 사용하는 경우 다음 섹션에서 관련 행의 주석 처리를 삭제합니다.

## This creates a dataset for your table.
resource "google_bigquery_dataset" "dataset" {
    provider                    = google
    project                     = "PROJECT_ID"
    dataset_id                  = "DATASET"
    location                    = "REGION"
}
## If you are using schema autodetect, uncomment the following to set up ## a delay to give IAM changes time to propagate. #resource "time_sleep" "wait_7_min" { #depends_on = [google_project_iam_member.connectionPermissionGrant] #create_duration = "7m" #}
## This creates a table using the connection id. resource "google_bigquery_table" "biglakeTable" { ## If you are using schema autodetect, uncomment the following to ## set up a dependency on the prior delay. # depends_on = [time_sleep.wait_7_min] dataset_id = google_bigquery_dataset.dataset.dataset_id table_id = "EXTERNAL_TABLE_NAME" project = "PROJECT_ID" schema = <<EOF [ { "name": "country", "type": "STRING" }, { "name": "product", "type": "STRING" }, { "name": "price", "type": "INT64" } ] EOF external_data_configuration { ## Autodetect determines whether schema autodetect is active or inactive. autodetect = AUTODETECT_BOOLEAN source_format = "PARQUET" connection_id = google_bigquery_connection.connection.name source_uris = [ "gs://huron-userguide-demo/orders/*.parquet", ] } deletion_protection = false }

다음을 바꿉니다.

  • DATASET: 테이블을 만들려는 BigQuery 데이터 세트의 이름입니다(예: mydataset).
  • EXTERNAL_TABLE_NAME: 만들려는 테이블의 이름입니다(예: mytable).
  • AUTODETECT_BOOLEAN: 프로젝트에서 스키마 자동 감지를 사용하는지 여부를 정의합니다(예: true 또는 false).

BigLake는 스키마 자동 감지를 지원합니다. 하지만 스키마를 제공하지 않았고 이전 단계에서 서비스 계정에 액세스 권한이 부여되지 않은 경우 스키마를 자동 감지하려고 하면 이 단계가 액세스 거부 메시지와 함께 실패합니다.

Amazon S3용 BigLake 테이블 만들기

S3에 저장된 데이터에 액세스하려면 외부 테이블이 필요합니다. Amazon S3용 BigLake 테이블을 만들려면 Amazon S3 데이터용 외부 테이블 만들기의 안내를 따르세요.

Azure용 BigLake 테이블 만들기

Azure 스토리지에 저장된 데이터에 액세스하려면 외부 테이블이 필요합니다. Azure 스토리지용 BigLake 테이블을 만들려면 Azure 스토리지 데이터용 외부 테이블 만들기의 안내를 따르세요.

외부 테이블을 BigLake 테이블로 업그레이드

외부 테이블을 클라우드 리소스에 연결하여 외부 테이블을 BigLake 테이블로 업그레이드할 수 있습니다. 전체 플래그 및 인수 목록은 참조 주제 bq updatebq mkdef를 참조하세요.

BigLake에서 지원하는 모든 소스 형식을 사용할 수 있습니다. 자세한 내용은 제한사항을 참조하세요.

외부 테이블을 BigLake 테이블로 업데이트하려면 다음 옵션 중 하나를 선택합니다.

SQL

다음 예시에서는 CREATE OR REPLACE EXTERNAL TABLE DDL 문을 사용하여 외부 테이블을 Cloud 리소스 연결에 연결하여 외부 테이블을 BigLake 테이블로 업그레이드합니다.

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

    BigQuery로 이동

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

    CREATE OR REPLACE EXTERNAL TABLE
      `EXTERNAL_TABLE_NAME`
      WITH CONNECTION `CONNECTION_ID`
      OPTIONS(
        format="TABLE_FORMAT",
        uris="[FILE_PATH]"
        )
    

    다음을 바꿉니다.

    • DATASET: 테이블을 만들려는 BigQuery 데이터 세트의 이름입니다(예: mydataset).
    • EXTERNAL_FILE_NAME: 만들려는 테이블의 이름입니다(예: mytable).
    • TABLE_FORMAT: 만들려는 테이블의 형식입니다(예: PARQUET).
    • FILE_PATH: 만들려는 외부 테이블의 데이터 소스 경로입니다(예: gs://mybucket/myfile.parquet).

  3. 실행을 클릭합니다.

쿼리를 실행하는 방법에 대한 자세한 내용은 대화형 쿼리 실행을 참조하세요.

bq

  1. 사용할 연결을 지정하는 새로운 외부 테이블 정의를 생성합니다.

    bq mkdef --connection_id=PROJECT_ID.REGION.CONNECTION_ID \
      --source_format=TABLE_FORMAT \
      "FILE_PATH" > /tmp/DEFINITION_FILE
    

    DEFINITION_FILE을 생성하려는 테이블 정의 파일 이름으로 바꿉니다(예: tabledefinition.json).

  2. 새 외부 테이블 정의를 사용하여 테이블을 업데이트합니다.

bq update --external_table_definition=/tmp/DEFINITION_FILE PROJECT_ID:DATASET.EXTERNAL_TABLE_NAME

액세스 제어 정책 설정

BigLake 테이블에 대해 액세스 제어 정책을 만들려면 먼저 Data Catalog에서 정책 태그 분류를 만듭니다. 그런 다음 정책 태그를 민감한 행 또는 열에 적용합니다.

  • 열 수준 보안 설정에 대한 안내는 열 수준 보안 가이드를 참조하세요.

    BigLake의 열 수준 액세스 제어 정책을 정의하는 워크플로는 BigQuery 관리 테이블의 워크플로와 동일합니다.

  • 행 수준 보안 설정에 대한 안내는 행 수준 보안 가이드를 참조하세요.

예를 들어 데이터 세트 mydatasetmytable 테이블에 대한 행 액세스를 제한한다고 가정해 보겠습니다.

+---------+---------+-------+
| country | product | price |
+---------+---------+-------+
| US      | phone   |   100 |
| JP      | tablet  |   300 |
| UK      | laptop  |   200 |
+---------+---------+-------+

김(kim@example.com)에 대해 countryUS인 행으로 액세스를 제한하는 행 수준 필터를 만들 수 있습니다.

CREATE ROW ACCESS POLICY only_us_filter
ON mydataset.mytable
GRANT TO ('user:kim@example.com')
FILTER USING (country = 'US');

그런 후 다음 쿼리를 실행합니다.

SELECT * FROM projectid.mydataset.mytable;

countryUS인 행만 출력에 표시됩니다.

+---------+---------+-------+
| country | product | price |
+---------+---------+-------+
| US      | phone   |   100 |
+---------+---------+-------+

BigQuery를 통해 BigLake 테이블 쿼리

BigQuery 클라이언트를 사용하여 쿼리를 제출할 수 있습니다. bq 명령줄 도구를 사용하는 경우 query 명령어를 사용하고 --nouse_legacy_sql 또는 --use_legacy_sql=false 플래그를 사용해서 Google 표준 SQL 구문을 지정합니다. 예를 들면 다음과 같습니다.

bq query --nouse_legacy_sql "SELECT * FROM PROJECT_ID.DATASET.EXTERNAL_TABLE_NAME;"

커넥터를 사용하여 BigLake 테이블 쿼리

BigQuery 이외의 다른 데이터 처리 도구를 사용하여 Cloud Storage에서 BigLake 테이블에 액세스할 수 있습니다. 예를 들어 BigQuery 커넥터를 사용해서 Apache Spark, Trino, Apache Hive를 사용할 수 있습니다. BigQuery Storage API는 Cloud Storage 또는 BigQuery의 모든 BigLake 테이블에 대해 행 및 열 수준 거버넌스 정책을 적용합니다.

Spark

다음 예시에서는 Dataproc가 사용되지만 Spark BigQuery 커넥터를 사용하는 Spark 배포도 작동합니다.

이 예시에서는 클러스터를 만들 때 초기화 작업으로 Spark BigQuery 커넥터를 제공합니다. 이 작업을 통해 Zeppelin 노트북을 사용하고 데이터 분석가 사용자 여정을 수행할 수 있습니다.

  • Spark BigQuery 커넥터에 대해 초기화 작업을 사용하여 단일 노드 클러스터를 만듭니다.

    gcloud dataproc clusters create biglake-demo-cluster \
        --optional-components=ZEPPELIN \
        --region=REGION \
        --enable-component-gateway \
        --single-node \
        --initialization-actions gs://goog-dataproc-initialization-actions-us-central1/connectors/connectors.sh \
        --metadata bigquery-connector-url=gs://spark-lib/bigquery/spark-bigquery-latest_2.12.jar \
        --metadata spark-bigquery-connector-url=gs://spark-lib/bigquery/spark-bigquery-latest_2.12.jar
    

Dataflow

Dataflow에서 BigLake 테이블을 읽으려면 DIRECT_READ 모드의 Dataflow 커넥터를 사용하여 BigQuery Storage API를 사용합니다. 쿼리 문자열에서 읽기도 지원됩니다. Apache Beam 문서의 BigQuery I/O를 참조하세요.

감사 로깅

BigQuery의 로깅에 대한 자세한 내용은 BigQuery 모니터링 소개를 참조하세요. Google Cloud의 로깅에 대한 자세한 내용은 Cloud Logging을 참조하세요.