バッチジョブとは?データをチャンク単位で処理する仕組みを解説
バッチジョブは、レコードを到着するたびに継続的に処理するのではなく、有界なデータの集合を通常はscheduleに従って一度にまとめて処理します。
バッチ処理は、データを処理する最も古く、今も最も一般的な方法です。バッチジョブは、定義された作業のかたまり - 昨日の全トランザクション、今の1時間のログ - を集めて1回のrunで処理します。レイテンシと引き換えにシンプルさとthroughputを得ます。
バッチジョブとは何か
バッチジョブは、有限で有界なdatasetに対して実行され完了するプロセスです。通常scheduleに従って(夜間、毎時)実行され、前回のrun以降に蓄積されたデータを処理します。例として、夜間の集計、日次レポートのbuild、週次のモデル再学習などがあります。
バッチ対streaming
バッチはより高いレイテンシでデータをチャンク単位で処理しますが、ロジックはシンプルで再処理が容易です。streamingは低レイテンシでイベントを継続的に処理しますが、状態の扱いはより複雑です。多くのプラットフォームは、重い履歴処理にバッチを、新鮮なデータにstreamingを使います。
冪等性とretry
バッチジョブは失敗時やbackfillのために再実行されるため、冪等であるべきです。同じjobを2回実行しても、重複ではなく同じ結果が得られます。これによりretryが安全になり、数時間分のデータを処理するjobが終盤で一時的なエラーに遭遇したときに重要になります。
CIでのバッチジョブ
バッチジョブは、scheduleされたCIのworkflowとして自然に実行されます。CIは配信前にサンプルのかたまりでjobのロジックもテストします。
on:
schedule:
- cron: "0 2 * * *" # run nightly at 02:00
jobs:
nightly:
steps:
- run: python batch_job.py --date $(date -I)Latchkeyノート
バッチジョブは、1回のrunで大規模なdatasetを処理するため、長時間かつリソースを多く消費することがあります。Latchkeyでは、それらをより大きなrunnerにルーティングし、入力データと依存関係をcacheし、auto-retryに頼ることで、長いjobの終盤での一時的な失敗が最初からの完全な再実行を強いることがなくなります。
重要なポイント
- バッチジョブは、有界なデータのかたまりを通常scheduleに従って一度にまとめて処理する。
- streamingと比べて、レイテンシと引き換えにシンプルさとthroughputを得る。
- バッチジョブは、retryとbackfillが安全になるよう冪等であるべきで、scheduleされたCIのworkflowとしてよく機能する。