Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】AWS Glue Job Bookmarks Explained: Build Incremental ETL Pipelines with PySpark

2026年10月26日に「Dev.to」が公開したITニュース「AWS Glue Job Bookmarks Explained: Build Incremental ETL Pipelines with PySpark」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

AWS Glue Job Bookmarksは、Glueジョブが以前処理したデータを記録し、新着・更新データのみを対象とする増分処理を可能にする。これにより、毎回全データを読み込む無駄を省き、ETL処理の時間とコストを削減できる。ジョブ設定で有効化し、PySparkスクリプトで状態を初期化・コミットして利用する。

ITニュース解説

データ処理の世界では、日々膨大な量のデータが生成され、これを分析可能な形に整えることが非常に重要になる。この「データを抽出(Extract)し、必要な形に変換(Transform)し、最終的な保存先(Load)に格納する」一連の作業は、頭文字をとってETLと呼ばれる。そして、このETLパイプラインをクラウド上で効率的に構築・実行するためのサービスの一つが、Amazon Web Services(AWS)が提供するAWS Glueだ。AWS Glueは、データカタログの管理、サーバーレスなETLジョブの実行、データ品質の監視など、データ統合に関する様々な機能を提供する。

毎日何千、何万という新しい販売記録や顧客取引データが生成されるような状況を想像してみてほしい。もし、データ処理パイプラインが毎回過去のすべてのファイルを読み込み、処理し直していたら、どうなるだろうか。処理にかかる時間とコストは膨大になり、システムの負担も増大する一方だ。このような無駄な繰り返し作業を避けるために、「インクリメンタル(増分)データ処理」という考え方が重要になる。これは、既に処理済みのデータは無視し、新たに到着したデータや変更されたデータのみを効率的に処理する手法である。

AWS Glue Job Bookmarksは、まさにこのインクリメンタルETLをAWS Glueジョブで実現するための強力な機能だ。Job Bookmarksは、サポートされているETLジョブが「どのソースデータが既に処理されたか」を記憶するのを助ける。ジョブが正常に実行され、そのブックマーク状態が保存されると、次回の実行時には新規または変更されたソースデータだけを特定し、処理できるようになる。これにより、毎回すべてのデータを再処理するのではなく、必要なデータにのみ焦点を当てることが可能になる。例えば、Amazon S3のデータソースの場合、AWS Glueはオブジェクトの最終更新日時を利用して、どのファイルを処理する必要があるかを判断する。月曜日に10個のファイルを処理し、火曜日に5つの新しいファイルが追加された場合、Job Bookmarksが有効になっていれば、火曜日のジョブ実行では新たに到着した5つのファイルだけが処理されるのだ。

インクリメンタルETLは、日々の販売データ処理、定期的なデータレイクの更新、顧客取引パイプライン、定期的なレポート作成、ファイルベースのデータ取り込み、データウェアハウスの定期更新など、多くの場面で役立つ。しかし、Job Bookmarksはあくまで入力データの追跡を助けるものであり、最終的な出力結果から重複レコードを自動的に排除するわけではない点には注意が必要だ。重複防止のためには、別途適切な検証や出力処理ロジックをパイプラインに組み込む必要がある。

AWS Glue Job Bookmarksを実際に利用する手順は以下のようになる。まず、処理したい元のデータ(例えばCSVファイル形式の販売記録)をAmazon S3バケットに準備する。次に、AWS Glue Crawlerを使ってS3上のデータ構造を自動的に検出し、その情報をAWS Glue Data Catalogにテーブルとして登録する。このData Catalogは、データソースのメタデータ(データの場所、形式、スキーマなど)を管理するもので、AWS Glueジョブがデータにアクセスする際の「地図」のような役割を果たす。

データがData Catalogに登録されたら、AWS GlueコンソールでETLジョブを作成または編集する。このジョブの設定の中に「ジョブブックマーク」という項目があるので、これを「有効化(Enable)」に設定する。ジョブブックマークには他に「無効(Disable)」(ブックマークを使用しない)や「一時停止(Pause)」(既存のブックマーク情報は利用するが、更新はしない)といったモードもあるが、インクリメンタル処理を行いたい場合は「有効」を選択する。

次に、PySparkを使ってETLスクリプトを記述する。このスクリプトは、Data Catalogからソースデータを読み込み、必要に応じて変換を施し、最終的にParquet形式などでAmazon S3の出力バケットに書き出すものだ。スクリプトの中で特に重要なのが、job.init()とtransformation_ctx、そしてjob.commit()の三つの要素である。

job.init(args["JOB_NAME"], args)は、AWS Glueジョブを初期化し、既存のブックマーク状態を取得するメソッドだ。これにより、AWS Glueは以前の処理のどこまでが進んだのかを把握できる。もしブックマークがなければ、毎回最初からデータ処理を行うことになる。

