OCI Data Science の Jupyter Notebook から OCI Data Flow を使う


## はじめに

機械学習のための統合環境である OCI Data Science と サーバレス Spark 環境を提供する OCI Data Flow は別々のサービスとして独立していて、これまで何の統合もされていませんでしたが、現在では Data Science の Jupyter Notebook と OCI Data Flow の実行環境が連携されています。
これにより OCI Data Flow のサーバレスや動的リソース・アロケーション等の特長を活かしたコスト・コンシャス＆効率的な Pyspark Notebook セッションを OCI Data Science から利用できるようになりました。

![Data Science - Data Flow Integration](https://docs.oracle.com/ja-jp/iaas/data-flow/using/images/DataScienceNotebook-to-DataFlow.png)

では、実際にやってみましょう！

## 準備

ノートブック・セッションから Data Flow を制御するための認可ポリシーを設定する必要があります。

まず動的グループが必要です。
基本形は、
```
ALL {resource.type = 'datasciencenotebooksession', <追加の条件>}
```
で、状況に応じて <追加の条件> のところに resource.compartment.id や resource.id を指定します。
そしてこの動的グループに Data Flow を管理する権限を与えます。

```
allow dynamic-group <ds-dynamic-group> to manage dataflow-family in compartment '<your-compartment-name>'
```

## Data Science ノートブック・セッションを開く

データ・サイエンスのプロジェクトを作成し、その配下にノートブックセッションを作成します。
セッションの詳細画面に「開く」のボタンがありますので、これをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/1580709c-26b0-c080-2884-c74b251e3596.png)

そうすると、ブラウザに新しいウィンドウが現れ、Launcher のタブが開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/87ad5d69-ace4-f94c-cdca-eab3b40c3fcb.png)

## Conda環境のインストール

左側 (Extensions) のメニューから「Environment Explorer」をクリックします。そうすると、インストール可能な Conda 環境がリストされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/5659804d-dc4c-1964-c6f2-a92a1ee16e38.png)

「PySpark 3.2 and Data Flow Python 3.8 CPU」の行を探して、右側メニューから install を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/d9cac8d0-ce5f-1f2f-67d5-3156dcd5bf21.png)

ターミナルのタブが開いてインストールが実行されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/5809c01e-257e-335b-79fc-b4bd0dd995ef.png)

## Jupyter Notebook を開く

Launcher のタブに戻って、Kernels から「Pyspark 3.2 and Data Flow」を選んで Notebook を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/c8b1aabc-5c5f-03b3-3923-791b01891f24.png)

新しい Notebook が作成されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/2ff20ed0-a737-d19f-2dab-7a0830b08987.png)

## OCI Data Flow セッションの作成と利用

次に認証を設定します。ADS(Oracle Accelerated Data Science) SDKを使って Data Flow のAPIを呼び出す際の認証タイプを設定します。今回はリソース・プリンシパルによる認証にします（前述「準備」のところでリソース・プリンシパルによる認証に必要な設定を行いました）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/c7a9d9ae-fd4d-36fa-8dc1-94380eec9cbf.png)

OCI Data Flow との通信には [SparkMagic](https://github.com/jupyter-incubator/sparkmagic) を利用するので、SparkMagic拡張をロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/7ef0ffb9-c1b7-9d23-a208-f79b8f854bfd.png)

セッションの作成は `%create_session` コマンドで行います。
渡すパラメータは以下のような Json です。

```json
{
    "compartmentId": "<compartment_ocid>",
    "displayName": "<session_name>",
    "language": "PYTHON",
    "sparkVersion": "3.2.1",
    "driverShape": "VM.Standard.E3.Flex",
    "executorShape": "VM.Standard.E3.Flex",
    "driverShapeConfig":{"ocpus":1,"memoryInGBs":16},
    "executorShapeConfig":{"ocpus":1,"memoryInGBs":16},
    "numExecutors": 1,
    "type": "SESSION",
    "logsBucketUri": "<oci://bucket@namespace/>",
}
```
では、実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/68ade707-b140-1fb2-f0d9-0aa4ab84551d.png)

Data Flow 側で確認すると、新しい「実行」が作成され「進行中」のステータスになっていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/a168488d-46dc-9167-2bcb-d04dccba293d.png)

これで、Notebook から Data Flow の Spark セッションが利用可能となりました。Notebook からは spark, sc の変数が利用可能です。

試しに、PI を計算してみましょう...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/a5e45f06-545e-f81f-e52b-6198f698ff6a.png)

セッションのデフォルトのアイドル・タイムアウト値は480分(8時間)ですが、設定変更可能です。手動で停止することもできます。

`%stop_session` で停止してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/da0bcf9a-03df-ae04-493f-1fed2b9be482.png)

Data Flow のステータスも「Stopped」になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/747312e7-dbb2-6cf3-5c37-bc0a26be2d04.png)

SparkMagic のコマンドは `%help` で確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/a368c769-4a91-9420-9e73-73b623d3eeaf.png)

(おわり)

## 参考

ブログ：[OCI Data Flowサービス内のJupyter notebooksへのアクセス](https://blogs.oracle.com/post/ja-jupyter-notebook-within-oci-data-flow)
ドキュメント：[データ・フローとデータ・サイエンスの統合](https://docs.oracle.com/ja-jp/iaas/data-flow/using/data-flow-studio.htm)
サンプル Notebook：[pyspark-data_flow_studio-introduction](https://github.com/oracle-samples/oci-data-science-ai-samples/blob/master/notebook_examples/pyspark-data_flow_studio-introduction.ipynb)