IICS CDI(Cloud Data Integration)で動的マッピングタスクを使ってみる

この記事は [インフォマティカ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/informatica) Day 6 の記事として書かれています。
### はじめに
CDI(Cloud Data Integration)には幾つかタスクが用意されています。よく耳にするのは、マッピングタスク、データ転送タスク、データ統合タスクなのですが、<b>動的マッピングタスク</b>というアセットのメンテナンス効率という観点でお勧めなタスクが存在します。この記事を記述していた時点では、残念ながら日本語の<b>動的マッピングタスク</b>で検索してもHitしませんが、英語の<b>Dynamic Mapping Task</b>だと幾つかコンテンツがHitする状況でした。

こちらの記事を見ていただくと<b>動的マッピングタスク</b>イメージが湧きやすいと思います。

https://thinketl.com/dynamic-mapping-task-in-informatica-cloud-iics/

要はパラメータ化されたマッピングからマッピングタスクをN個作成するのではなく、パラメータ化されたマッピングから<b>動的マッピングタスクを1個だけ</b>作成すればパラメータに設定した値に応じてN個のマッピングが動的に作成/実行されるんです。

早速、先日のインフォマティカ Advent Calendar 2022 [Day 2](https://qiita.com/ORA-1060/items/dc415458f5408092ee60) の環境を流用して動的マッピングタスクを作ってみましょう。ソースはOracle Cloud Object Storage、ターゲットはOracle Autonomous Data Warehouseです。
### マッピングの作成
1万件の個人情報のダミーデータが入ったCSVファイルを4個用意しました。このデータは1年毎に分かれており1999年から2002年までのファイルが存在する事とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/30e30920-1ed3-72af-0a3a-83ad49209325.png)
今回は<b>ルーター</b>というパーツを使って血液型別にそれぞれのテーブル（例：A型はA型テーブル、O型はO型テーブル）にデータをロードするという単純なマッピングを作ってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/169a1b56-9a28-e70f-fa88-d5dbeecbfca8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/3e441dae-1424-dbda-040d-e4929ebb1fad.png)
今回はソースから読み込むデータオブジェクトだけをパラメータ化してみます。<b>このソースファイル名を動的マッピングタスク実行時に使う情報として指定する必要があります。</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/9e06cac9-c093-bb16-0cf5-c4cf8664d8c8.png)
ソースのデータオブジェクトのパラメータ化ですが、まずはソースタイプで<b>パラメータ</b>を選択します。次にパラメータでは<b>新しいパラメータ</b>ボタンをクリックして<b>名前</b>にパラメータ名だけを入力して<b>OK</b>ボタンををクリックするだけでOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/f481b9e1-f991-4b94-035b-18bbcfce556c.png)
## 動的マッピングタスクの作成
先ほど作成したマッピングのプロジェクト/フォルダでメニューバーから<b>新規</b>をクリックして、<b>動的マッピングタスク</b>を選択して<b>作成</b>ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/c34f1ee4-1539-b87e-e2e8-787de56f2c0c.png)
#### Step1 : 全般
適切な名前を入力し、適切なランタイム環境を選択します。そして、マッピングでは<b>選択</b>ボタンをクリックして、表示されたリストから先ほど作成したマッピングを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/41cf7e67-e8f2-63a2-e506-46c7d12f9365.png)
#### Step2 : パラメータ
ここで各パラメータに対してパラメータスコープをLOVから選択します。デフォルトを選択してデフォルトの値を設定すると<b>Step3 : ジョブで</b>その値が適用されます（※上書き指定可能）。ローカルを選択した場合は<b>Step3 : ジョブ</b>で値を指定します。今回はローカルを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/b66d4405-8977-a92b-8735-6129379bf305.png)
#### Step3 : ジョブ
ここが動的マッピングタスク作成での一番重要なステップです。初期状態ではなにも存在しませんので、右側のプラスアイコンの<b>新規追加ボタン</b>をクリックして、最低1つのジョブと最低1つのグループを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/abec6a6c-9249-6ac7-39d9-9f3837ffb0a0.png)
ジョブで<b>新規追加</b>ボタンをクリックすると下記の通り自動的にジョブ名が付与されて（※ジョブ名は変更可能）2行がジョブリストに追加されます。上段の行ではグループ名を指定して、下段の行ではソースからファイルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/3265d522-4725-37f5-b720-c48afeb6415d.png)
今回は事前に20世紀、21世紀に分けてジョブ実行したいので、グループ_20cとグループ21cの二つを用意し、ジョブ_5はグループ21cに振り分けることにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/8123ca26-62cc-5e2a-7612-30c24b1ec09e.png)
次に<b>オブジェクトを選択</b>フィールドの右端をクリックすると、ソースオブジェクトのパラメータである<b>SOURCE</b>に対して設定するファイルを指定するウィンドウが開きますので、ここでファイルを選択して<b>OK</b>ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/10cef621-c76e-16e5-5712-ac1f657fd190.png)
ファイルを選択した後は右端の<b>歯車アイコン</b>をクリックして<b>設定</b>を確認しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/caec42fc-250e-56d1-a773-85f06a67a79f.png)
形式オプションのデフォルトが<b>None</b>になっていたので、<b>Delimited</b>に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/d8b89cfa-a385-61fb-36b3-58a4ece27bb3.png)
形式オプションの各値が問題ないことを確認して<b>OK</b>ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/36aad0a5-860c-7119-1e25-9ba8425a4011.png)

