0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DatabricksAdvent Calendar 2024

Day 13

Azure Databricks から OneLake 上のデータにアクセスする方法 2024/12 版

Posted at

はじめに

Azure Databricks の Unity Catalog ミラーリング を通して、Databricks の管理するデータについて Fabric で利用できるようになりましたが、Fabric レイクハウスなどの OneLake に格納されたデータに Azure Databricks からアクセスする方法を検討・検証してみます。

方式案と結果まとめ

方式 ストレージアクセスとしての推奨度合 結果 備考
資格情報パススルークラスターを使用したアクセス 非推奨の記載あり SQL ウェアハウスでは不可
Spark 構成設定による Azure Storage アクセス レガシーパターン
外部ロケーション UnityCatalogでは推奨 ×
ストレージ資格情報を使用して直接アクセス 外部ロケーションの利用が推奨 ×
レイクハウスフェデレーション 記載なし × 今後使えそうな表示あり
(番外)ハブストレージを介しての相互アクセス 双方サポートされた方式

1. 資格情報パススルークラスターを使用したアクセス

OneLake と Azure Databricks の統合 にて記載のある方法です。

ただし、Azure Databricks 的には非推奨のパターンとなります。

image.png
引用:https://learn.microsoft.com/ja-jp/azure/databricks/archive/credential-passthrough/adls-passthrough

準備

Microsoft Fabric でサンプル ウェアハウスを作成する を参考にウェアハウスを作成しておきます。

検証

  1. 資格情報パススルーを有効にしたクラスターを作成します。
    image.png
  2. ウェアハウスの対象テーブルの abfss パスを記録します。
    image.png
    image.png
  3. 対象のパスからロードしてみます。
    pyspark
    
    onelake_path = "確認したabfssパス"
    trip_df = spark.read.format("delta").load(onelake_path)
    display(trip_df)
    
    
    成功
    image.png
  4. 外部テーブルとして作成してみましょう。
    Unity Catalog ではこのクラスターは使えないので、エラーとなります。
    image.png
  5. Hive Metastore 上だと作成が可能です。
    image.png
    image.png
  6. ただし、 SQL ウェアハウスはパススルーのような構成が不可なので、カタログエクスプローラーや SQL エディターではクエリができないことがわかります。
    カタログエクスプローラー
    image.png
    SQL エディタ
    image.png

以上のように、Docs に記載の内容にもかかわらず、制約が厳しい利用方法だということがわかりました。

2. Spark 構成設定による Azure Storage アクセス

サービスプリンシパルを利用してアクセスする でまとめた方式です。

OneLake は Azure Data Lake Storage 互換のエンドポイントをもつため実現が可能な方式です。(参照:OneLake の実体について

ただし、mslearn docs では、レガシーパターンとして、Unity Catalog の機能を使用してアクセスすることが推奨されています。

image.png
引用:https://learn.microsoft.com/en-us/azure/databricks/connect/storage/azure-storage

準備

検証

  1. 作成したサービスプリンシパルを Fabric ワークスペースの共同作成者に設定します。
    image.png

  2. 通常のクラスターでノートブックを起動し、spark構成設定を以下のように設定します。Azure Storage の場合に使用する dfs.windows.net ではなく、onelake.dfs.fabric.microsoft.comに対しての認証設定を構成している点に注目

    pyspark
        
        service_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")
    
    
    
  3. ロードします。

    pyspark
    
    onelake_path = "確認したabfssパス"
    trip_df = spark.read.format("delta").load(onelake_path)
    display(trip_df)
    
    

    成功

    image.png

  4. 試しに書き込みもしてみます。
    ウェアハウスでは失敗します。spark での書き込みが許可されないためですね
    image.png
    レイクハウスだと成功
    image.png
    Fabric 側ですぐに利用できます。
    image.png

  5. 外部テーブルを作成してみます。
    Unity Catalog では外部ロケーションに設定されていないストレージで外部テーブルを作ろうとするとエラーとなります。
    image.png
    Hive Metastore 側だと成功します。
    image.png

  6. SQL ウェアハウスでアクセスする場合には、データアクセスの構成を行います。
    image.png

  7. SQL ウェアハウスで構成設定ができていると、カタログエクスプローラーからもテーブルが確認できるようになります。
    image.png

  8. もちろんクエリ可能
    image.png

以上のように、Spark 構成設定によりOneLake へのサービスプリンシパルアクセスができました。
Unity catalog で管理できない点だけが難点ですが、現時点では最も機能の制限が少なく使いやすい方式だと思います。

3. 外部ロケーション

クラウド ストレージを Azure Databricks に接続するための外部の場所を作成する を OneLake に対して構成してみます

準備

検証

  1. カタログエクスプローラーから外部ロケーションの設定にすすみます。
    image.png
  2. 作成をクリック
    image.png
  3. これまで使用した abfss パスを入力して作成します。結果はエラー。 Fabric OneLake は不可のようです。
    image.png

この方式で作成できることを期待していましたが、現時点ではサポートされていないので、今後よりスマートな方法が提供されることが期待されます。

4. ストレージ資格情報を使用して直接アクセス

準備

  • レイクハウスを作成しておきます。
  • Databricks アクセスコネクタなどの、Unity Catalog メタストアを構成する際に使用しているIDをFabric ワークスペースの共同作成者に設定しておきます。
    image.png
    image.png

検証

  1. コードを実行して直接アクセスしてみます。エラー内容的にも Fabric はサポートされていないようです。
    image.png
  2. https 形式でも不可
    image.png

外部ロケーションでブロックされた時点でうすうすわかってはいましたが、やはり不可でした。

5. レイクハウスフェデレーション

レイクハウスフェデレーション で Fabric に接続することはできるのでしょうか

検証

  1. フェデレーション先の接続を作成するコードを不完全ながら実行してみると以下のようにエラーとなりました。
    image.png
  2. メッセージから推察し、TYPE を Fabric にしてみると、まだ有効化されていない旨のメッセージ。
    image.png

結果は失敗ですが、今後のサポートが期待される結果となりました。

6. (番外) ハブストレージを介しての相互アクセス

Fabric -> ショートカット
Databricks -> 外部ロケーション

という形で相互にアクセスするストレージを介して接続してみます。

準備

  • Azure Data Lake Storage を作成しておきます。
    image.png

検証

  1. Fabric 側で スキーマが有効なレイクハウスを作成
    スキーマが有効なレイクハウスは現時点での制限が多いのですが、スキーマレベルでショートカットしておけば配下のテーブルを自動的にレイクハウスで認識できるはずという狙いです。
    image.png

  2. ショートカットを作成
    image.png
    image.png
    image.png

  3. Unity Catalog の資格情報に権限付与
    image.png

  4. 外部ロケーションを作成
    image.png

  5. 外部ロケーションの利用権限を付与しておきます。
    image.png

  6. レイクハウスに適当なcsv を読みこみ
    image.png
    image.png

  7. SQL ウェアハウスからクエリしてみます。
    image.png

  8. テーブルを作成してみます。
    image.png
    レイクハウス上でも自動追加されました。
    image.png

以上のように、ハブとなる Azure Data Lake Storage に双方からアクセスしてやることで、Databricks と Fabric でデータを相互連携できます。

この方式では現在 Unity Catalog ミラーリングで ストレージのファイアウォールを通過することができないという制限を回避しながら相互連携が可能です。

スキーマが有効なレイクハウスを使用しない限りは、テーブルの自動追加が難しい点だけが難点ですが、Storage を追加してもよい場合にはこれも有力な選択肢となるかと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?