Databricks Connect（Python）環境を Windows Subsystem for Linux (WSL)上に特定の目的のみに利用する  Linux 環境に構築する手順

## 概要

Windows Subsystem for Linux (WSL)上に、 特定用途の利用のみを想定した Linux 環境を新規作成（エクスポート＆インポート）して、Databricks Connect により Databricks に接続するまでの手順を共有します。

本手順で構築できる環境の概要は次のようになっております。

- wsl 上に構築した Databricks Connect  専用の Linux 環境に対して、 miniconda をインストールし、Databricks Connect のバージョンごとに Conda 環境を構築
- Visual Studio Code 上でコードフォーマットなどが実施できるように、ライブラリをインストールし、pyproject.toml や .vscode/settings.json で設定を共有。
- 環境の利用終了する場合には、`wsl --unregister <Distro>` コマンドにより wsl 上の Linux 環境を削除。

本手順で利用するレポジトリーは、 Github 上に配置してあります。

https://github.com/manabian-/databricks_development_practices

## 本記事の位置付け

次の開発ガイドシリーズにおけるDevOps分野の1記事であり、リンク先には記事にて記事の全体像を整理している。

| GroupID | 分野               |
| ------- | ---------------------- |
| T10     | Spark概要                  |
| T20     | データエンジニアリング |
| T30     | データ品質チェック     |
| T40     | データサイエンス       |                                         |
| T50     | メタデータデプロイ     |
| T60     | テスト                 |
| **T70**     | **DevOps**                 |

https://qiita.com/manabian/items/67bcb6c5823bc4d5d944


## 基本方針

Databricks Connect 環境の構築方法としては下記表の方法が考えられるが、１の方法を採用しました。ローカル環境の OS が Windows の場合には、Databricks で利用されている OS との仕様差異を最小限とするために、Databricks Runtime と同じバージョンの Operating System (Databricks Runtime 10.4 LTS を利用する場合には Ubuntu 20.04 LTS) を用いるべきです。

| #    | 方法                                                         | Pros                                             | Cons                                                         |
| ---- | ------------------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------------------ |
| 1    | Conda （無償：Miniconda、有償：Anaconda）を用いて構築する方法 | - 初期環境の統一ができ、環境を柔軟に切り替え可能 | - 環境の統一が困難                                           |
| 2    | Poetry を用いて構築する方法                                  | - 環境の統一が容易                               | - Databricks Connect のバージョンを切り替えることができない |
| 3    | コンテナ（無償：Rancher Desktop、有償：Docker Desktop）を用いて構築するする方法             | - 初期環境の統一ができ、環境を柔軟に切り替え可能  | - コンテナーに関する知識が必要 |
| 4    | Python 仮想環境を用いずに直接構築する方法             | - 特になし                                       | - Databricks Connect のバージョンを切り替えることができない |

Python の Linter と Formatter として次のライブラリを利用することとしました。

| #    | 分類      | ライブラリ名 | 目的                               |
| ---- | --------- | ------------ | ---------------------------------- |
| 1    | Formatter | black        | コードに対するフォーマットツール。             |
| 2    | Formatter | isort        | import文に対するフォーマットツール。           |
| 3    | Linter    | flake8       | コードに対する静的解析ツール。     |
| 4    | Linter    | pydocstyle   | Docstring に対する静的解析ツール。 |
| 5    | Linter    | mypy         | 型に対する静的解析ツール。         |

ライブラリの設定値は、次のファイルにて設定してます。

| #    | ファイル名     | 概要                                                         |
| ---- | -------------- | ------------------------------------------------------------ |
| 1    | pyproject.toml | 基本的な設定値を設定。                                       |
| 2    | .vscode/settings.json  | ローカル環境でのみ有効な設定値を設定。テスト実行時の並列数の設定など。 |
| 3    | .vscode/launch.json    | デバッグ時にのみ有効な設定値を設定。カバレッジレポートを取得しない設定など。 |


Conda 環境情報を`environment.yml`に記述しており、Databricks Connect に対応した Python バージョンをベースに`requirements.txt`を pip install する構成にしている。`requirements.txt`では、Databricks Connect や Linter などの次に示している開発時に必要なライブラリだけでなく、Databricks Runtime にインストールされている多くのライブラリを保持している。