次にグループの設定です。グループの作成では特にウィンドウは開かずグループリストに1行追加されるのみです。先ほどのジョブ名と同様にグループ名に適正な名前を直接設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/41f3e109-5340-6c58-9008-ef17f17485ca.png)
ここで重要なのはグループはグルーピングしたジョブを実行する順序を制御しているという事実です。この例では、グループ_20cの処理が完了してから、グループ21_cの処理が開始されます。グループの順序の入れ替えは右端にある<b>矢印アイコン</b>で行います。
#### Step4 : ランタイムオプション
ここでは既存スケジュールとの関連付けの有無とタスクの実行結果の応じたメールでの通知について設定を行います。今回はテストのため何も変更せず、<b>保存</b>ボタンをクリックして作成を終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/e8eab43e-5ebb-baa0-48d4-356228525de2.png)
無事に<b>動的マッピングタスク</b>が作成完了しました。（※実際にはジョブ_5の作成はキャンセルしておりジョブ_4までしか作成していません。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/45d5659b-0d21-b17e-7db4-1366fec82127.png)
### 作成した動的マッピングタスクの確認
さぁ、先ほど作成した動的マッピングタスクを眺めてみましょう。パラメータ化したソースオブジェクトには4つの異なるCSVファイルが指定されていることが確認できます。そして、西暦に応じて世紀別にグループ化されていることも確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/eb831d3a-bcca-503d-5269-60402084d7f9.png)
実行順序はまず20世紀を処理してから21世紀を処理するという順序になっていますので、グループ_20Cのジョブ_1とジョブ_3の処理が完了次第、グループ_21Cのジョブ_2とジョブ_4の処理が開始されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/c74276db-6485-26f9-aae6-b08acfb3c1ec.png)
では実行してみましょう！
### 実行結果
まず、2つのタスクが処理されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/e3fd43da-dfeb-2954-f79d-7db046a3c547.png)
インスタンス名の動的マッピングタスクをクリックをすると詳細が確認できますが、グループ_20Cのジョブ_1とジョブ3から実行されていることがわかります。グループ内での実行順序は順不同のようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/cd8b00da-25fe-c316-a56a-78eb94a6e738.png)
と言っている間に、処理が進んで無事に動的マッピングタスクが正常終了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/887c6475-a720-acdd-2e34-d4111e8e1403.png)
ルーターでの振り分けもうまく動いてくれたようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/786891/ef6ea7ce-3a35-f310-5d0a-70eb449b8947.png)
### おわりに
グループには複数のジョブを含むことができますが、セキュアエージェントで同時に実行できるジョブ数には上限があります。maxDTMProcessesの値より大きいジョブ数を実行すると結果的にジョブ開始後の待ち時間が増える事になりますので、IPU消費の観点では同時実行数は要チューニングです。

https://docs.informatica.com/integration-cloud/cloud-data-integration/h2l/1515-secure-agent-best-practices-and-tuning-guidelines/secure-agent-best-practices-and-tuning-guidelines/tuning-the-data-integration-server/maxdtmprocesses-custom-property.html

この記事が公開され後は、日本語の<b>動的マッピングタスク</b>で検索すると1件Hitするようになるはずです。私のスキルレベルと時間の制約でパラメータ化したのは1つだけだったのですが、もっとパラメータ化の使いどころがあるはずと信じています。