初見Databricks on GCPを使ってわかったこと 3 【GCSの連携の仕方】

今回は第三弾として、databricksをGCP上で立ち上げた、workspaceの中のnotebookで、実際に学習データを参照したいということが発生するのは必要不可欠で実際にどのようにやるのかの説明をします。


実際に記事はあるのですが、初見でこれをやろうとすると、いろんなリンクに飛ばされるので、この記事を見れば1発でどのようにデータ連携できるのかを書きます。

https://docs.databricks.com/ja/connect/storage/gcs.html

これまでの記事はこちらから

https://qiita.com/magisystem0408/items/83e0842ed1d9275316c7

https://qiita.com/magisystem0408/items/08ccc90c22c9beba84fb


## 今回達成したいアーキテクチャと結論

![空白の図(21).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/1060e441-7763-d002-96bf-d2691ae442ec.jpeg)

実際にCloudStorageと連携するには、databricks上で学習instanceを立ち上げる設定画面で、GCP上で作成したCloudStorageにアクセスできるRoleを持ったIAM Accountを指定すればよいそうです。

![スクリーンショット 2024-01-01 3.00.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/01d356b3-eda0-466c-8d85-d90c5bc534b9.png)



### 途中でDatabricks CLIを使用するのでInstallしておく

https://docs.databricks.com/en/dev-tools/cli/install.html

macの方だと、brew commandもあってbrewでもinstallできます。

```terminal
brew tap databricks/tap
brew install databricks
```

### Step01: ServiceAccountとCloudStorageをGCP consoleから作成してServiceAccountの鍵をjsonでダウンロードする。

#### Service Accountには、`roles/storage.admin`のCloudStorage管理者のRoleを割り当てる必要がある。

これはdatabricks上からアクセスするため。

実際にService AccountをJsonでダウンロードする

![スクリーンショット 2024-01-01 3.06.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/ad1635e2-9186-ffe7-faa6-f32930bed758.png)

下記のkey-valueの形をしたjson fileが取得できて、ここの値を使用する部分はあとで使用する。

```json
{
  "type": "service_account",
  "project_id": "ここの値を使用する",
  "private_key_id": "ここの値を使用する",
  "private_key": "ここの値を使用する",
  "client_email": "ここの値を使用する",
  "client_id": "",
  "auth_uri": "",
  "token_uri": "",
  "auth_provider_x509_cert_url": "",
  "client_x509_cert_url": "",
  "universe_domain": ""
}
```

### Step02: Databricks-CLIでSecretとSerectScopeを作成
Databricks-cli上でsecretを作成するのだが、大きく、
- secretをまとめる、scope
- secretそのもの

を作成する必要がある。

これは、databricksのinstanceを立ち上げるときに、spark経由でアクセスするのだが、アクセスする設定fileにStep1で作成したSAのjsonファイルの中の`ここの値を使用する`部分を指定するのだがその中にdatabricks-workspaceのsecretとして登録しておく必要がある。


下記が最終的に、設定する項目なのだが、`{{ }}`で囲まれている。`private.key.id`と`private.key`に関してはsecret化する。

```python
spark.hadoop.google.cloud.auth.service.account.enable true
spark.hadoop.fs.gs.auth.service.account.email <client-email>
spark.hadoop.fs.gs.project.id <project-id>
spark.hadoop.fs.gs.auth.service.account.private.key {{secrets/scope/gsa_private_key}}
spark.hadoop.fs.gs.auth.service.account.private.key.id {{secrets/scope/gsa_private_key_id}}
```

このとき、以下のような意味を持つ。
`{{secrets/<これから作成するscope名>/<これから作成するscopeの中に属するSecretKey>}}`

#### databricks configureしてworkspaceにアクセスできるようにする。

```bash
databricks configure

下記と言われるので
✗ Databricks host: https://█

databricksのworkspaceを指定する。
https://xxxx.0.gcp.databricks.com/?o=xxxxxx

token: xxxx

tokenに関しては、personal access tokenをdatabricks workspaceの「ユーザー設定 > 開発者 > アクセストークン」を取得してCopy paste
```

![スクリーンショット 2024-01-01 1.41.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/c0b87a5a-df96-6f71-9515-51dc8bdff4cc.png)

実際にconfigureした後は、`~/.databrickscfg`にconfig infoが保存される。実際に下記は保存されてるかのcheck
```
vi ~/.databrickscfg
```

色々認証方法があるみたい。
https://docs.databricks.com/en/dev-tools/auth/pat.html

#### scopeを作成する。

`--initial-manage-principal users`を使わない方法もあるが、databricksのPremiumプランの場合だと必要ない。

```bash
databricks secrets create-scope test-connect-storage --initial-manage-principal users
```

実際に作成されたscope
```console
matsudomasato@matsudomasatonoMac-Studio ~> databricks secrets list-scopes                                                                                                            (base) 
Scope                 Backend Type
test-connect-storage  DATABRICKS
```

#### scopeを指定してsecretを作成する。

`databricks secrets put-secret <scope-name> <key-name> `でsecret作成なので
`scope: test-connect-storage`に`gsa_private_key_id`と`gsa_private_key`を作成する。

```console
matsudomasato@matsudomasatonoMac-Studio ~> databricks secrets put-secret test-connect-storage gsa_private_key_id                                                                     (base) 
✔ Please enter your secret value: 
//実際にStep1でJsonでダウンロードした、gsa_private_key_idとgsa_private_keyのvalueをそれぞれ作成
```

実際にsecretが格納されてるかのcheck
```console
matsudomasato@matsudomasatonoMac-Studio ~ [1]> databricks secrets list-secrets test-connect-storage                                                                                  (base) 
Key                 Last Updated Timestamp
gsa_private_key     1704042167423
gsa_private_key_id  1704042192332
```

これでsecretの設定はOK。下記が公式の内容

https://docs.gcp.databricks.com/ja/security/secrets/secrets.html


### Step3: 学習用instanceを立ち上げる設定で上記の内容を設定する。
これらの情報を「高度なオプション」のSparkタブに書く

![スクリーンショット 2024-01-01 3.36.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/5414a1bd-b2af-de7a-35cd-28f645cf2aa4.png)

spark構成についてはもう一度貼る。

```python
spark.hadoop.google.cloud.auth.service.account.enable true
spark.hadoop.fs.gs.auth.service.account.email <client-email>
spark.hadoop.fs.gs.project.id <project-id>
spark.hadoop.fs.gs.auth.service.account.private.key {{secrets/scope/gsa_private_key}}
spark.hadoop.fs.gs.auth.service.account.private.key.id {{secrets/scope/gsa_private_key_id}}
```


### DONE。

試しにnotebookで指定したinstanceが使えるかを試してみる。

新しく作成したCloudStorageの`Bucket: databricks-to-gcs-test`にcsvを配置してdatabricks-workspaceに配置した、notebook上呼び出せるかをテスト。
今回作成した学習用instanceを指定するのを忘れずに。

![スクリーンショット 2024-01-01 3.40.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/be98194e-5c25-98bd-46d0-bae815178dad.png)