## 構築手順
### 0. 事前準備

事前準備として、以下のインストールを事前に実施。

- [Windows Terminal](https://apps.microsoft.com/store/detail/9N0DX20HK701?hl=ja-jp&gl=JP)
- [Visual Studio Code](https://code.visualstudio.com/download)
  - [Remote Development](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack)
- [Windows Subsystem for Linux](https://learn.microsoft.com/ja-jp/windows/wsl/install)
  - [Ubuntu 20.04 - Microsoft Store アプリ](https://apps.microsoft.com/store/detail/ubuntu-2004/9N6SVWS3RX71?hl=ja-jp&gl=jp)

### 1. WSL 上の Ubuntu 20.04 環境をエクスポートして別名でインポート

#### 1-1. Windows Terminal にて powershell を起動後、以下のコマンドを実行

```powershell
# Set wsl distro name
$src_wsl_distro_name = "Ubuntu-20.04"
$tgt_wsl_distro_name = "databricks-connect"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c27ed9fd-6cf1-9b48-3b32-1bdebcb893a5.png)

```powershell
# Update wsl version to 2
wsl --set-version $src_wsl_distro_name 2
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a931b1ba-e8ea-ea29-8d4f-15fe9a6dd768.png)

```powershell
$wsl_file_name = $src_wsl_distro_name + ".tar"
wsl --export $src_wsl_distro_name $wsl_file_name
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/58616168-dbea-563a-513b-00346ed9fc92.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/607ae278-23f9-b21d-94d9-9e5e31577ddb.png)


```powershell
# Import wsl distro_name
wsl --import $tgt_wsl_distro_name $tgt_wsl_distro_name $wsl_file_name
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f0608c52-4eb2-d6c8-0bab-615072d36f83.png)


```powershell
# Check wsl dstro list
wsl -l

# login to wsl distro
wsl -d $tgt_wsl_distro_name -u root
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/2687619a-0b67-6648-d9c8-514b8b5cead9.png)


`default_user_name` 変数にて、ubuntu で作成したユーザー名をセットして、以下のコマンドを実行します。`default_user_name` 変数の値を必要に応じて変更してください。

```bash
# Set default user name
default_user_name=wsl_user

cat << EOF > /etc/wsl.conf
[user]
default=$default_user_name 
EOF

# chekc wsl.conf
cat /etc/wsl.conf
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/11cd672e-e2cf-9416-94ec-fc0bb5558ed1.png)


```bash
# logout
exit
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/730ab756-2463-1d62-37d8-85362fc2f5da.png)

```powershell
# Delete distro file
Remove-Item $wsl_file_name
```

```powershell
# reboot and re-login
wsl -t $tgt_wsl_distro_name
wsl -d $tgt_wsl_distro_name
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4a625b73-cdc5-1fea-bc58-beb6d826d369.png)

```bash
sudo apt update && sudo apt upgrade -y
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5d1d6ab4-547a-a9bc-8305-4ff4fa22bce8.png)

```bash
# install java required by databricks-connect
sudo apt install openjdk-8-jre -y
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1993c89b-65b7-2afd-0528-f0536af7ff95.png)


```bash
# check java version
java -version
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/86ba67ce-cf9e-fadb-035d-779dd8362a51.png)

### 2. miniconda をインストール

#### 2-1. Windows Terminal を再起動後、 1 の手順で作成した環境のコマンドラインシェルを起動後、次のコマンドを実行。

```bash
# download miniconda
cd
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ddff9d33-548a-9552-c4a3-a29a12b04f4a.png)


```bash
# install miniconda
bash Miniconda3-latest-Linux-x86_64.sh
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1a39d418-69c4-f425-256f-5f28d8b39ade.png)

インストール時の質問に対しては、次のように回答。

| #    | 質問                                                         | 回答  |
| ---- | ------------------------------------------------------------ | ----- |
| 1    | Do you accept the license terms?                             | yes   |
| 2    | Miniconda３ will now be installed into this location         | ENTER |
| 3    | Do you wish the installer to initialize Miniconda3 by running conda init? | yes   |


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d4978094-905d-2283-a83b-26f1bf7c672a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e6378d6c-bad2-120d-41a3-a4c59c9c4315.png)


```bash
# delete miniconda sh file
rm Miniconda3-latest-Linux-x86_64.sh
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7d95c6e8-2a9a-1848-c220-4d4bd2769fa8.png)

