レック・テクノロジー・コンサルティング株式会社TECH BLOG

DatabricksとSnowflakeの相互接続方法解説

はじめに

Databricks と Snowflake で別々にデータを管理しており、それらを相互に参照して利用したいという場合があると思います。その場合、UniForm と Lakehouse Federation という仕組みを利用することで、以下のように Databricks と Snowflake を相互接続することができます。

databricks-snowflake-connection.png

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 からの接続に使用する認証情報を作成します。

設定の「開発者」→「アクセストークン」を開き、アクセストークンを生成します。

image.png

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 のワークスペースのURL
  • ACCESS_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;

image-1.png

以下の値を記録しておきます。

  • AZURE_CONSENT_URL
  • AZURE_MULTI_TENANT_APP_NAME

ブラウザでAZURE_CONSENT_URLのページを開き、アクセス許可の画面で「承諾」をクリックします。

Unity Catalog のストレージアカウントを開き、「ロールの割り当ての追加」をクリックします。

image-2.png

「ストレージ BLOB データ共同作成者」を選択し、メンバーの選択でAZURE_MULTI_TENANT_APP_NAMEのアンダースコアより前の部分と同じ名前のアプリケーションを選択する。選択後、「レビューと割り当て」をクリックします。

image-3.png

以下の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文でテーブルを参照することができます。

image-4.png

※外部テーブルは参照のみ可能で、書き込みはできません。

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側の設定

接続作成

カタログエクスプローラーの歯車アイコンをクリックし、「接続」を開きます。

image-5.png

「接続を作成」をクリックし、Snowflake の接続情報を設定します。

設定は以下の通りです:

  • 接続の基本
    • 接続名:snowflake-connection
    • 接続タイプ:Snowflake
    • 認証タイプ:ユーザー名とパスワード
  • 認証
    • ホスト:Snowflakeのアカウント/サーバーURL(<ACCOUNT_ID>.snowflakecomputing.com
    • ユーザ:ユーザ名
    • パスワード:パスワード
  • 接続の詳細
    • Snowflakeウェアハウス:仮想ウェアハウス(デフォルトであればCOMPUTE_WH)

設定が完了したら「接続を作成」をクリックします。

外部カタログ作成

接続の作成後、カタログエクスプローラーのプラスマークをクリックし、「カタログを作成」を開きます。

image-6.png

開いたダイアログでカタログの設定を行います。

image-7.png

設定は以下の通りです:

  • カタログ名:Unity Catalog に表示されるカタログ名
  • タイプ:外部
  • 接続:snowflake-connection
  • データベース:snowflake_ext(Snowflake の対象データベース名)

「接続のテスト」で接続を確認し、問題なければ「作成」をクリックします。接続でエラーが発生した場合、接続かカタログの設定に誤りがあるため修正します。

カタログ作成が完了すると、Unity Catalog にカタログが表示され、Snowflake 上と同じようにテーブルを参照できるようになります。

image-8.png

さいごに

Databricks と Snowflake を相互接続する方法についてご紹介しました。

Databricks のテーブルはデフォルトがDelta Lake形式ですが、UniForm を有効化することで Icebergテーブルとして扱うことができ、Snowflake のようなIceberg REST互換のクエリエンジンからデータを参照することができるようになります。

Databricks と Snowflake の相互接続方法について具体的に解説されている記事が見当たらず苦労したため、本記事が同じような方の参考になれば幸いです。

参考

この記事をシェアする

  • Facebook
  • X
  • Pocket
  • Line
  • Hatena
  • Linkedin

資料請求・お問い合わせはこちら

ページトップへ戻る