BigQuery의 테이블에서 레이크하우스 런타임 카탈로그 사용

이 문서에서는 BigQuery 테이블 및 Managed Service for Apache Spark와 함께 Lakehouse 런타임 카탈로그 를 사용하는 방법을 보여주는 예를 제공합니다.

Lakehouse 런타임 카탈로그를 사용하면 BigQuery에서 표준 (기본 제공) 테이블, BigQuery 관리형 Apache Iceberg 테이블, 및 외부 Apache Iceberg 테이블 을 만들고 사용할 수 있습니다.

지원되는 테이블 형식

Apache Iceberg V2 테이블만 지원되며 Iceberg V1 테이블은 지원되지 않습니다. 기존 Iceberg V1 테이블이 있는 경우 Lakehouse 런타임 카탈로그와 함께 사용하기 전에 V2로 업그레이드해야 합니다 (예: ALTER TABLE catalog.schema.table SET TBLPROPERTIES ('format-version'='2'); 실행 또는 유사한 엔진 작업 사용).

시작하기 전에

  1. Google Cloud 프로젝트에 결제를 사용 설정합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.
  2. BigQuery 및 Dataproc API를 사용 설정합니다.

    API 사용 설정

필요한 역할

Lakehouse 런타임 카탈로그를 메타데이터 스토어로 사용하여 Managed Service for Apache Spark를 사용하는 데 필요한 권한을 얻으려면 관리자에게 다음 IAM 역할을 부여해 달라고 요청하세요.

역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