glue_context.create_dynamic_frame.from_catalog(...)のようなデータ読み込みメソッドに指定するtransformation_ctx="orders_source"というパラメータは、データソースに安定した識別子を与える役割を持つ。AWS Glueはこの識別子を使って、ブックマーク情報を特定のデータソースと紐付けて管理するのだ。この識別子をジョブ実行のたびに変更すると、ブックマークが正しく機能しなくなる可能性があるため、一度設定したら不必要に変更しないことが重要である。

そして、ジョブが意図した処理ステップを正常に完了した後には、job.commit()メソッドを呼び出す必要がある。このメソッドは、更新されたブックマーク状態を保存する役割を果たす。この呼び出しを忘れると、ジョブの最新の処理状況が記録されず、次回の実行時に同じデータが再度処理されてしまう可能性がある。

ジョブのテストは、インクリメンタル処理が期待通りに機能するかを確認するために不可欠だ。まず、S3のソースロケーションに数個のファイルをアップロードし、ジョブを初回実行する。ジョブはそれらのファイルを読み込み、出力バケットに書き出すはずだ。次に、新しいファイルを追加でアップロードし、同じジョブをもう一度実行する。ブックマークが正しく設定されていれば、AWS Glueは新しく追加されたファイルのみを処理し、既存のデータは再読み込みしない。最後に、新しいデータを追加せずにジョブを実行してみる。この場合、ログと出力を確認すると、ジョブは既にブックマークによって追跡されているファイルを再処理する必要がないことが分かるはずだ。

AWS Glue Job Bookmarksを使う際には、いくつかの一般的な間違いにも注意が必要だ。一つは、スクリプトにブックマーク関連のコードが含まれていても、ジョブ自体の設定でブックマークが無効になっているケースだ。必ずジョブ設定を確認する必要がある。また、前述したjob.commit()の呼び出し忘れは、ブックマークの状態が保存されず、意図しない再処理を引き起こす。transformation_ctxの不適切な変更もブックマークの機能に干渉する可能性があるため、注意が必要だ。さらに、AWS Glueがサポートするデータ読み込みメソッドを使用しないと、ブックマーク追跡は自動的に行われない。通常のSpark DataFrame APIを使って直接S3を読み込むような方法では、AWS Glueのブックマーク機能は働かないのだ。

Job Bookmarksは入力データの処理状態を追跡するが、出力先データに既に書き込まれたファイルを自動的にクリーンアップするわけではない。そのため、もしジョブが再試行されたり、ブックマーク状態がリセットされたりすると、出力に重複データが発生する可能性もある。信頼性の高いパイプラインでは、このような可能性も考慮し、出力データの管理方法を検討する必要がある。

もし、過去のデータについて変換ロジックの誤りが発見されたなど、何らかの理由で過去に処理したデータを再処理する必要が生じた場合、AWS GlueではJob Bookmarksの状態をリセットまたは巻き戻すことが可能だ。ブックマークをリセットすると、ジョブは以前に処理したソースデータも再検討するようになる。ただし、ブックマークのリセットが出力された既存のデータを自動的に削除するわけではないため、再処理の前に古い出力データをどう扱うか(置き換える、削除する、別の場所に出力するなど)を慎重に決める必要がある。

AWS Glue Job Bookmarksは、新規データがS3に毎日到着する、スケジュールされたGlueジョブがトランザクションファイルを処理する、データレイクが定期的に更新される、あるいは定期的ETLジョブが変更のない入力を再読み込みするのを避けたい、といった状況で非常に有用な機能である。しかし、すべてのシナリオに適しているわけではない。もしワークフローが完全な履歴の再計算、複雑な変更データキャプチャ(CDC)ロジック、あるいはレコードレベルでの重複処理を必要とする場合は、ブックマークだけでは不十分であり、追加の処理ロジックが必要となる場合もある。

AWS Glue Job Bookmarksは、インクリメンタルETL処理をより容易に管理するための鍵となる機能だ。同じ変更のないソースファイルを繰り返し処理する代わりに、適切に設定されたジョブは以前の作業を追跡し、新しく利用可能になったデータのみを効率的に処理できる。この機能を正しく活用するためには、AWS Glueジョブでジョブブックマークを有効にすること、サポートされているGlueソースを通じてデータを読み込むこと、安定したtransformation_ctxを使用すること、job.init()でジョブを初期化すること、そしてjob.commit()で正常な処理状態を保存すること、これらのポイントを理解し、実践することが重要だ。また、ジョブのリトライ、出力の重複、およびデータの再処理の可能性についても考慮し、堅牢なデータパイプラインを構築する必要がある。これらの詳細を理解することは、信頼性の高いAWSデータパイプラインを構築する上で不可欠な知識となるだろう。

関連コンテンツ

関連IT用語

関連ITニュース