Databricksのノートブックスコープライブラリのスコープとは？

こちらで説明されているノートブックスコープライブラリをより詳細に説明した内容となっています。

https://qiita.com/taka_yayoi/items/d3a46efdc1ad01a581d0

名前の通り「ノートブック」がスコープとなるライブラリなのですが、自分もきちんと理解しているのか不安になったので動作を確認してみました。

あるクラスターにアタッチしているすべてのノートブックに反映されるのが[クラスターライブラリ](https://qiita.com/taka_yayoi/items/869158c7bd3ab7c45ff4)です。

一方、ノートブックスコープライブラリで疑問に思うのは以下の点でしょうか。

**疑問1**
> 同じユーザーが同じクラスターに複数のノートブックをアタッチしている際、一方のノートブック(ノートブックA)でノートブックスコープライブラリをインストールしたら、もう一方のノートブック(ノートブックB)はどうなるのか？

これに関しては、[こちら](https://qiita.com/taka_yayoi/items/d3a46efdc1ad01a581d0)で説明している通りなのですが、以下で実際に確認します。

> ノートブックスコープライブラリをインストールすると、現在のノートブックとそのノートブックに関連づけられているジョブがそのライブラリにアクセスすることができます。同じクラスターにアタッチされている他のノートブックは影響を受けません。

**疑問2**
> ノートブックスコープライブラリをインストールした後、それまで使えていた変数にアクセスできなくなったのだけどなぜ？他のノートブックは影響を受けないの？

これらの疑問に答えるべく、実際に試してみます。

# ノートブックの準備

以下の2つのノートブックを準備します。**疑問2**の確認をするために変数を宣言しておきます。

```py:notebook_A
test = "A"
```

```py:notebook_B
test = "B"
```

これらを同じクラスターにアタッチします。

# ノートブックスコープライブラリのインストール

**notebook_A**の2番目のセルで以下を実行して、ノートブックスコープライブラリをインストールします。

```py:notebook_A
%pip install deepchem
```
![Screen Shot 2022-08-02 at 19.05.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/af7a56a1-9cf3-d85b-9a90-767a425ce6bc.png)

この後で以下を実行するとimportできることが確認できます。

```py:notebook_A
import deepchem
```

一方、**notebook_B**でも同じライブラリをimportしようとしてみます。

```py:notebook_B
import deepchem
```

同じクラスターにアタッチしているにも関わらずimportすることはできません。これで**疑問1**に対する答えが分かったことになります。**同じユーザーであろうが同じクラスターであろうが、`%pip`を実行したノートブックのみがスコープなので、別のノートブックからはライブラリを利用できない**となります。
![Screen Shot 2022-08-02 at 19.07.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7fcf2c79-6608-3601-b4b5-7c2e00b18fab.png)

それでは**疑問2**はどうでしょうか。

```py:notebook_A
test
```

**notebook_A**では変数が参照できなくなっています。
![Screen Shot 2022-08-02 at 19.10.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/01960a10-f1ea-40e0-96f6-653ee139877c.png)

これも、[こちら](https://qiita.com/taka_yayoi/items/d3a46efdc1ad01a581d0#pip%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)に記載があります。

> ノートブックの一番最初に`%pip`を記述してください。`%pip`が実行された後に、ノートブックの内部状態がリセットされます。ノートブックでPythonメソッドあるいは変数を宣言した後に`%pip`を実行するとそれらは消去されてしまいます。

このため、`%pip`を実行した**notebook_A**では内部状態がリセットされてしまうため変数が参照できなくなっています。それでは、**notebook_B**ではどうでしょうか。

```py:notebook_B
test
```

以下のように、**notebook_B**では問題なく変数を参照できます。
![Screen Shot 2022-08-02 at 19.11.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0be89fdf-3c4d-322e-a830-5e196fd0bc2c.png)

これによって、**疑問2**に対する回答も分かりました。**同じユーザーであろうが同じクラスターであろうが、`%pip`を実行したノートブックのみがスコープなので、内部状態のリセットも別のノートブックは影響を受けない**となります。


# まとめ

**疑問1**
> 同じユーザーが同じクラスターに複数のノートブックをアタッチしている際、一方のノートブック(ノートブックA)でノートブックスコープライブラリをインストールしたら、もう一方のノートブック(ノートブックB)はどうなるのか？

**同じユーザーであろうが同じクラスターであろうが、`%pip`を実行したノートブックのみがスコープなので、別のノートブックからはライブラリを利用できません。**

**疑問2**
> ノートブックスコープライブラリをインストールした後、それまで使えていた変数にアクセスできなくなったのだけどなぜ？他のノートブックは影響を受けないの？

**同じユーザーであろうが同じクラスターであろうが、`%pip`を実行したノートブックのみがスコープなので、`%pip`を実行したノートブックの内部状態がリセットされるので変数が参照できなくなります。なお、内部状態のリセットも別のノートブックは影響を受けません。**

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)