はじめに
Azure Databricks の Unity Catalog ミラーリング を通して、Databricks の管理するデータについて Fabric で利用できるようになりましたが、Fabric レイクハウスなどの OneLake に格納されたデータに Azure Databricks からアクセスする方法を検討・検証してみます。
方式案と結果まとめ
方式 | ストレージアクセスとしての推奨度合 | 結果 | 備考 |
---|---|---|---|
資格情報パススルークラスターを使用したアクセス | 非推奨の記載あり | △ | SQL ウェアハウスでは不可 |
Spark 構成設定による Azure Storage アクセス | レガシーパターン | 〇 | |
外部ロケーション | UnityCatalogでは推奨 | × | |
ストレージ資格情報を使用して直接アクセス | 外部ロケーションの利用が推奨 | × | |
レイクハウスフェデレーション | 記載なし | × | 今後使えそうな表示あり |
(番外)ハブストレージを介しての相互アクセス | 双方サポートされた方式 | 〇 |
1. 資格情報パススルークラスターを使用したアクセス
OneLake と Azure Databricks の統合 にて記載のある方法です。
ただし、Azure Databricks 的には非推奨のパターンとなります。
引用:https://learn.microsoft.com/ja-jp/azure/databricks/archive/credential-passthrough/adls-passthrough
準備
Microsoft Fabric でサンプル ウェアハウスを作成する を参考にウェアハウスを作成しておきます。
検証
- 資格情報パススルーを有効にしたクラスターを作成します。
- ウェアハウスの対象テーブルの abfss パスを記録します。
- 対象のパスからロードしてみます。
pyspark
onelake_path = "確認したabfssパス" trip_df = spark.read.format("delta").load(onelake_path) display(trip_df)
- 外部テーブルとして作成してみましょう。
Unity Catalog ではこのクラスターは使えないので、エラーとなります。
- Hive Metastore 上だと作成が可能です。
- ただし、 SQL ウェアハウスはパススルーのような構成が不可なので、カタログエクスプローラーや SQL エディターではクエリができないことがわかります。
カタログエクスプローラー
SQL エディタ
以上のように、Docs に記載の内容にもかかわらず、制約が厳しい利用方法だということがわかりました。
2. Spark 構成設定による Azure Storage アクセス
サービスプリンシパルを利用してアクセスする でまとめた方式です。
OneLake は Azure Data Lake Storage 互換のエンドポイントをもつため実現が可能な方式です。(参照:OneLake の実体について)
ただし、mslearn docs では、レガシーパターンとして、Unity Catalog の機能を使用してアクセスすることが推奨されています。
引用:https://learn.microsoft.com/en-us/azure/databricks/connect/storage/azure-storage
準備
- Microsoft Fabric でサンプル ウェアハウスを作成する を参考にウェアハウスを作成しておきます。
- サービスプリンシパルを作成し、Databricks 上 で シークレットを登録しておきます。
- レイクハウスも作成しておきます。
検証
-
通常のクラスターでノートブックを起動し、spark構成設定を以下のように設定します。Azure Storage の場合に使用する dfs.windows.net ではなく、onelake.dfs.fabric.microsoft.comに対しての認証設定を構成している点に注目
pysparkservice_credential = dbutils.secrets.get(scope="シークレットスコープ名",key="シークレット名") spark.conf.set("fs.azure.account.auth.type.onelake.dfs.fabric.microsoft.com", "OAuth") spark.conf.set("fs.azure.account.oauth.provider.type.onelake.dfs.fabric.microsoft.com", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider") spark.conf.set("fs.azure.account.oauth2.client.id.onelake.dfs.fabric.microsoft.com", "サービスプリンシパルクライアントID") spark.conf.set("fs.azure.account.oauth2.client.secret.onelake.dfs.fabric.microsoft.com", service_credential) spark.conf.set("fs.azure.account.oauth2.client.endpoint.onelake.dfs.fabric.microsoft.com", "https://login.microsoftonline.com/テナントID/oauth2/token")
-
ロードします。
pysparkonelake_path = "確認したabfssパス" trip_df = spark.read.format("delta").load(onelake_path) display(trip_df)
成功
-
試しに書き込みもしてみます。
ウェアハウスでは失敗します。spark での書き込みが許可されないためですね
レイクハウスだと成功
Fabric 側ですぐに利用できます。
-
外部テーブルを作成してみます。
Unity Catalog では外部ロケーションに設定されていないストレージで外部テーブルを作ろうとするとエラーとなります。
Hive Metastore 側だと成功します。
-
SQL ウェアハウスでアクセスする場合には、データアクセスの構成を行います。
以上のように、Spark 構成設定によりOneLake へのサービスプリンシパルアクセスができました。
Unity catalog で管理できない点だけが難点ですが、現時点では最も機能の制限が少なく使いやすい方式だと思います。
3. 外部ロケーション
クラウド ストレージを Azure Databricks に接続するための外部の場所を作成する を OneLake に対して構成してみます
準備
- Microsoft Fabric でサンプル ウェアハウスを作成する を参考にウェアハウスを作成しておきます。
- Databricks アクセスコネクタなどの、Unity Catalog メタストアを構成する際に使用しているIDをFabric ワークスペースの共同作成者に設定しておきます。
検証
- カタログエクスプローラーから外部ロケーションの設定にすすみます。
- 作成をクリック
- これまで使用した abfss パスを入力して作成します。結果はエラー。 Fabric OneLake は不可のようです。
この方式で作成できることを期待していましたが、現時点ではサポートされていないので、今後よりスマートな方法が提供されることが期待されます。
4. ストレージ資格情報を使用して直接アクセス
準備
- レイクハウスを作成しておきます。
- Databricks アクセスコネクタなどの、Unity Catalog メタストアを構成する際に使用しているIDをFabric ワークスペースの共同作成者に設定しておきます。
検証
外部ロケーションでブロックされた時点でうすうすわかってはいましたが、やはり不可でした。
5. レイクハウスフェデレーション
レイクハウスフェデレーション で Fabric に接続することはできるのでしょうか
検証
- フェデレーション先の接続を作成するコードを不完全ながら実行してみると以下のようにエラーとなりました。
- メッセージから推察し、TYPE を Fabric にしてみると、まだ有効化されていない旨のメッセージ。
結果は失敗ですが、今後のサポートが期待される結果となりました。
6. (番外) ハブストレージを介しての相互アクセス
Fabric -> ショートカット
Databricks -> 外部ロケーション
という形で相互にアクセスするストレージを介して接続してみます。
準備
検証
-
Fabric 側で スキーマが有効なレイクハウスを作成
スキーマが有効なレイクハウスは現時点での制限が多いのですが、スキーマレベルでショートカットしておけば配下のテーブルを自動的にレイクハウスで認識できるはずという狙いです。
以上のように、ハブとなる Azure Data Lake Storage に双方からアクセスしてやることで、Databricks と Fabric でデータを相互連携できます。
この方式では現在 Unity Catalog ミラーリングで ストレージのファイアウォールを通過することができないという制限を回避しながら相互連携が可能です。
スキーマが有効なレイクハウスを使用しない限りは、テーブルの自動追加が難しい点だけが難点ですが、Storage を追加してもよい場合にはこれも有力な選択肢となるかと思います。