Azure Databricksをインフラ視点で使う(2)【ストレージの追加設定編】
はじめに
前回の記事ではAzure DatabricksをTerraformを使って基本的な構成を行いました。
Databricksを仮想ネットワーク指定で作成することで、今後様々な外部データをプライベートネットワーク経由でつなげられることが期待できます。
また、続編の記事も以下で公開しています。
なぜストレージアカウントを作るのか
Azure Databricksを作成すると、追加で専用のリソースグループが作成され、その配下にはデフォルトのカタログ用ストレージとDatabricksから認証を行うためのAccess Connectorが作成されます。
他にもこのリソースグループにはコンピュートインスタンスを起動させるとVMSSなどもデプロイされます。
ここにあるストレージアカウントはdefaultというスキーマを入れる領域として自動で用意されます。
この場所をそのまま使っても良いかとは思いますが、噂ではAWS版のDatabricksでは初期構築時にこのような領域は作成されず、またDatabricksの人からもあまりこちらを使うのはおすすめしないとの事でした(あくまで非公式な情報)。
また、この専用のリソースグループは完全にAzure Databricksが管理しているため、個別にリソースのプロパティ変更などが行えません。
- ストレージアカウントがpublicアクセスになっている
- 特にプライベートリンクされていない
- ストレージアカウントにロールが付与できないのでコンテナ内のファイルにAzureポータルなどからアクセスできない
ちょっと厳しいかなと。
Databricksのポータルから操作する分には困らないと思いますが、できればボリューム内のファイルのやり取りは直接ストレージにアクセスしてAzure的な操作で行いたいですよね(きっと)。
なので、自分で作成したストレージアカウントをDatabricksから使えるようにします。
今回やったこと
今回は以下の追加を行いました。
- Databricks Access Connector作成
- 新規のストレージアカウント(Gen2)作成
- パブリックアクセスはなし
- 既存の仮想ネットワークにプライベートリンク
- スキーマ用、ボリューム用のコンテナ作成
- 作成したストレージアカウントのIAMにDatabricks Access Connectorのロールを付与
その後はDatabricksポータルから設定を行っていきます。
使い方
クライアントPCにはAzure CLIとterraformはインストールしておきましょう。
まずリポジトリをclone後、terraform.tfvars.sample
を terraform.tfvars
にコピーして、内容を適度に書き換えます。
続いて、以下のコマンドイメージを参考にデプロイしましょう。
export ARM_SUBSCRIPTION_ID="your subscription id"
az login -t <your tenant id>
az account set -s $ARM_SUBSCRIPTION_ID
terraform plan
terraform apply
はいできました。
デプロイ後、outputsにてAccess ConnectorのリソースIDと、ストレージのURLが出力されるので、こちらは控えておきます。
azurerm_databricks_access_connector_id = "/subscriptions/????????-????-????-????-????????????/resourceGroups/rg-databricks01/providers/Microsoft.Databricks/accessConnectors/access-connector-ktkrdbws"
azurerm_storage_account_url = "https://stktkrdbws????????.dfs.core.windows.net/"
少しTerraformの説明
ストレージ関連
ストレージアカウントを作成しているメインの部分は以下です。
ストレージアカウントのコンテナもスキーマ用と、ボリューム用に二つ作成します。
その後プライベートリンクを張ります。
プライベートIPアドレスにて、Databricksから名前解決できるようにPrivate DNS zoneを作成しています。
Databricks Access Connector
Databricksの資格情報に設定するためのAccess Connectorを作成します。
IAM
また、作成したAccess Connectorからストレージアカウントに「ストレージBLOBデータ共同作成者」のロールを付与しています。
ロールID「ba92f5b4-2d11-453d-a403-e96b0029c9fe」は固定です。
こちらのサイトにAzure組み込みロールの一覧があります。
Databricks側の追加設定
資格情報
カタログエクスプローラから外部データ内の「資格情報」を開き、「資格情報を作成」をクリックします。
資格情報のタイプは「AzureマネージドID」、資格情報名は適当に。
アクセスコネクターIDに先ほどterraform apply時に最後に表示されたazurerm_databricks_access_connector_idの内容を入力します。
最後に「作成」を押して完了です。
外部ロケーション
カタログエクスプローラから外部データ内の「外部ロケーション」を開き、「外部ロケーションを作成」をクリックします。
ボリューム用、スキーマ用の二種類作成します。
まずは、ボリューム用。
外部ロケーション名は適当に。URLは「abfss://コンテナ名@ストレージアカウント名.dfs.core.windows.net/」の形式です。
ストレージアカウント名がstktkrdbws12345678の場合、ボリューム用のコンテナ名を含めて以下のように指定します。
abfss://volume@stktkrdbws12345678.dfs.core.windows.net/
ストレージ資格情報は、先ほど作成したものを選択して設定します。最後に「作成」をクリックします。
同様に、スキーマ用の外部ロケーションも作成します。
新規カタログ
新規のカタログを作成しましょう。
カタログエクスプローラの「+」ボタンから「カタログを追加」を選びます。
カタログ名は適当に、ストレージの場所に先ほど作ったスキーマ用の外部ロケーションを選択しました。
また、なんとなくですが1階層ディレクトリの奥に作ってみたく、パスに「catalog」と入れました。
このあたりは、実際にDatabricksでカタログを使いまくっている人たちがベストプラクティスを知っていると思いますが、私はこのへんはまだ判らないです。
とりあえずカタログ一覧に追加されたようです。
このカタログ配下でテーブルを作ると、それは今回追加したストレージアカウントの「schema」コンテナ内の「catalog」ディレクトリ配下に格納されていく事でしょう。
新規ボリューム
先ほど作成したカタログ配下にボリュームを追加します。
カタログエクスプローラのツリーから先ほど作ったカタログ内の「default」を選択して、「作成」プルダウンから「ボリュームの作成」を選択します。
ボリューム名は適当に。ボリュームタイプは「外部ボリューム」を選択して、外部ロケーションに先に作成したボリューム用のものを選択します。
パスは自動で入力されますが、末尾に「/volume01」と付与してみました。こうすると、Azureストレージアカウントのvolumeコンテナ内に自動で「volume01」ディレクトリも作成されます。
作成したボリュームにクライアントPCからファイルのアップロードも行えます。
とりあえず確認
では確認しましょう。
まずは、手元にある適当なcsvファイルをdefaultスキーマ内にテーブルとして登録します。
この際に使うコンピュートがサーバレスなものではない、別途追加したもので実行してください(サーバレスを選ぶとテーブル作成ができません)。
SQLエディタでちゃんとクエリが実行されましたね。
ノートブックからも確認します。
うまく行きましたね。
今後やること
- サーバレスのSQL Warehouse等をプライベートリンクで接続(公開済)
- Databricksワークスペース自体をプライベートネットワーク経由のみでアクセスさせるように構成してみる
- もう少しDatabricksそのものの知見を深める
おわりに
とにかく先が長そうな試用なので、記事を分割して少しずつ取り込んでいきたいと思います。
今回の記事で、Azure Databricksに管理されていないストレージアカウントをプライベートネットワーク経由でカタログに登録して色々操作することはできるようになりました。
次回はいよいよ、Databricks管轄のサーバレス用コンピュートから、今回の仮想ネットワークにプライベート接続させて、より完全なものに仕上げていきたいと思います。
Discussion