このドキュメントでは、Lakehouse ランタイム カタログを使用するように Apache Spark と Apache Hive を設定して構成する方法について説明します。Apache Hive カタログを作成し、メタストアに接続するように Spark セッションを構成して、BigQuery で直接クエリできるテーブルを作成するワークロードを実行する方法について説明します。
始める前に
- Lakehouse ランタイム カタログの Hive カタログについてを読んで、Spark が Lakehouse ランタイム カタログに接続する方法を理解します。
- サポートされているストレージ形式とデータ型を確認します。
- 制限事項と考慮事項を確認します。
- アカウントにログインします。 Google Cloud を初めて使用する場合は、 アカウントを作成して、実際のシナリオで Google プロダクトのパフォーマンスを評価してください。 Google Cloud新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
Verify that billing is enabled for your Google Cloud project.
Enable the Lakehouse for Apache Iceberg, Dataproc API APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Verify that billing is enabled for your Google Cloud project.
Enable the Lakehouse for Apache Iceberg, Dataproc API APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
必要なロール
Lakehouse ランタイム カタログを使用するために必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。
-
Managed Service for Apache Spark クラスタを作成する:
Dataproc 編集者 (
roles/dataproc.editor) -
クラスタ サービス アカウント:
- Dataproc ワーカー (
roles/dataproc.worker) - Storage オブジェクト ユーザー (
roles/storage.objectUser) - BigLake 編集者 (
roles/biglake.editor) - Service Usage コンシューマー (
roles/serviceusage.serviceUsageConsumer)
- Dataproc ワーカー (
-
すべての Lakehouse ランタイム カタログ リソースへの書き込みアクセス:
BigLake 編集者 (
roles/biglake.editor) -
すべての Lakehouse ランタイム カタログ リソースへの読み取り専用アクセス:
BigLake 閲覧者 (
roles/biglake.viewer)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
必要な権限は、カスタム ロールや他の事前定義 ロールから取得することもできます。
手順については、単一ロールの付与をご覧ください。
全般的なワークフロー
Spark と Hive で Lakehouse ランタイム カタログを使用するには、次の一般的なワークフローに従います。
- Lakehouse for Apache Iceberg Hive カタログを作成します。
- 優先するツール(Managed Service for Apache Spark や BigQuery Studio など)を使用して Spark セッションを構成します。
- Spark セッション内でデータベースとテーブルのオペレーションを実行します。
- バッチ ワークロードを Managed Service for Apache Spark に送信し、結果のテーブルを BigQuery から直接クエリします。
Lakehouse Hive カタログを作成する
Spark と Hive で Lakehouse ランタイム カタログを使用するには、まず Hive カタログを作成する必要があります。
Lakehouse Hive カタログは、Hive データベースのコレクションです。Spark ジョブを実行する前に、カタログを作成して Lakehouse Metastore に登録します。カタログには、名前と Hive データが保存されている Cloud Storage のロケーションがあります。
コンソール
コンソールで、[Lakehouse] ページを開きます。 Google Cloud
[カタログを作成] をクリックします。
[Lakehouse ランタイム カタログ] を選択します。
[**カタログタイプ**] で、[**Hive Metastore**] を選択します。
[Cloud Storage バケットを選択] フィールドに、カタログで使用する Cloud Storage バケットの名前を入力します。または、[参照] をクリックして、既存のバケットを選択するか、新しいバケットを作成します。
[**カタログ ID**] に、Lakehouse Hive カタログの名前を指定します。
[**プライマリ ロケーション**] に、バケットと同じリージョンを指定します。
[作成] をクリックします。
gcloud
Hive カタログを作成するには、次のコマンドを実行します。
gcloud biglake hive catalogs create LAKEHOUSE_CATALOG_ID \
--project=PROJECT_ID
--location-uri="gs://GCS_WAREHOUSE_PATH" \
--primary_location=REGION \
--description="DESCRIPTION"
次のように置き換えます。
LAKEHOUSE_CATALOG_ID: Hive カタログ名。GCS_WAREHOUSE_PATH: Hive ウェアハウスを保存する Cloud Storage パス。PROJECT_ID: プロジェクト ID。 Google CloudREGION: メタストアのプライマリ リージョン。単一リージョン バケットの場合は、バケット リージョンと一致する必要があります。デュアルリージョン バケットまたはマルチリージョン バケットの場合は、構成リージョンのいずれかであり、メタストアのプライマリ レプリカが配置される場所である必要があります。 もう一方のリージョンはセカンダリ レプリカになります。DESCRIPTION: カタログの説明。
curl
- Hive カタログを作成するには、次のコマンドを実行します。
curl -X POST -s -i -H "Authorization: Bearer $(gcloud auth print-access-token)" \
-d '{"locationUri": "gs://GCS_WAREHOUSE_PATH", "description": "DESCRIPTION"}' \
-H "Content-Type:application/json" \ "https://biglake.googleapis.com/hive/v1/projects/PROJECT_ID/catalogs?hiveCatalogId=LAKEHOUSE_CATALOG_ID&primary_location=REGION"
次のように置き換えます。
LAKEHOUSE_CATALOG_ID: Hive カタログ名。GCS_WAREHOUSE_PATH: Hive ウェアハウスを保存する Cloud Storage パス。PROJECT_ID: 実際の Google Cloud プロジェクト ID。REGION: メタストアのプライマリ リージョン。単一リージョン バケットの場合は、バケット リージョンと一致する必要があります。デュアルリージョン バケットまたはマルチリージョン バケットの場合は、構成リージョンのいずれかであり、メタストアのプライマリ レプリカが配置される場所である必要があります。もう一方のリージョンはセカンダリ レプリカになります。DESCRIPTION: カタログの説明。
Spark と Hive を構成して使用する
Lakehouse ランタイム カタログを使用するには、特定のプロパティを使用して Spark セッションを構成する必要があります。これらのプロパティは、Managed Service for Apache Spark クラスタを作成するときに設定することも、セッションを作成するたびに指定することもできます。
これらのプロパティには、クライアント ファクトリー、 Google Cloud プロジェクト ID、デフォルト カタログ、ウェアハウス ディレクトリなどの詳細が含まれます。セッションが確立されたら、既存のデータベースの一覧表示、新しいデータベースの作成、テーブルの定義、データの挿入などの基本的なオペレーションを実行できます。
spark-sql
- SSH を使用して、Managed Service for Apache Spark クラスタのプライマリ ノードに接続します。
次のプロパティを指定してコマンドラインで
spark-sqlを実行し、インタラクティブな Spark SQL セッションを開始します。spark-sql \ --conf spark.hive.metastore.client.factory.class=com.google.cloud.bigquery.metastore.client.BigLakeMetastoreClientFactory \ --conf spark.hive.metastore.blms.project.id=PROJECT_ID \ --conf spark.hive.metastore.blms.catalog.default=LAKEHOUSE_CATALOG_ID \ --conf spark.hive.metastore.warehouse.dir=gs://GCS_WAREHOUSE_PATHセッションが開始すると、Spark は Lakehouse ランタイム カタログに接続します。
次のコマンドを実行して、リソースを作成してクエリします。
-- Show all the databases in the current project. SHOW DATABASES; -- Create a database. CREATE DATABASE spark_blms_database; -- Create a Parquet datasource table. CREATE TABLE spark_blms_database.parquet_quick_start (id INT, name STRING) USING PARQUET; -- Insert data into the table. INSERT INTO TABLE spark_blms_database.parquet_quick_start VALUES (1, 'my-first-user');次のように置き換えます。
PROJECT_ID: 実際の Google Cloud プロジェクト ID。LAKEHOUSE_CATALOG_ID: Hive カタログ名。GCS_WAREHOUSE_PATH: Hive ウェアハウスを保存する Cloud Storage パス。
Jupyter ノートブック
- 手順に沿って、Managed Service for Apache Spark クラスタで Jupyter ノートブックを実行します。
- コンソールのクラスタの詳細ページの [**ウェブ インターフェース**] タブから Jupyter ウェブ インターフェースにアクセスします。 Google Cloud
新しいノートブックで Spark セッションを作成し、次のクエリを実行します。
from pyspark.sql import SparkSession # If a Spark session exists, stop it first by running spark.stop() spark = SparkSession.builder\ .master("local")\ .appName("Lakehouse runtime catalog tutorial")\ .config("spark.hive.metastore.client.factory.class", "com.google.cloud.bigquery.metastore.client.BigLakeMetastoreClientFactory")\ .config("spark.hive.metastore.blms.project.id", "PROJECT_ID")\ .config("spark.hive.metastore.warehouse.dir", "gs://GCS_WAREHOUSE_PATH")\ .config("spark.hive.metastore.blms.catalog.default", "LAKEHOUSE_CATALOG_ID")\ .getOrCreate() # Show all the databases. df = spark.sql("SHOW DATABASES;") df.show() # Create a database. spark.sql("CREATE DATABASE jupyter_blms_db") # Create a Parquet datasource table. spark.sql("CREATE TABLE jupyter_blms_db.parquet_table(id INT, name STRING) USING PARQUET") # Insert data into the table. spark.sql("INSERT INTO TABLE jupyter_blms_db.parquet_table VALUES (1, 'my-first-user');") # Query from table. spark.sql("SELECT * FROM jupyter_blms_db.parquet_table;").show()次のように置き換えます。
PROJECT_ID: 実際の Google Cloud プロジェクト ID。GCS_WAREHOUSE_PATH: Hive ウェアハウスを保存する Cloud Storage パス。LAKEHOUSE_CATALOG_ID: Hive カタログ名。
BigQuery ノートブック
コンソールで、[BigQuery] に移動します。 Google Cloud
[**エクスプローラ**] ペインで、[**+ 追加**] をクリックし、[**Python ノートブック**] をクリックします。
コードセルで、Managed Service for Apache Spark セッションと Lakehouse ランタイム カタログのプロパティを構成します。
from google.cloud.dataproc_spark_connect import DataprocSparkSession from google.cloud.dataproc_v1 import Session import os os.environ['DATAPROC_SPARK_CONNECT_DEFAULT_DATASOURCE'] = "" session = Session() session.environment_config.execution_config.ttl = {"seconds": 864000} session.runtime_config.version = "2.3" session.runtime_config.properties = { "spark.hive.metastore.blms.project.id": "PROJECT_ID", "spark.hive.metastore.blms.catalog.default": "LAKEHOUSE_CATALOG_ID", "spark.hive.metastore.warehouse.dir": "gs://GCS_WAREHOUSE_PATH", "spark.hive.metastore.client.factory.class": "com.google.cloud.bigquery.metastore.client.BigLakeMetastoreClientFactory", "spark.sql.catalogImplementation": "hive" } spark = DataprocSparkSession.builder.dataprocSessionConfig(session).getOrCreate() print("Spark session created successfully")別のコードセルで、データベースとテーブルを作成します。
# Create a database spark.sql("CREATE DATABASE bq_spark_blms_database;") # Create a parquet datasource table spark.sql("CREATE TABLE bq_spark_blms_database.parquet_quick_start (id INT, name STRING) USING PARQUET;") # Insert data into the table spark.sql("INSERT INTO TABLE bq_spark_blms_database.parquet_quick_start VALUES (1, 'my-first-user');") # Query from table spark.sql("select * from bq_spark_blms_database.parquet_quick_start;").show()次のように置き換えます。
PROJECT_ID: 実際の Google Cloud プロジェクト ID。GCS_WAREHOUSE_PATH: Hive ウェアハウスを保存する Cloud Storage パス。LAKEHOUSE_CATALOG_ID: Hive カタログ名。
Hive CLI
Hive CLI を使用するには、メタストアに接続するように構成する必要があります。これを行うには、次の 2 つの方法があります。
- オプション 1: 永続的な構成。プライマリ ノードの
/etc/hive/conf/hive-site.xmlファイルを更新します。 - オプション 2: 一時的な構成。CLI の起動時に構成フラグを指定します。
CLI を構成してクエリ セッションを実行する手順は次のとおりです。
- SSH を使用して、Managed Service for Apache Spark クラスタのプライマリ ノードに接続します。
構成方法に応じて、次のいずれかを行います。
永続的に構成するには(オプション 1):
プライマリ ノードで
/etc/hive/conf/hive-site.xmlを開き、次のプロパティを追加します。<property> <name>hive.metastore.blms.project.id</name> <value>PROJECT_ID</value> <description></description> </property> <property> <name>hive.metastore.client.factory.class</name> <value>com.google.cloud.bigquery.metastore.client.BigLakeMetastoreClientFactory</value> <description></description> </property> <property> <name>hive.metastore.blms.catalog.default</name> <value>LAKEHOUSE_CATALOG_ID</value> <description></description> </property> <property> <name>hive.metastore.warehouse.dir</name> <value>gs://GCS_WAREHOUSE_PATH</value> <description></description> </property>Hive CLI を起動します。
hive
起動時に一時的に構成するには(オプション 2): 構成フラグを指定して Hive CLI を起動します。
hive \ --hiveconf hive.metastore.blms.project.id="PROJECT_ID" \ --hiveconf hive.metastore.blms.catalog.default="LAKEHOUSE_CATALOG_ID" \ --hiveconf hive.metastore.client.factory.class=com.google.cloud.bigquery.metastore.client.BigLakeMetastoreClientFactory \ --hiveconf hive.metastore.warehouse.dir="gs://GCS_WAREHOUSE_PATH"
次に、Hive CLI セッションで次のコマンドを実行します。
show databases; create database hive_query_test; create table hive_query_test.parquet_table (id INT, name STRING) stored as PARQUET; select * from hive_query_test.parquet_table;次のように置き換えます。
PROJECT_ID: 実際の Google Cloud プロジェクト ID。LAKEHOUSE_CATALOG_ID: Hive カタログ名。GCS_WAREHOUSE_PATH: Hive ウェアハウスを保存する Cloud Storage パス。
Managed Service for Apache Spark バッチジョブを送信する
Lakehouse ランタイム カタログを使用する PySpark バッチ ワークロードを Managed Service for Apache Spark に送信できます。
この PySpark スニペットは、Lakehouse ランタイム カタログに接続するように構成された Spark セッションを初期化します。Lakehouse クライアント ファクトリー、 Google Cloud プロジェクト ID、デフォルト カタログ、ウェアハウス ディレクトリなどの重要なプロパティを設定します。セッションを確立した後、このコードは、Spark SQL コマンドを使用して、既存のデータベースの一覧表示、新しいデータベースの作成、そのデータベース内の Parquet 形式のテーブルの定義を行う方法を示しています。
PySpark ジョブを含む Python ファイルを作成します。
from pyspark.sql import SparkSession spark = ( SparkSession.builder.appName("Lakehouse runtime catalog tutorial") .config( "spark.hive.metastore.client.factory.class", "com.google.cloud.bigquery.metastore.client.BigLakeMetastoreClientFactory") .config("spark.hive.metastore.blms.project.id", "PROJECT_ID") .config("spark.hive.metastore.blms.catalog.default", "LAKEHOUSE_CATALOG_ID") .config( "spark.hive.metastore.warehouse.dir", "gs://GCS_WAREHOUSE_PATH", ) .enableHiveSupport() .getOrCreate() ) # Show all the databases. spark.sql("SHOW DATABASES;").show() # Create a database. spark.sql("CREATE DATABASE dp_serverless_test") # Create a Parquet datasource table. spark.sql( "CREATE TABLE dp_serverless_test.parquet_table(id INT, name STRING) USING" " PARQUET" ) # Query from table. spark.sql("SELECT * from dp_serverless_test.parquet_table").show()次のように置き換えます。
PROJECT_ID: 実際の Google Cloud プロジェクト ID。LAKEHOUSE_CATALOG_ID: Hive カタログ名。GCS_WAREHOUSE_PATH: Hive ウェアハウスを保存する Cloud Storage パス。
バッチジョブを送信します。
gcloud dataproc batches submit pyspark PYTHON_SCRIPT_FILE \ --version=2.2 \ --project=PROJECT_ID \ --region=REGION \ --deps-bucket=gs://CLOUD_STORAGE_BUCKET次のように置き換えます。
PYTHON_SCRIPT_FILE: PySpark アプリケーション ファイルのパス。ローカルパスまたは Cloud Storage オブジェクト パスを指定できます。PROJECT_ID: プロジェクト ID。REGION: バッチジョブを実行するリージョン。CLOUD_STORAGE_BUCKET: ワークロードの依存関係のステージングに使用される Cloud Storage バケットの名前。
BigQuery からテーブルに対してクエリを実行する
Lakehouse ランタイム カタログで Spark からリソースを作成したら、BigQuery Studio からクエリできます。
コンソールで、[BigQuery] に移動します。 Google Cloud
クエリエディタで次のステートメントを入力します。
SELECT * FROM `PROJECT_ID.LAKEHOUSE_CATALOG_ID.DATABASE_NAME.TABLE_NAME`;次のように置き換えます。
PROJECT_ID: プロジェクト ID。LAKEHOUSE_CATALOG_ID: Hive カタログ名。DATABASE_NAME: データベース名。TABLE_NAME: テーブル名。