```bash
# create directory for git
mkdir source
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/61603d59-3d6a-1d79-b518-df7acb4917f4.png)

### 3. conda env を作成

#### 3-1. VS Code から、1 の手順で作成した WSL 環境に接続

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/3162bef7-4415-4f9a-801c-0d25b84ee637.png)


#### 3-2. Azure DevOps にてクローンする レポジトリーの `Repos` -> `Files`ページに接続後、`clone`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/79f65cd8-4359-84bb-c1f0-8cbaa10e9c21.png)


#### 3-3. `IDE`にある`Clone in VS Code`を選択し、VS Code に画面に切り替わることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/71452a99-63ba-734f-791e-534b5ccc5aaa.png)

#### 3-4. `Choose a folder to clone` プロンプトにて、 2 の手順で作成した `source` を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0811b8fd-fc1f-8cb7-4d1d-0795d4c1af1f.png)


#### 3-5. Azure DevOps に戻り、`Generate Git Credentials`を選択し、`Password` の値を取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/99a699ee-b8bd-1e72-3f4f-711cf4416c98.png)


#### 3-6. VS Code にて、`Password` を入力後、コードがクローンされることを確認 


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/2854435e-1c53-c7be-cb5e-35d0c119f9ba.png)

#### 3-7. クローンしたディレクトリを開き、Azure DevOps 上のディレクトリ構成となっていることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d06412c8-0e97-a6ee-04d9-6a212aee3e8c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/beb0fe32-9dec-6a32-8b65-4ed3a714baeb.png)

1. `Do you want to install the recommended extensions for this repository` プロンプトが表示された場合には、`install` を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d49dc880-5cd7-b024-49b2-64f8bee7ce64.png)


クローン完了後、VS Code のターミナルにて、次のコマンドを実行。`databricks-connect` のファイルサイズが大きいことでタイムアウトが発生する場合には、`pip install` により`databricks-connect`を個別にインストールし、`pip install -r requirements.txt`によりその他のライブラリをインストールする手順に変更。

```bash
# create conda envrioment for databricks connect
conda env create -f environment.yml
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0fb100e5-80aa-29e8-eb6a-b610914c76dd.png)


```bash
# check conda env
conda env list
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/bccf5c7d-5e88-5030-3276-9de495dc6ca5.png)


## 4. Databricks  への接続設定

### 4-1. VS Code のターミナルにて、次のコマンドを実行。設定値については、[ドキュメント](https://learn.microsoft.com/ja-jp/azure/databricks/dev-tools/databricks-connect#step-2-configure-connection-properties)を参照。通常の手順では、`.databricks-connect`にて接続情報が格納。

```bash
# connect to databricks connect conda env
conda activate dbconnect_10_4

# config databricks connect
databricks-connect configure
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9eef74b4-defa-8154-03fb-ff22c9c6deb2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6d5cdfeb-8c67-c0ee-d8d1-066040c35705.png)


```bash
# test connect to databricks cluster
databricks-connect test
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e6cf8f9a-2c8a-e365-ecf9-4b8cd7cf4e5e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/dd074453-7f15-0392-3943-438025187a3e.png)

### 4-2. VS Code の `テスト` タブ にて、`test_append_to_table` のテストを実行し、正常終了することを確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/55ecb108-1d2d-5fad-c574-3ed8f2b6fdcf.png)


### 4-3. VS Code にて、`Ctrl+Shift+P` -> `Python:Select Interpreter` （画像の下の項目）を選択後、作成した Conda 環境(`dbconnect_10_4`) を選択。Python library gaarukot wokakuni 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4231e58d-e31d-8129-25c8-1c38d9aeaadc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a852872a-a214-7876-79f9-2b72d2313f80.png)


### 4-4. タスクバーにある VS Code アイコンを右クリックし、現在開いているディレクトリ（例：`databricks_development_practices[wsl: databrikcs-connect]`）の`一覧にピン留めする` を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a903a1fa-53cf-6290-331d-400b0224688d.png)