はじめに
Databricks と Snowflake で別々にデータを管理しており、それらを相互に参照して利用したいという場合があると思います。その場合、UniForm と Lakehouse Federation という仕組みを利用することで、以下のように Databricks と Snowflake を相互接続することができます。
UniForm(Universal Format)
Delta Lake の機能。UniForm を有効化することにより、Delta Lake形式のデータを非同期に Iceberg形式に変換し、Icebergと互換性のある他のクエリエンジンからIcebergテーブルと同じように読み書きできるようになる。
Lakehouse Federation
Databricks の外部データソース接続機能。Lakehouse Federation を利用することで、Snowflake 等の外部サービス上のデータを外部カタログとして参照できるようになる。
以降で、Databricks と Snowflake を相互接続する方法について詳しくご紹介します。
Databricks管理のテーブルをSnowflakeから参照する
Databricks側の設定
UniForm有効化
Delta Lakeテーブルで UniForm を有効化します。
USE CATALOG main;
CREATE SCHEMA uniform_test;
USE SCHEMA uniform_test;
-- UniFormを有効化したテーブルを作成
CREATE TABLE sample_data (
id INT,
content STRING
)
TBLPROPERTIES (
'delta.columnMapping.mode' = 'name',
'delta.enableIcebergCompatV2' = 'true',
'delta.universalFormat.enabledFormats' = 'iceberg'
);
INSERT INTO sample_data VALUES (1, 'a'), (2, 'b'), (3, 'c');
認証情報生成
Snowflake からの接続に使用する認証情報を作成します。
設定の「開発者」→「アクセストークン」を開き、アクセストークンを生成します。
Snowflake側の設定
カタログ統合作成
Databricks のカタログ情報をもとにカタログ統合を作成します。
CREATE OR REPLACE CATALOG INTEGRATION uniform_catalog_int
CATALOG_SOURCE = ICEBERG_REST
TABLE_FORMAT = ICEBERG
CATALOG_NAMESPACE = 'uniform_test'
REST_CONFIG = (
CATALOG_URI = 'https://<WORKSPACE_URL>/api/2.1/unity-catalog/iceberg'
WAREHOUSE = 'main'
)
REST_AUTHENTICATION = (
TYPE = BEARER
BEARER_TOKEN = '<ACCESS_TOKEN>'
)
ENABLED = TRUE;
WORKSPACE_URL
:Databricks のワークスペースのURLACCESS_TOKEN
:「認証情報生成」で取得したアクセストークン
外部ボリューム登録
Unity Catalog を外部ボリュームとして登録します。
CREATE OR REPLACE EXTERNAL VOLUME databricks_catalog_volume
STORAGE_LOCATIONS =
(
(
NAME = 'databricks_catalog_volume'
STORAGE_PROVIDER = 'AZURE'
STORAGE_BASE_URL = 'azure://<STORAGE_ACCOUNT>.blob.core.windows.net/<CONTAINER_NAME>/'
AZURE_TENANT_ID = '<TENANT_ID>'
)
)
ALLOW_WRITES = TRUE;
STORAGE_ACCOUNT
:Unity Catalog のストレージアカウントCONTAINER_NAME
:Unity Catalog のコンテナ名
外部ボリューム登録後、以下のコマンドで外部ボリュームの詳細情報を確認します。
DESC EXTERNAL VOLUME databricks_catalog_volume;
以下の値を記録しておきます。
AZURE_CONSENT_URL
AZURE_MULTI_TENANT_APP_NAME
ブラウザでAZURE_CONSENT_URL
のページを開き、アクセス許可の画面で「承諾」をクリックします。
Unity Catalog のストレージアカウントを開き、「ロールの割り当ての追加」をクリックします。
「ストレージ BLOB データ共同作成者」を選択し、メンバーの選択でAZURE_MULTI_TENANT_APP_NAME
のアンダースコアより前の部分と同じ名前のアプリケーションを選択する。選択後、「レビューと割り当て」をクリックします。
以下のSQLを実行し、"success"が"true"と出ていれば問題なく設定できています。
SELECT SYSTEM$VERIFY_EXTERNAL_VOLUME('databricks_catalog_volume');
外部Icebergテーブル作成
上記で作成したカタログ統合と外部ボリュームをもとに外部Icebergテーブルを作成します。
-- 外部Icebergテーブル作成
CREATE OR REPLACE ICEBERG TABLE sample_data
EXTERNAL_VOLUME = 'databricks_catalog_volume'
CATALOG = 'uniform_catalog_int'
CATALOG_NAMESPACE = 'uniform_test'
CATALOG_TABLE_NAME = 'sample_data';
-- 手動リフレッシュする場合
ALTER ICEBERG TABLE sample_data REFRESH;
-- 自動リフレッシュを有効にする場合
ALTER ICEBERG TABLE sample_data SET AUTO_REFRESH = TRUE;
自動リフレッシュを有効にした場合、30秒間隔で最新のテーブルデータが反映されます。
外部Icebergテーブルが作成されると、通常のテーブルと同じようにSELECT文でテーブルを参照することができます。
※外部テーブルは参照のみ可能で、書き込みはできません。
Snowflake管理のテーブルをDatabricksから参照する
Snowflake側の設定
以下のSQLを実行し、データベースとテーブルを作成します。
-- データベース作成
CREATE DATABASE SNOWFLAKE_EXT;
USE DATABASE SNOWFLAKE_EXT;
-- テーブル作成
CREATE TABLE sample_data(
id INTEGER,
content STRING
);
INSERT INTO sample_data VALUES (1, 'a'), (2, 'b'), (3, 'c');
Databricks側の設定
接続作成
カタログエクスプローラーの歯車アイコンをクリックし、「接続」を開きます。
「接続を作成」をクリックし、Snowflake の接続情報を設定します。
設定は以下の通りです:
- 接続の基本
- 接続名:snowflake-connection
- 接続タイプ:Snowflake
- 認証タイプ:ユーザー名とパスワード
- 認証
- ホスト:Snowflakeのアカウント/サーバーURL(
<ACCOUNT_ID>.snowflakecomputing.com
) - ユーザ:ユーザ名
- パスワード:パスワード
- ホスト:Snowflakeのアカウント/サーバーURL(
- 接続の詳細
- Snowflakeウェアハウス:仮想ウェアハウス(デフォルトであればCOMPUTE_WH)
設定が完了したら「接続を作成」をクリックします。
外部カタログ作成
接続の作成後、カタログエクスプローラーのプラスマークをクリックし、「カタログを作成」を開きます。
開いたダイアログでカタログの設定を行います。
設定は以下の通りです:
- カタログ名:Unity Catalog に表示されるカタログ名
- タイプ:外部
- 接続:snowflake-connection
- データベース:snowflake_ext(Snowflake の対象データベース名)
「接続のテスト」で接続を確認し、問題なければ「作成」をクリックします。接続でエラーが発生した場合、接続かカタログの設定に誤りがあるため修正します。
カタログ作成が完了すると、Unity Catalog にカタログが表示され、Snowflake 上と同じようにテーブルを参照できるようになります。
さいごに
Databricks と Snowflake を相互接続する方法についてご紹介しました。
Databricks のテーブルはデフォルトがDelta Lake形式ですが、UniForm を有効化することで Icebergテーブルとして扱うことができ、Snowflake のようなIceberg REST互換のクエリエンジンからデータを参照することができるようになります。
Databricks と Snowflake の相互接続方法について具体的に解説されている記事が見当たらず苦労したため、本記事が同じような方の参考になれば幸いです。