前回はBatch Jobについて、特徴をさらっとお伝えしました。今回は実際にフローに組み込んでどういう動作をするのか検証していきましょう。
今回使うコンポーネント
コンポーネント | アイコン・領域 | 用途 |
---|---|---|
Batch Job | バッチ処理を実行する領域です | |
Batch Step | バッチ処理内で1レコード単位で実行する領域となります | |
Batch Aggregator | Batch Stepで処理されたレコードをバッチサイズ単位で集約し一括して実行する領域となります |
Batch Jobを組み込んだフロー
Batch Jobを組み込んだフローは以下のような形になります。Batch Jobの中にBatch Stepさらにその中にBatch Aggregatorを組み込む形で構成されます。1つずつ設定の仕方を見ていきましょう。
①Batch Job前のPayloadには配列型のデータが入るようにします。Queryから取得した結果など、比較的大きめのサイズの配列が設定されるようにします。今回は47都道府県リストを渡すことにします。本来はBatch Jobで扱うレコード量はもっと多いのですが今回は検証のためわかりやすい形にしています。
%dw 2.0
output application/json
---
[
"北海道",
"青森",
"岩手",
・・・(中略)・・・
"宮崎",
"鹿児島",
"沖縄"
]
②Batch Jobを設置し、設定内容を記載します。全てを設定する必要はありませんが、Batch Block SizeとMax Failed Recordsについてはバッチ処理の性能にも関わるため最適な値を設定しましょう。
設定内容 | 説明 |
---|---|
Max Failed Records | 処理に失敗したレコード数の上限を設定します。100を設定した場合は101件目のエラーがあった際に警告表示されます。 |
Batch Block Size | 1ブロック内で処理されるレコード数。デフォルト値は100で設定されます。 |
Max concurrency | 最大同時実行数を指定します。デフォルトはJVMで検出されるコア数の2倍とのことなので、特に意識することがなければデフォルト値でOKです。 |
③1レコードずつ処理される内容をBatch Step内に記載します。今回は簡潔にpayload値を出力します。また、Batch Stepには受け入れ条件や受け入れポリシーなども設定しますが、今回は受け入れ条件なしのデフォルトで動かします。
④Batch AggregatorにはBatch Stepで集約されたレコードのAggregatorサイズを指定するとともに、集約されたレコードの一括処理を領域内に記載します。Aggregator Sizeを2に設定します。
実行結果
上記のフローを実行させたときのログは以下のように記載されます(見やすくするためにログの余分なところは削った形で記載しています。)。
LoggerMessageProcessor: "岩手"
LoggerMessageProcessor: "北海道"
LoggerMessageProcessor: "秋田"
LoggerMessageProcessor: "福島"
LoggerMessageProcessor: "山形"
LoggerMessageProcessor: "宮城"
LoggerMessageProcessor: "埼玉"
LoggerMessageProcessor: [
"\"北海道\"",
"\"岩手\""
]
LoggerMessageProcessor: [
"\"秋田\"",
"\"福島\""
]
LoggerMessageProcessor: "東京"
LoggerMessageProcessor: "栃木"
LoggerMessageProcessor: [
"\"東京\"",
"\"宮城\""
]
LoggerMessageProcessor: [
"\"山形\"",
"\"埼玉\""
]
LoggerMessageProcessor: "群馬"
LoggerMessageProcessor: "新潟"
LoggerMessageProcessor: [
"\"栃木\"",
"\"群馬\""
]
...(以下略)
このようにログの出方から、Batch Step内が順不同で並列実行され、Batch Aggregatorも同様に順不同で2レコードまとまった形で処理されていることがわかります。
具体的に見てみると、ログの出方から時系列的には北海道→岩手→秋田→福島→山形→宮城→…という形でBatch Stepが実行されているのですが、Batch Aggregatorでは(北海道, 岩手)→(秋田, 福島)→(東京, 宮城)→…といった形でBatch Stepと若干順番がずれているため、単純にBatch Stepの順番通りに集約されるという訳ではないようです。Batch Stepの終了時間などもおそらく加味されており、順番は保証されないと思っておいた方がいいでしょう。
このようにBatch Jobは大量データを扱う上では大変便利な機能ですが、順番やACID特性については保証されないため、扱い方を知った上で使うようにしましょう。
コメント