VSCodeからAzure Databricksクラスターに接続する(Databricks Connect)

Azure

VSCodeの拡張機能(Databricks)の「Databricks Connect統合」を利用することで、ローカル開発環境からAzure Databricksクラスターに接続し、pythonやscalaのコードをデバック実行することができます。

今回はpythonを例に、Databricks Connect統合を試していきます。

環境

Azure

DatabricksワークスペースPremium(トライアル)
Databricks Runtime13.3
Python3.10.12

ローカル環境

OSWindows11
VSCode1.83.1
Python3.10.9

Azure準備作業

Azure Databricksワークスペースを作成します。作成自体は簡単なので省略します。ワークスペースを作成したらクラスターを作成するのですが、注意点が3つあります。

  • Unity CatalogがAzure Databricksワークスペースに対して有効になっている
  • DatabricksクラスターにはDatabricks Runtime 13.0以降がインストールされている(Pythonの場合)
  • Databricksクラスターのアクセスモードが「割り当て済み」もしくは「共有済み」である。

以降で順番に見ていきますが、詳細については下記のMSドキュメントを参照してください。

Unity Catalogの有効化

Unity Catalogを有効にすることで、Databricksワークスペース全体でアクセス制御を一元管理できます。また監査やデータ検出の機能などが備えられています。Unity Catalogは以上の機能を持ったガバナンスソリューションです。Unity Catalogについての詳細は下記MSドキュメントを参照してください。

Unity Catalogの有効化についてですが、まずは各種データを管理するメタストアを格納するためのAzure Data Lake Storage Gen2アカウントをDatabricksと同じリージョンに作成します。作成するときは、Premiumパフォーマンスかつ階層名前空間を有効にします。それ以外はデフォルトのままで問題ありません。作成後、メタストア用のコンテナを作成します。ここではコンテナ名を「metastore」としています。

続いて、Databricks用のアクセスコネクタを作成し、ストレージへのアクセス権限を与えます。Unity Catalogはこのアクセスコネクタを利用してストレージのコンテナにアクセスします。

アクセスコネクタ自体の作成は特別な設定はありません。必要な情報(名前やリージョンなど)を入力して作成します。作成時のデフォルトの設定でマネージドIDが有効になっていますので、このマネージドIDに対して先ほど作成したストレージへの「ストレージBLOBデータ共同作成者」ロールを付与します。またアクセスコネクタのリソースIDを後程使用しますのでメモしておきましょう。

最後にメタストアを作成してDatabricksワークスペースに割り当てます。Databricksワークスペースの右上からManage Accountを選択します。その後、「Data」 > 「create metastore」の順に選択します。

「ADLS Gen 2 path」には「abfss://<コンテナ名@<ストレージアカウント名>.dfs.core.windows.net/」を入力します。「Access Connector Id」には先ほどメモっておいたアクセスコネクタのリソースIDを入力します。

メタストアを作成したら、紐づけたいDatabricksワークスペースを選択してAssignします。Unity Catalogを有効にするかのメッセージが表示されますので有効にして完了です。

クラスターの作成

VSCodeから接続する先のクラスターを作成します。アクセスモードは「Single User」か「Shared」に設定します。そのほかはデフォルトのままで構いませんので、必要に応じて設定してください。ただしランタイムは13.0以上が必要です。

ローカル開発環境の準備

ここからはローカル開発環境の設定を行います。VSCodeやPythonは設定してある前提で進めます。PythonはAzure Databricksクラスターにインストールされているバージョン(メジャー、マイナー)と同じである必要があります。今回はpython 3.10がクラスターにインストールされているので、ローカルでも3.10をインストールします。(3.11でも動作しましたが、基本的にはバージョンは揃えましょう。)

拡張機能のインストールと設定

拡張機能「Databricks」をインストールします。インストールしたらAzureへの認証を行います。私の環境はすでにAzure CLIで認証ができていたためそれを利用しました。認証後はDatabricksのワークスペースのURL(https://adb-xxxxxx.azuredatabricks.net)を求められるので、Azure PortalのDatabrciksの概要からURLをコピーして入力します。

その後、Databricks拡張機能のClusterの歯車マークをクリックして、先ほど作成したクラスターを選択します。下記のように緑のチェックマークが表示されていれば大丈夫です。

Databricks Connectの設定

ここまでの設定で、VSCodeのステータスバーの左下あたりに「Databricks Connect disabled」と表示されていますので、これをクリックします。もしくはコマンドパレットで「Databricks: Configure autocomplete for Databricks globals」を入力して実行します。python仮想環境を利用する場合は予め仮想環境をactivateしておきます。

プロンプトが表示されるので、それに従い構成していきます。この時、クラスター要件を満たしていない場合、以下のようなエラーメッセージが表示されます。

Databricks Connect requires a Unity Catalog enabled cluster with Access Mode "Single User" or "Shared".

クラスターの要件が問題なければ、databricks-connectモジュールをインストールします。自動で以下のようにモジュールをインストールするコマンドが実行されます。

'c:\code\projetc\venv\Scripts\python.exe' -m pip install 'databricks-connect==13.3.2' --disable-pip-version-check --no-python-version-warning; echo $? > C:\Users\user\AppData\Local\Temp\databricks-vscode-NL2qWB\python-terminal-output.txt

しかし、私の環境では以下のようなエラーが発生しインストールできませんでした。

Unexpected token '-m' in expression or statement.

そこで、先頭の「c:path/python.exe -m」を除いて「pip~」以降のコマンドをコピーして直接実行しました。インストール完了後は以下のようにDatabricks Connect enabledになっていれば接続環境です。

デバック実行

やっと準備が整いましたので、実際にpythonファイルやノートブックをデバック実行してみます。

pythonファイル

まずはpythonファイルです。以下のようにsparkセッションを構成します。コード自体はローカルで実行されますのでsparkセッションの構成が必要になります。ただし、DataFrameの操作などPySparkコードはAzure Databricksクラスターで実行されて、結果がローカルに返却されます。

from databricks.connect import DatabricksSession

spark = DatabricksSession.builder.getOrCreate()

file_path = '/FileStore/tables/csv/test.csv'
df = spark.read.csv(file_path)
df.show()

後はいつも通りPythonファイルをデバック実行します。

Azure Databricks上のファイルシステム(DBFS)に格納したファイルを読み取っています。実行自体はローカルから行っていますが、Databricksクラスターに接続しているため問題なく読み取れています。

DBFSへのファイルのアップロードに関しては下記の記事を参照してください。

ノートブック

ノートブックでは「Run Next Line」をクリックすることで、1行ごとにデバック実行できます。ノートブックを実行するときに「ipykernelモジュール」が必要なため、なければインストールします。

上記を見て分かる通り、ノートブックではsparkセッションやdisplay関数などがあらかじめ構成されているため、自分で構成しなくても実行できます。pythonファイルと同様に、PySparkコードはAzure Databricksクラスターで実行されるため、AzureのDatabricks上に存在するファイルを処理するコードも問題なく実行できています。

まとめ

設定する項目が非常に多くやや大変ではありましたが、無事ローカルからAzure Databricksクラスターに接続してローカルのpythonコードをデバック実行することができました。デプロイ先と同じ環境で開発できるため、デプロイ後の非互換も気にすることなくスムーズに開発できます。

ここまで来たらあとはデプロイを検討したいと思います。Azure Functionsなどと同様にコードをgitにpushするだけで、Azure Databricks上にデプロイできると非常に便利で効率的に開発できます。そのため、次回はデプロイについて調べてまとめていきます。

コメント