BigQuery Metastore でメタデータを含む Apache Iceberg テーブルを作成する

このドキュメントでは、Dataproc Serverless for Spark SQL と PySpark バッチ ワークロードを実行して、BigQuery Metastore にメタデータを保存する Apache Iceberg テーブルを作成する方法について説明します。Spark コードを実行する他の方法については、BigQuery ノートブックで PySpark コードを実行するApache Spark ワークロードを実行するをご覧ください。

始める前に

まだ作成していない場合は、 Google Cloud プロジェクトと Cloud Storage バケットを作成します。

  1. プロジェクトを設定する

    1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
    2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

      Go to project selector

    3. Enable the Dataproc, BigQuery, and Cloud Storage APIs.

      Enable the APIs

    4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

      Go to project selector

    5. Enable the Dataproc, BigQuery, and Cloud Storage APIs.

      Enable the APIs

  2. プロジェクトに Cloud Storage バケットを作成します。

    1. In the Google Cloud console, go to the Cloud Storage Buckets page.

      Go to Buckets page

    2. Click Create bucket.
    3. On the Create a bucket page, enter your bucket information. To go to the next step, click Continue.
      • For Name your bucket, enter a name that meets the bucket naming requirements.
      • For Choose where to store your data, do the following:
        • Select a Location type option.
        • Select a Location option.
      • For Choose a default storage class for your data, select a storage class.
      • For Choose how to control access to objects, select an Access control option.
      • For Advanced settings (optional), specify an encryption method, a retention policy, or bucket labels.
    4. Click Create.

  3. Compute Engine のデフォルトのサービス アカウント PROJECT_NUMBER-compute@developer.gserviceaccount.comBigQuery データ編集者(roles/bigquery.dataEditorロールを付与します。手順については、単一ロールの付与をご覧ください。

    Google Cloud CLI の例:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member PROJECT_NUMBER-compute@developer.gserviceaccount.com \
    --role roles/bigquery.dataEditor
    

    注:

    • PROJECT_IDPROJECT_NUMBER は、 Google Cloud コンソールのダッシュボードの [プロジェクト情報] セクションに表示されます。
  4. Dataproc Serverless バッチ ワークロードを実行するリージョン VPC サブネットで、限定公開の Google アクセスが有効になっていることを確認します。詳細については、Iceberg テーブルを作成するをご覧ください。

OSS リソースと BigQuery リソースのマッピング

オープンソース リソースと BigQuery リソースの用語の対応は次のとおりです。

OSS リソース BigQuery リソース
Namespace、Database データセット
パーティション分割テーブルまたはパーティション分割なしのテーブル テーブル
ビュー 表示

Iceberg テーブルを作成する

このセクションでは、Dataproc Serverless Spark SQL と PySpark バッチ ワークロードを使用して、BigQuery Metastore にメタデータを含む Iceberg テーブルを作成する方法について説明します。

Spark SQL

Spark SQL ワークロードを実行して Iceberg テーブルを作成する

次の手順では、Dataproc Serverless Spark SQL バッチ ワークロードを実行して、BigQuery Metastore にテーブル メタデータを保存する Iceberg テーブルを作成する方法を示します。

  1. ローカルまたは Cloud Shell で次の Spark SQL コマンドを iceberg-table.sql ファイルにコピーします。

    USE CATALOG_NAME;
    CREATE NAMESPACE IF NOT EXISTS example_namespace;
    DROP TABLE IF EXISTS example_table;
    CREATE TABLE example_table (id int, data string) USING ICEBERG LOCATION 'gs://BUCKET/WAREHOUSE_FOLDER';
    INSERT INTO example_table VALUES (1, 'first row');
    ALTER TABLE example_table ADD COLUMNS (newDoubleCol double);
    DESCRIBE TABLE example_table;
    

    次のように置き換えます。

    • CATALOG_NAME: Iceberg カタログ名。
    • BUCKETWAREHOUSE_FOLDER: Iceberg ウェアハウス ディレクトリとして使用される Cloud Storage バケットとフォルダ。
  2. iceberg-table.sql を含むディレクトリからローカルまたは Cloud Shell で次のコマンドを実行して、Spark SQL ワークロードを送信します。

    gcloud dataproc batches submit spark-sql iceberg-table.sql \
        --project=PROJECT_ID \
        --region=REGION \
        --deps-bucket=BUCKET_NAME \
        --version=2.2 \
        --subnet=projects/PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME \
        --properties="spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog,spark.sql.catalog.CATALOG_NAME.catalog-impl=org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog,spark.sql.catalog.CATALOG_NAME.gcp_project=PROJECT_ID,spark.sql.catalog.CATALOG_NAME.gcp_location=LOCATION,spark.sql.catalog.CATALOG_NAME.warehouse=gs://BUCKET/WAREHOUSE_FOLDER"
      

    注:

    • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は、 Google Cloud コンソールのダッシュボードの [プロジェクト情報] セクションに表示されます。
    • REGION: ワークロードを実行できる使用可能な Compute Engine リージョン
    • BUCKET_NAME: Cloud Storage バケットの名前。Spark は、バッチ ワークロードを実行する前に、ワークロードの依存関係をこのバケットの /dependencies フォルダにアップロードします。WAREHOUSE_FOLDER はこのバケットにあります。
    • SUBNET_NAME: 限定公開の Google アクセスが有効で、他のセッション サブネットの要件を満たしている REGION の VPC サブネットの名前。
    • LOCATION: サポートされている BigQuery のロケーション。デフォルトのロケーションは「US」です。
    • --version: Dataproc Serverless ランタイム バージョン 2.2 以降。
    • --properties カタログのプロパティ
  3. BigQuery でテーブルのメタデータを表示する

    1. Google Cloud コンソールで、[BigQuery] ページに移動します。

      BigQuery Studio に移動

    2. Iceberg テーブルのメタデータを表示します。

PySpark

次の手順では、Dataproc サーバーレス PySpark バッチ ワークロードを実行して、BigQuery Metastore にテーブル メタデータを保存する Iceberg テーブルを作成する方法を示します。

  1. 次の PySpark コードをローカルまたは Cloud Shelliceberg-table.py ファイルにコピーします。
    catalog = "CATALOG_NAME"
    namespace = "NAMESPACE"
    
    spark.sql(f"USE `{catalog}`;")
    spark.sql(f"CREATE NAMESPACE IF NOT EXISTS `{namespace}`;")
    spark.sql(f"USE `{namespace}`;")
    
    # Create table and display schema
    spark.sql("DROP TABLE IF EXISTS example_iceberg_table")
    spark.sql("CREATE TABLE example_iceberg_table (id int, data string) USING ICEBERG") 
    spark.sql("DESCRIBE example_iceberg_table;")
    
    # Insert table data.
    spark.sql("INSERT INTO example_iceberg_table VALUES (1, 'first row');")
    
    # Alter table, then display schema. 
    spark.sql("ALTER TABLE example_iceberg_table ADD COLUMNS (newDoubleCol double);")
    spark.sql("DESCRIBE example_iceberg_table;")

    次のように置き換えます。

    • CATALOG_NAMENAMESPACE: Iceberg カタログ名と Namespace を組み合わせて、Iceberg テーブル(catalog.namespace.table_name)を識別します。
  2. iceberg-table.py を含むディレクトリからローカルまたは Cloud Shell で次のコマンドを実行して、PySpark ワークロードを送信します。
    gcloud dataproc batches submit pyspark iceberg-table.py \
        --project=PROJECT_ID \
        --region=REGION \
        --deps-bucket=BUCKET_NAME \
        --version=2.2 \
        --subnet=projects/PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME \
        --properties="spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog,spark.sql.catalog.CATALOG_NAME.catalog-impl=org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog,spark.sql.catalog.CATALOG_NAME.gcp_project=PROJECT_ID,spark.sql.catalog.CATALOG_NAME.gcp_location=LOCATION,spark.sql.catalog.CATALOG_NAME.warehouse=gs://BUCKET/WAREHOUSE_FOLDER"
        

    注:

    • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は、 Google Cloud コンソールのダッシュボードの [プロジェクト情報] セクションに表示されます。
    • REGION: ワークロードを実行できる利用可能な Compute Engine リージョン
    • BUCKET_NAME: Cloud Storage バケットの名前。Spark は、バッチ ワークロードを実行する前に、ワークロードの依存関係をこのバケットの /dependencies フォルダにアップロードします。
    • SUBNET_NAME: 限定公開の Google アクセスが有効で、他のセッション サブネットの要件を満たしている REGION の VPC サブネットの名前。
    • --version: Dataproc Serverless ランタイム バージョン 2.2 以降。
    • LOCATION: サポートされている BigQuery のロケーション。デフォルトのロケーションは「US」です。
    • BUCKETWAREHOUSE_FOLDER: Iceberg ウェアハウス ディレクトリとして使用される Cloud Storage バケットとフォルダ。
    • --properties: カタログのプロパティ
  3. BigQuery でテーブル スキーマを表示します。
    1. Google Cloud コンソールで、[BigQuery] ページに移動します。BigQuery Studio に移動します。
    2. Iceberg テーブルのメタデータを表示します。