この記事は インフォマティカ Advent Calendar 2022 Day 6 の記事として書かれています。
はじめに
CDI(Cloud Data Integration)には幾つかタスクが用意されています。よく耳にするのは、マッピングタスク、データ転送タスク、データ統合タスクなのですが、動的マッピングタスクというアセットのメンテナンス効率という観点でお勧めなタスクが存在します。この記事を記述していた時点では、残念ながら日本語の動的マッピングタスクで検索してもHitしませんが、英語のDynamic Mapping Taskだと幾つかコンテンツがHitする状況でした。
こちらの記事を見ていただくと動的マッピングタスクイメージが湧きやすいと思います。
要はパラメータ化されたマッピングからマッピングタスクをN個作成するのではなく、パラメータ化されたマッピングから動的マッピングタスクを1個だけ作成すればパラメータに設定した値に応じてN個のマッピングが動的に作成/実行されるんです。
早速、先日のインフォマティカ Advent Calendar 2022 Day 2 の環境を流用して動的マッピングタスクを作ってみましょう。ソースはOracle Cloud Object Storage、ターゲットはOracle Autonomous Data Warehouseです。
マッピングの作成
1万件の個人情報のダミーデータが入ったCSVファイルを4個用意しました。このデータは1年毎に分かれており1999年から2002年までのファイルが存在する事とします。
今回はルーターというパーツを使って血液型別にそれぞれのテーブル(例:A型はA型テーブル、O型はO型テーブル)にデータをロードするという単純なマッピングを作ってみました。
今回はソースから読み込むデータオブジェクトだけをパラメータ化してみます。このソースファイル名を動的マッピングタスク実行時に使う情報として指定する必要があります。
ソースのデータオブジェクトのパラメータ化ですが、まずはソースタイプでパラメータを選択します。次にパラメータでは新しいパラメータボタンをクリックして名前にパラメータ名だけを入力してOKボタンををクリックするだけでOKです。
動的マッピングタスクの作成
先ほど作成したマッピングのプロジェクト/フォルダでメニューバーから新規をクリックして、動的マッピングタスクを選択して作成ボタンをクリックします。
Step1 : 全般
適切な名前を入力し、適切なランタイム環境を選択します。そして、マッピングでは選択ボタンをクリックして、表示されたリストから先ほど作成したマッピングを選択します
Step2 : パラメータ
ここで各パラメータに対してパラメータスコープをLOVから選択します。デフォルトを選択してデフォルトの値を設定するとStep3 : ジョブでその値が適用されます(※上書き指定可能)。ローカルを選択した場合はStep3 : ジョブで値を指定します。今回はローカルを指定します。
Step3 : ジョブ
ここが動的マッピングタスク作成での一番重要なステップです。初期状態ではなにも存在しませんので、右側のプラスアイコンの新規追加ボタンをクリックして、最低1つのジョブと最低1つのグループを作成します。
ジョブで新規追加ボタンをクリックすると下記の通り自動的にジョブ名が付与されて(※ジョブ名は変更可能)2行がジョブリストに追加されます。上段の行ではグループ名を指定して、下段の行ではソースからファイルを選択します。
今回は事前に20世紀、21世紀に分けてジョブ実行したいので、グループ_20cとグループ21cの二つを用意し、ジョブ_5はグループ21cに振り分けることにします。
次にオブジェクトを選択フィールドの右端をクリックすると、ソースオブジェクトのパラメータであるSOURCEに対して設定するファイルを指定するウィンドウが開きますので、ここでファイルを選択してOKボタンをクリックします。
ファイルを選択した後は右端の歯車アイコンをクリックして設定を確認しましょう。
形式オプションのデフォルトがNoneになっていたので、Delimitedに変更します。
形式オプションの各値が問題ないことを確認してOKボタンをクリックします。
次にグループの設定です。グループの作成では特にウィンドウは開かずグループリストに1行追加されるのみです。先ほどのジョブ名と同様にグループ名に適正な名前を直接設定できます。
ここで重要なのはグループはグルーピングしたジョブを実行する順序を制御しているという事実です。この例では、グループ_20cの処理が完了してから、グループ21_cの処理が開始されます。グループの順序の入れ替えは右端にある矢印アイコンで行います。
Step4 : ランタイムオプション
ここでは既存スケジュールとの関連付けの有無とタスクの実行結果の応じたメールでの通知について設定を行います。今回はテストのため何も変更せず、保存ボタンをクリックして作成を終了します。
無事に動的マッピングタスクが作成完了しました。(※実際にはジョブ_5の作成はキャンセルしておりジョブ_4までしか作成していません。)
作成した動的マッピングタスクの確認
さぁ、先ほど作成した動的マッピングタスクを眺めてみましょう。パラメータ化したソースオブジェクトには4つの異なるCSVファイルが指定されていることが確認できます。そして、西暦に応じて世紀別にグループ化されていることも確認できます。
実行順序はまず20世紀を処理してから21世紀を処理するという順序になっていますので、グループ_20Cのジョブ_1とジョブ_3の処理が完了次第、グループ_21Cのジョブ_2とジョブ_4の処理が開始されます。
では実行してみましょう!
実行結果
まず、2つのタスクが処理されていることが確認できます。
インスタンス名の動的マッピングタスクをクリックをすると詳細が確認できますが、グループ_20Cのジョブ_1とジョブ3から実行されていることがわかります。グループ内での実行順序は順不同のようです。
と言っている間に、処理が進んで無事に動的マッピングタスクが正常終了しました。
ルーターでの振り分けもうまく動いてくれたようです。
おわりに
グループには複数のジョブを含むことができますが、セキュアエージェントで同時に実行できるジョブ数には上限があります。maxDTMProcessesの値より大きいジョブ数を実行すると結果的にジョブ開始後の待ち時間が増える事になりますので、IPU消費の観点では同時実行数は要チューニングです。
この記事が公開され後は、日本語の動的マッピングタスクで検索すると1件Hitするようになるはずです。私のスキルレベルと時間の制約でパラメータ化したのは1つだけだったのですが、もっとパラメータ化の使いどころがあるはずと信じています。