OCI Data Flowを使ってオブジェクト・ストレージからADBへデータをロードする -- Part 2

本ブログは、[オラクル・クラウドの個人シリーズ・ブログ](https://qiita.com/letian/items/10152a4fec813c1b7d98)の1つです。

# 初めに
Oracle Cloud Infrastructure（OCI）Data Flowは、[Apache Spark](https://spark.apache.org/) ™アプリケーションを実行するためのフルマネージド・サービスです。特に大規模なデータの処理に向きます。

OCIオブジェクト・ストレージ上のファイルを読み込み、Autnomous DBへのデータロード処理を例にして、OCI Data Flowでの実現方法を三回を分けて紹介したいと思います。

- [Part 1](https://qiita.com/liu-wei/items/b2408b85c8f258183047): Apache Sparkを使って、ローカル環境でPythonプログラムを実行する方法
- <strong>Part 2 (本文)</strong>: アプリケーションをOCIへデプロイし、実行する方法
- [Part 3](https://qiita.com/liu-wei/items/6a20d4b750f8610ae895): プライベート・エンドポイントを経由し、ADBへデータをロードする方法。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/6e891009-9cb2-7706-dcaf-8598996e3fcf.png", width="500">

__ステップ__
- [1. 事前準備](#1-事前準備)
  - [1-1. 関連OCIリソースの作成](#1-1-関連ociリソースの作成)
  - [1-2. ローカル環境での動作確認](#1-2-ローカル環境での動作確認)
  - [1-3. Docker のインストールと起動](#1-3-docker-のインストールと起動)
  - [1-4. アーカイブ(archive.zip)の作成](#1-4-アーカイブarchivezipの作成)
- [2. OCIでアプリケーションの作成と実行](#2-ociでアプリケーションの作成と実行)
  - [2-1. アプリケーションの作成](#2-1-アプリケーションの作成)
  - [2-2. アプリケーションの実行](#2-2-アプリケーションの実行)

# 1. 事前準備
## 1-1. 関連OCIリソースの作成
|リソース・タイプ|名前|コメント|
|:--|:--|:--|
|コンパートメント|PoC|検証用コンパートメント|
|バケット|dataflow-logs|データ・ロード・ログの格納先|
|グループ|Data_Flow_Grp|検証用ユーザーを入れる|
|ポリシー|Data_Flow_Policy||
|Autnomous DB|ADW_Data_Flow|接続タイプ：パブリック・アクセス|
|Computeインスタンス|Linux8-Java11-Data-Flow|用途:<br>1.ローカル環境での動作確認<br>2. アーカイブファイルの作成|

ポリシーのステートメント：
```
Allow group Data_Flow_Grp to read buckets in compartment PoC
Allow group Data_Flow_Grp to manage dataflow-family in compartment PoC
Allow group Data_Flow_Grp to manage objects in compartment PoC where ALL {target.bucket.name='dataflow-logs', any {request.permission='OBJECT_CREATE', request.permission='OBJECT_INSPECT'}}
```

## 1-2. ローカル環境での動作確認
アプリケーションをOCIへデプロイする前、ローカル環境での動作確認を強く推奨します。詳細は、[前回（Part 1）の記事](https://qiita.com/liu-wei/items/b2408b85c8f258183047)をご参照ください。

## 1-3. Docker のインストールと起動
__Docker のインストール__
```bash
sudo dnf install -y dnf-utils zip unzip
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce --nobest
```

__Docker の起動__
```bash
[opc@linux8-java11-data-flow ]$ sudo systemctl start docker
[opc@linux8-java11-data-flow ]$ sudo systemctl enable docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service ¨ /usr/lib/systemd/system/docker.service.
[opc@linux8-java11-data-flow ]$
```

## 1-4. アーカイブ(archive.zip)の作成
パッケージャ・ツール・イメージをダウンロードします。
```
sudo docker pull phx.ocir.io/oracle/dataflow/dependency-packager:latest
```

一時フォルダ(`/tmp/shared`)を用意してください。`requirements.txt`（1行のみ）を作成し、関連のJARファイルと共にその下に保存します。
```bash
mkdir /tmp/shared
chmod 777 /tmp/shared
echo oci > /tmp/shared/requirements.txt
cp /home/opc/download/ojdbc/ojdbc11.jar  /tmp/shared
cp /home/opc/download/ojdbc/ucp11.jar /tmp/shared
cp /home/opc/download/ojdbc/oraclepki.jar /tmp/shared
cp /home/opc/download/hdfs/third-party/lib/bcpkix-jdk15on-1.70.jar /tmp/shared
cp /home/opc/download/hdfs/third-party/lib/bcprov-jdk15on-1.70.jar /tmp/shared
```

dockerコマンドでアーカイブを作成します。
コマンド：`sudo docker run --rm -v $(pwd):/opt/dataflow --pull always -it phx.ocir.io/oracle/dataflow/dependency-packager:latest -p 3.8`
```bash
[opc@linux8-java11-data-flow ~]$ cd /tmp/shared
[opc@linux8-java11-data-flow shared]$ ll
total 15452
-rw-r--r--. 1 opc opc  963713 Mar 11 05:01 bcpkix-jdk15on-1.70.jar
-rw-r--r--. 1 opc opc 5867298 Mar 11 05:01 bcprov-jdk15on-1.70.jar
-rw-r--r--. 1 opc opc 6971601 May  7 11:34 ojdbc11.jar
-rw-r--r--. 1 opc opc  490830 May  7 13:02 oraclepki.jar
-rw-rw-r--. 1 opc opc       4 May  7 11:37 requirements.txt
-rw-r--r--. 1 opc opc 1513648 Mar 29 08:57 ucp11.jar
[opc@linux8-java11-data-flow shared]$ sudo docker run --rm -v $(pwd):/opt/dataflow --pull always -it phx.ocir.io/oracle/dataflow/dependency-packager:latest -p 3.8
<中略>
The following jar files will be included in the archive.zip:
/opt/dataflow/bcpkix-jdk15on-1.70.jar
/opt/dataflow/bcprov-jdk15on-1.70.jar
/opt/dataflow/ojdbc11.jar
/opt/dataflow/ucp11.jar
/opt/dataflow/oraclepki.jar
Are you sure you want to put all these jar files(5) into archive.zip? [Y/n]y
<中略>
archive.zip is generated!
[opc@linux8-java11-data-flow shared]$
```

`archive.zip`と`version.txt`の２つファイルが作成されました。`archive.zip`をOCIオブジェクト・ストレージにアップロードしてください。

OCI-CLIは既にインストールと設定済であれば、次のように実行するとOKです。
コマンド例：`oci os object put -bn MyBucket --file archive.zip`
# 2. OCIでアプリケーションの作成と実行
## 2-1. アプリケーションの作成
OCIメニュー → Analytics & AI  → Data Lake → Data Flow → Create application
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/b9e159ab-2702-1ab7-ba16-19ea51be5707.png)

アプリケーション名を入力し、Sparkバージョンとシェイプを選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/73e1a442-cea5-cff4-052c-b18da9442140.png", width="500">

プログラムのタイプ(Python)と置き場所を指定してください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/d8679da0-04f9-bcfc-fcae-fd56e36e9cf6.png", width="500">

アーカイブファイルとログの置き場所を指定し、作成ボタンをクリックします。
（`dataflow-logs`というバケットを事前に作成しておく）。

アプリケーション・ログ：`oci://<bucket-name>@<Object_Storage_Namespace>`
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/97b47e0c-a6b4-406f-4648-b50497fa5024.png", width="500">

## 2-2. アプリケーションの実行
アプリケーション詳細画面に、Run (実行)をクリックして、実行を開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/e29ded4f-1e11-5e9c-1976-0db15760b7db.png)
実行する前、シェイプの指定ができますが、この例ではデフォルトのままで進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/ccf2cd74-73fe-289a-4da1-521d74f8d9c0.png)

ステータス変更：
Accepted (受入れ済)　→ In progress (進行中)　→  Succeed (成功)、或いは Failed (失敗)

この例では、<strong>受入れ済から進行中まで</strong>約10分間かかり、<strong>進行中から成功完了まで</strong>の実行時間(Duration)は、2分21秒でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/884c7b81-3985-5947-40ca-7100f0967c70.png)

実行成功後、テーブルの中身を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/f3eb3054-af4d-67c7-83ab-e44fe53a6d50.png)

パブリック・アクセスのADBを例にして紹介しました。次回は、<strong>プライベート・エンドポイント</strong>を経由し、プライベート・サブネットに格納されるADBへロードする方法を紹介したいと思います。

以上です。

----
__関連記事__
[オラクル・クラウドの個人シリーズ・ブログ](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98)
[OCI Data Flowを使ってオブジェクト・ストレージからADBへデータをロードする -- Part 1](https://qiita.com/liu-wei/items/b2408b85c8f258183047)
[OCI Data Flowを使ってオブジェクト・ストレージからADBへデータをロードする -- Part 3](https://qiita.com/liu-wei/items/6a20d4b750f8610ae895)

----
__OCI データ・フロー・ドキュメント__
[製品サイト](https://www.oracle.com/jp/big-data/data-flow/)
[オフィシャル・ドキュメント](https://docs.public.oneportal.content.oci.oraclecloud.com/ja-jp/iaas/data-flow/using/home.htm)
[データ・フロー・チュートリアル](https://docs.oracle.com/ja-jp/iaas/data-flow/data-flow-tutorial/dfs_tut_front.htm)
[データ・フロー・アプリケーションへのサードパーティ・ライブラリの追加](https://docs.oracle.com/ja-jp/iaas/data-flow/using/third-party-libraries.htm)