はじめに
今回は、Talendのジョブ分割についてです。
当たり前と言えば当たり前ですが、Talendもジョブを分割することができます。
という訳で、再利用しそうだ、とか、1ジョブが大きくなりすぎたな、という場合は、ジョブを分割することをオススメします。
分割したジョブを呼び出すコンポーネント
作成済みのジョブを呼び出すには、tRunJobというコンポーネントを使用します。
このコンポーネントのパラメータに、呼び出すジョブを指定するだけです。
子ジョブへの値の受渡と返却
こんなコンポーネントがありますよ、の紹介だけでは仕方がないので、実際に子ジョブを作って親ジョブから値を渡す&返却値を受け取る、という所までジョブを組んで見ていこうと思います。
呼び出される側の子ジョブを作る
あまりに意味がないジョブを作っても虚しいので、ジョブ分割する意味がありそうな感じのジョブにしてみました。
親ジョブからDB名を受け取り、そのDB内に存在する全てのテーブルの件数をカウントして、親ジョブに結果を返却する、というジョブを作りました。下記のような感じです。
また、親ジョブからの入力パラメータを受け取るために、contextを定義しておきます。
子ジョブ側でcontext定義しておくと、親ジョブがtRunJobで値を渡せるようになります。
それでは、簡単にジョブの説明をします。
接続(tMySQLConnection)
今回は、複数回テーブル参照しますので、最初にConnectionでDB接続してしまいます。MySQLへの接続です。
パラメータは…接続設定を与えます。
Database項目は、親ジョブから受け取ったDB名をセットして繋ぎ先を変えるようにしてあります。
Table一覧取得(tMySQLInput)
一応今回の子ジョブの仕様として、DB内の全テーブルの件数をカウントする、ということになっているので、DB内のテーブル一覧を取得するためのSQLを発行しています。
rowをiterateに(tFlowToIterate)
あまり見かけないコンポーネントかもしれませんが、tFlowToIterateというコンポーネントです。
row接続を入力として受け取り、Iterate接続に変換します。
今回の様に、rowを受けて、そのrow分サブジョブをループさせたい場合等の仕切りなおしとして使用することが多いですね。
コンポーネントの設定はシンプルです。
チェックボックスが1つだけあります。これはデフォルトでチェックが付いていて、基本変更する必要は無いと思います。
で、このコンポーネントは何なのかというと、接続されたrowを、以降のサブジョブの中でglobal変数として使用することができます。
具体的にどうやってアクセスするのか、というと、
[java] globalMap.get("rowX.変数名")[/java]
のように使います。
globalMapとは、Talendのジョブが必ず持っているグローバルなハッシュ(マップ)オブジェクトですね。
1Tableごと件数を取得(tMySQLInput)
次に、Iterate接続されたこのコンポーネントで、1テーブルごとの件数をカウントするSQLを発行します。
tMySQLInputコンポーネントは、rowなどの入力リンクにて接続することはできないので、Iterateでループさせてるわけですね。
発行するSQL文の中で、tFlowToIterateでglobalMapに格納されたテーブル名を文字連結して、1テーブルごとにレコードの件数をカウントします。
画面コピーが見切れていますが、from以降は、(String)globalMap.get(“row2.table_name”)を文字連結しています。
返却値を溜める(tBufferOutput)
最後に、tBufferOutputコンポーネントに接続しています。
このコンポーネントが、親ジョブにrowデータを返却するために使用できます。
子ジョブの終わりで使用すれば、子ジョブ終了時にtRunJobからRow接続の出力を繋ぐことで返却値をそのまま使用できます。
呼び出す側の親ジョブを作る
子ジョブが完成しましたので、親ジョブから呼び出します。こんな感じにしました。
Create Loop(tJavaFlex)
今回の仕様では、DB分ループさせて、子ジョブでDB名を受け取って…という流れですので、DB分ループさせるためにtJavaFlexコンポーネントを使用しています。
DB名を固定値ですが、定義して、その分ループさせています。
ループ内では、globalMapにCURRENT_DBという名称で値を保存しています。
ちなみに、tJavaFlexについては下記の記事でも説明しています。
Run Child Job(tRunJob)
ジョブを呼び出します。
Jobパラメータを先ほどの子ジョブに設定、Context Paramに「+」で1行追加し、子ジョブで定義したdbNameパラメータに値を渡します。
セットしている値は、tJavaFlexでglobalMapにセットした値です。
ここで、1つずつ値を渡すのが面倒、というのであれば、Transmit whole contextパラメータにチェックを付与すれば、子ジョブに同名のコンテキストが自動で渡るようになります。
最後に、子ジョブからの値を表示するためのtLogRowをtRunJobからRow接続してジョブ作成完了です。
実行結果
こんな感じで、DBごとの全テーブルの結果が子ジョブから返却され、レコードが表示されています。
作成済みのジョブは、tRunJobで呼べて、contextを介して入力パラメータを渡す、子ジョブはtBufferOutputを使用して値を返却できる、という感じです。はい。
今回は以上です。