추가 BigQuery 메타스토어 기능

BigQuery 메타스토어 구성을 맞춤설정하려면 다음과 같은 추가 기능을 사용하면 됩니다.

  • Apache Spark Iceberg 프로시저
  • 지원되지 않는 테이블의 필터 옵션
  • BigQuery 연결 재정의

Iceberg Spark 프로시저 사용

Iceberg Spark 프로시저를 사용하려면 Spark 구성에 Iceberg SQL 확장 프로그램을 포함해야 합니다. 예를 들어 이전 상태로 롤백하는 프로시저를 만들 수 있습니다.

대화형 Spark-SQL을 사용하여 이전 상태로 롤백

Iceberg Spark 프로시저를 사용하여 테이블을 만들고, 수정하고, 이전 상태로 롤백할 수 있습니다. 예를 들면 다음과 같습니다.

  1. Spark 테이블을 만듭니다.

    spark-sql \
       --jars https://storage-download.googleapis.com/maven-central/maven2/org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.5.2/iceberg-spark-runtime-3.5_2.12-1.5.2.jar,gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.5.2-1.0.0-beta.jar \
       --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
       --conf spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog \
       --conf spark.sql.catalog.CATALOG_NAME.catalog-impl=org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog \
       --conf spark.sql.catalog.CATALOG_NAME.gcp_project=PROJECT_ID \
       --conf spark.sql.catalog.CATALOG_NAME.warehouse=WAREHOUSE_DIRECTORY

    다음을 바꿉니다.

    • CATALOG_NAME: Spark 테이블을 참조하는 카탈로그 이름입니다.
    • PROJECT_ID: Google Cloud 프로젝트의 ID입니다.

    • WAREHOUSE_DIRECTORY: 데이터 웨어하우스가 저장된 Cloud Storage 폴더의 URI입니다.

    USE `CATALOG_NAME`;
    CREATE NAMESPACE NAMESPACE_NAME;
    USE NAMESPACE NAMESPACE_NAME;
    CREATE TABLE NAMESPACE_NAME.TABLE_NAME (id int, data string) USING ICEBERG LOCATION 'WAREHOUSE_DIRECTORY';
    INSERT INTO NAMESPACE_NAME.TABLE_NAME VALUES (1, "first row");
    DESCRIBE EXTENDED TABLE_NAME;

    다음을 바꿉니다.

    • NAMESPACE_NAME: Spark 테이블을 참조하는 네임스페이스 이름입니다.
    • TABLE_NAME: Spark 테이블을 참조하는 테이블 이름입니다.

    출력에는 테이블 구성에 관한 세부정보가 포함됩니다.

    ...
    Table Properties [current-snapshot-id=1659239298328512231,format=iceberg/parquet,format-version=2,write.parquet.compression-codec=zstd]
    ...
  2. 테이블을 다시 변경한 다음 이전에 만든 스냅샷 1659239298328512231으로 롤백합니다.

    ALTER TABLE TABLE_NAME ADD COLUMNS (newDoubleCol double);
    INSERT INTO TABLE_NAME VALUES (2, "second row", 2.5);
    SELECT * FROM TABLE_NAME;
    CALL CATALOG_NAME.system.set_current_snapshot(NAMESPACE_NAME.TABLE_NAME', SNAPSHOT_ID);
    SELECT * FROM TABLE_NAME;

    다음을 바꿉니다.

    • SNAPSHOT_ID: 롤백할 스냅샷의 ID입니다.

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

    1 first row
    Time taken: 0.997 seconds, Fetched 1 row(s)

테이블 목록 함수에서 지원되지 않는 테이블 필터링

BigQuery 메타스토어 카탈로그와 함께 Spark SQL을 사용하면 SHOW TABLES 명령어로 지정된 네임스페이스의 모든 테이블(Spark와 호환되지 않는 테이블 포함)이 표시됩니다.

지원되는 테이블만 표시하려면 filter_unsupported_tables 옵션을 사용 설정하세요.

spark-sql
  --jars https://storage-download.googleapis.com/maven-central/maven2/org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.5.2/iceberg-spark-runtime-3.5_2.12-1.5.2.jar,gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.5.2-1.0.0-beta.jar \
  --conf spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog \
  --conf spark.sql.catalog.CATALOG_NAME.catalog-impl=org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog \
  --conf spark.sql.catalog.CATALOG_NAME.gcp_project=PROJECT_ID \
  --conf spark.sql.catalog.CATALOG_NAME.gcp_location=LOCATION \
  --conf spark.sql.catalog.CATALOG_NAME.warehouse=WAREHOUSE_DIRECTORY \
  --conf spark.sql.catalog.CATALOG_NAME.filter_unsupported_tables="true"

다음을 바꿉니다.

  • CATALOG_NAME: 사용할 Spark 카탈로그의 이름입니다.
  • PROJECT_ID: 사용할 Google Cloud 프로젝트의 ID입니다.
  • LOCATION: BigQuery 리소스의 위치입니다.
  • WAREHOUSE_DIRECTORY: 데이터 웨어하우스로 사용할 Cloud Storage 폴더입니다.

BigQuery 연결 재정의 설정

BigQuery 연결을 사용하여 Cloud Storage와 같이 BigQuery 외부에 저장된 데이터에 액세스할 수 있습니다.

Cloud Storage 버킷에 대한 액세스 권한을 제공하는 BigQuery 연결 재정의를 설정하려면 다음 단계를 완료하세요.

  1. BigQuery 프로젝트에서 Cloud Storage 리소스에 대한 새 연결을 만듭니다. 이 연결은 BigQuery가 데이터에 액세스하는 방식을 정의합니다.

  2. 데이터에 액세스하는 사용자 또는 서비스 계정에 연결에 대한 roles/bigquery.connectionUser 역할을 부여합니다.

    연결 리소스가 BigQuery의 대상 리소스와 동일한 위치를 공유하는지 확인합니다. 자세한 내용은 연결 관리를 참조하세요.

  3. bq_connection 속성을 사용하여 Iceberg 테이블에서 연결을 지정합니다.

    CREATE TABLE TABLE_NAME (id int, data string) USING ICEBERG LOCATION 'WAREHOUSE_DIRECTORY' TBLPROPERTIES ('bq_connection'='projects/PROJECT_ID/locations/LOCATION/connections/CONNECTION_ID');

    다음을 바꿉니다.

    • TABLE_NAME: Spark 테이블의 테이블 이름입니다.
    • WAREHOUSE_DIRECTORY: 데이터를 저장하는 Cloud Storage 버킷의 URI입니다.
    • PROJECT_ID: 사용할 Google Cloud 프로젝트의 ID입니다.
    • LOCATION: 연결의 위치입니다.
    • CONNECTION_ID: 연결의 ID입니다.

다음 단계