테이블에 연결

  1. 콘솔에서 데이터 세트를 만듭니다. Google Cloud

    CREATE SCHEMA `PROJECT_ID`.DATASET_NAME;

    다음을 바꿉니다.

    • PROJECT_ID: 데이터 세트를 만들 Google Cloud 프로젝트의 ID
    • DATASET_NAME: 데이터 세트의 이름
  2. 클라우드 리소스 연결을 만듭니다.

  3. 표준 BigQuery 테이블을 만듭니다.

    CREATE TABLE `PROJECT_ID`.DATASET_NAME.TABLE_NAME (name STRING,id INT64);

    다음을 바꿉니다.

    • TABLE_NAME: 테이블의 이름
  4. 표준 BigQuery 테이블에 데이터를 삽입합니다.

    INSERT INTO `PROJECT_ID`.DATASET_NAME.TABLE_NAME VALUES ('test_name1', 123),('test_name2', 456),('test_name3', 789);
  5. BigQuery 관리형 Apache Iceberg 테이블을 만듭니다.

    예를 들어 테이블을 만들려면 다음 CREATE 문을 실행합니다.

    CREATE TABLE `PROJECT_ID`.DATASET_NAME.ICEBERG_TABLE_NAME(
    name STRING,id INT64
    )
    WITH CONNECTION `CONNECTION_NAME`
    OPTIONS (
    file_format = 'PARQUET',
    table_format = 'ICEBERG',
    storage_uri = 'STORAGE_URI');

    다음을 바꿉니다.

    • ICEBERG_TABLE_NAME: 관리형 Apache Iceberg 테이블의 이름 예: iceberg_managed_table
    • CONNECTION_NAME: 이전 단계에서 만든 연결의 이름 (예: myproject.us.myconnection)
    • STORAGE_URI: 정규화된 Cloud Storage URI (예: gs://mybucket/table)
  6. BigQuery 관리형 Apache Iceberg 테이블에 데이터를 삽입합니다.

    INSERT INTO `PROJECT_ID`.DATASET_NAME.ICEBERG_TABLE_NAME VALUES ('test_name1', 123),('test_name2', 456),('test_name3', 789);
  7. 외부 Apache Iceberg 테이블을 만듭니다.

    예를 들어 외부 Apache Iceberg 테이블을 만들려면 다음 CREATE 문을 실행합니다.

    CREATE OR REPLACE EXTERNAL TABLE  `PROJECT_ID`.DATASET_NAME.READONLY_ICEBERG_TABLE_NAME
    WITH CONNECTION `CONNECTION_NAME`
    OPTIONS (
      format = 'ICEBERG',
      uris =
        ['BUCKET_PATH'],
      require_partition_filter = FALSE);

    다음을 바꿉니다.

    • READONLY_ICEBERG_TABLE_NAME: 읽기 전용 테이블의 이름
    • BUCKET_PATH: 외부 테이블의 데이터가 포함된 Cloud Storage 버킷 경로( ['gs://bucket_name/[folder_name/]file_name'] 형식)
  8. Apache Spark에서 표준 테이블, BigQuery 관리형 Apache Iceberg 테이블, 외부 Apache Iceberg 테이블을 쿼리합니다.

    from pyspark.sql import SparkSession
    
    # Create a spark session
    spark = SparkSession.builder \
    .appName("Lakehouse runtime catalog Iceberg") \
    .config("spark.sql.catalog.CATALOG_NAME", "org.apache.iceberg.spark.SparkCatalog") \
    .config("spark.sql.catalog.CATALOG_NAME.catalog-impl", "org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog") \
    .config("spark.sql.catalog.CATALOG_NAME.gcp_project", "PROJECT_ID") \
    .config("spark.sql.catalog.CATALOG_NAME.gcp_location", "LOCATION") \
    .config("spark.sql.catalog.CATALOG_NAME.warehouse", "WAREHOUSE_DIRECTORY") \
    .getOrCreate()
    spark.conf.set("viewsEnabled","true")
    
    # Use the Lakehouse runtime catalog
    spark.sql("USE `CATALOG_NAME`;")
    spark.sql("USE NAMESPACE DATASET_NAME;")
    
    # Configure spark for temp results
    spark.sql("CREATE namespace if not exists MATERIALIZATION_NAMESPACE");
    spark.conf.set("materializationDataset","MATERIALIZATION_NAMESPACE")
    
    # List the tables in the dataset
    df = spark.sql("SHOW TABLES;")
    df.show();
    
    # Query the tables
    sql = """SELECT * FROM DATASET_NAME.TABLE_NAME"""
    df = spark.read.format("bigquery").load(sql)
    df.show()
    
    sql = """SELECT * FROM DATASET_NAME.ICEBERG_TABLE_NAME"""
    df = spark.read.format("bigquery").load(sql)
    df.show()
    
    sql = """SELECT * FROM DATASET_NAME.READONLY_ICEBERG_TABLE_NAME"""
    df = spark.read.format("bigquery").load(sql)
    df.show()

    다음을 바꿉니다.

    • WAREHOUSE_DIRECTORY: BigQuery 관리형 Apache Iceberg 테이블 및 외부 Apache Iceberg 테이블에 연결된 Cloud Storage 폴더의 URI
    • CATALOG_NAME: 사용 중인 카탈로그의 이름
    • MATERIALIZATION_NAMESPACE: 임시 결과를 저장하기 위한 네임스페이스
  9. Managed Service for Apache Spark를 사용하여 Apache Spark 스크립트를 실행합니다.

    gcloud dataproc batches submit pyspark SCRIPT_PATH \
      --version=2.2 \
      --project=PROJECT_ID \
      --region=REGION \
      --deps-bucket=YOUR_BUCKET \

    다음을 바꿉니다.

    • SCRIPT_PATH: 일괄 작업에서 사용하는 스크립트의 경로
    • PROJECT_ID: 일괄 작업을 실행할 프로젝트의 ID Google Cloud
    • REGION: 워크로드가 실행되는 리전
    • YOUR_BUCKET: 워크로드 종속 항목을 업로드할 Cloud Storage 버킷의 위치. 버킷의 gs:// URI 프리픽스는 필요하지 않습니다. 버킷 경로 또는 버킷 이름을 지정할 수 있습니다(예: mybucketname1).

다음 단계