zenet_logo

-株式会社ゼネット技術ブログ-

AWS Glue Job Bookmarkで重複処理を防ぐ!ETLジョブの効率化ガイド

 

AWS Glue を使って ETL 処理を自動化していると、「同じデータを何度も処理してしまう」という問題に直面することがあります。
そんなときに役立つのが Glue Job Bookmark(ジョブブックマーク) 機能です。

この記事では、Job Bookmark の仕組み・実装方法・注意点 を、実際のジョブログ例とともにわかりやすく解説します。

はじめに

ゼネットシステム事業部の方です。データレイク基盤構築案件に携わりながら、AWS Glue を使った ETL ジョブの設計・実装・運用を実務で経験しています。

AWS Glue はサーバーレスな ETL(Extract, Transform, Load)サービスで、S3 や RDS などに保存されたデータを変換・統合するのに非常に便利です。

ただし Glue ジョブを定期実行していると、前回処理済みのファイルまで再度読み込んでしまうケースがあります。
これを防ぐために Glue が提供しているのが「Job Bookmark(ジョブブックマーク)」です。

Job Bookmark とは

Job Bookmark とは、Glueジョブが「どのデータをいつ処理したか」を記録しておく機能です。
これにより、次回のジョブ実行時に前回以降に追加・更新されたデータだけを処理することができます。

具体的な仕組み

Glueはジョブの実行ごとにメタデータ(処理対象ファイルの情報)を内部的に保持します。

次の実行時にはそのメタデータを参照し、「新しいファイル or レコードだけ」をETL処理します。

Glue Job Bookmark動作イメージ図
メリット
  • ✅ 同じデータを重複処理しない

  • ✅ S3 のアクセスコストを削減

  • ✅ Glue 実行時間の短縮

Bookmarkのモード
モード名 説明
job-bookmark-enable 前回以降の差分データのみ処理
job-bookmark-disable デフォルト設定。毎回全データを処理(Bookmarkを無視)
job-bookmark-pause Bookmark情報は保持するが、今回の実行では利用しない

実装してみた

ここからは、実際に AWS Glue Job Bookmark を使ってみた手順を紹介します。

Step 1:S3にデータを格納

S3 に CSV ファイルを格納します。
パーティション設計のため、S3 プレフィックスを「年/月/日」の形式にしています。

S3ディレクトリ構成
Step 2:Glueジョブの設定

AWS Glue Studio の「Job details」内にある Job bookmark 設定を「Enable」に変更します。

Job details設定画面
Step 3:ジョブ実行

Glue ジョブを実行し、ステータスが「Succeeded(成功)」になったことを確認します。

ジョブ実行結果確認画面

 

出力先 S3 に Parquet ファイルが生成されていればOKです。

出力先S3確認が画面
Step 4:Bookmark動作の確認

Glue の「Runs」タブまたは CloudWatch ログから、Bookmark の動作ログを確認できます。

ジョブのログ確認画面

以下は実際のログの抜粋です。

INFO 2025-10-30T04:33:43,101 12705 com.amazonaws.services.glue.hadoop.PartitionFilesListerUsingBookmark [Thread-10] 219 After final job bookmarks filter, processing 50.00% of 2 files in partition DynamicFramePartition(com.amazonaws.services.glue.DynamicRecord@a0139eb8,s3://test-hou/Glue/CSV/,0).
INFO 2025-10-30T04:33:43,051 12655 com.amazonaws.services.glue.hadoop.PartitionFilesListerUsingBookmark [Thread-10] 201 Final job bookmarks filter FileSystemBookmarkFilter(lowTimeStampRangeBegin=1761797413051, lowTimeStampRangeEnd=1761798313051, elementsInLowRange=2, highTimeStampRangeBegin=1761797922067, highTimeStampRangeEnd=1761798822067, elementsInHighRange=2).
INFO 2025-10-30T04:33:42,992 12596 com.amazonaws.services.glue.hadoop.PartitionFilesListerUsingBookmark [ForkJoinPool-2-worker-1] 420 After initial job bookmarks filter, processing 100.00% of 2 files in partition DynamicFramePartition(com.amazonaws.services.glue.DynamicRecord@a0139eb8,s3://test-hou/Glue/CSV/,0).
INFO 2025-10-30T04:33:42,839 12443 org.apache.spark.storage.BlockManagerInfo [dispatcher-BlockManagerMaster] 60 Removed broadcast_0_piece0 on 172.34.255.142:40129 in memory (size: 40.6 KiB, free: 5.8 GiB)
INFO 2025-10-30T04:33:42,831 12435 org.apache.spark.storage.BlockManagerInfo [dispatcher-BlockManagerMaster] 60 Removed broadcast_1_piece0 on 172.34.255.142:40129 in memory (size: 40.6 KiB, free: 5.8 GiB)
INFO 2025-10-30T04:33:42,139 11743 com.amazon.ws.emr.hadoop.fs.util.ClientConfigurationFactory [Thread-10] 85 Set initial getObject socket timeout to 2000 ms.
INFO 2025-10-30T04:33:42,138 11742 com.amazonaws.services.glue.hadoop.PartitionFilesListerUsingBookmark [Thread-10] 72 Unable to create provider using constructor: DefaultAWSCredentialsProviderChain(java.net.URI, org.apache.hadoop.conf.Configuration)
INFO 2025-10-30T04:33:42,098 11702 com.amazonaws.services.glue.hadoop.PartitionFilesListerUsingBookmark [Thread-10] 465 Initial job bookmarks filter: RangeTimestampFilter(rangeBegin=1761797413051, rangeEnd=1761798313051, elementsInRange=0)
INFO 2025-10-30T04:33:42,087 11691 com.amazonaws.services.glue.hadoop.PartitionFilesListerUsingBookmark [Thread-10] 392 UnprocessedPartitionFilter(partitionCreationEpoch=0, oldPartitions=Set())
INFO 2025-10-30T04:33:42,088 11692 com.amazonaws.services.glue.hadoop.PartitionFilesListerUsingBookmark [Thread-10] 397 last job run range: low inconsistency range begin: 2025-10-30T04:10:13.051Z, job run range begin: 2025-10-30T04:25:13.051Z

ログの見方

  • After final job bookmarks filter… processing 50.00% of 2 files
    → 今回のジョブで 2 ファイル中 1 ファイルのみが処理されたことを示します。
    つまり、前回処理済みのファイルは Bookmark によりスキップ されています。

  • Final job bookmarks filter FileSystemBookmarkFilter(...)
    → Glue が保持するタイムスタンプ情報に基づき、処理対象を判定しています。

    • lowTimeStampRangeBegin / lowTimeStampRangeEnd → 前回処理済みのデータ範囲

    • elementsInLowRange → その範囲のファイル数(2 ファイル)

    • highTimeStampRangeBegin / highTimeStampRangeEnd → 今回処理対象の新規データ範囲

    • elementsInHighRange → 新規ファイル数(2 ファイル)

このログを確認することで、Bookmark が正しく差分処理しているかを現場でチェックできます。

注意点

Job Bookmarkを使用するときは、次の点に注意が必要です。

  • 入力データが一意に特定できる形式であること
     (例:S3のファイル名や更新日が異なる)

  • ソースデータを削除・リネームすると再処理が起きる場合がある

  • DynamicFrameの変換内容によってはBookmarkが無効化される
     (例:DropFieldsMap を多用する場合)

  • Glueバージョン3.0以降では挙動が安定
     できるだけ最新の Glue バージョンを利用するのがおすすめです。

Glue バージョンとサポート形式

バージョン Amazon S3 ソース形式
0.9 JSON、CSV、Apache Avro、XML
1.0 以降 JSON、CSV、Apache Avro、XML、Parquet、ORC

おわりに

AWS Glue Job Bookmark は、ETL 処理を効率化し、重複処理を防ぐ強力な機能です。
特に定期的にデータ更新ジョブを運用する場合、Bookmark を活用することで コスト削減と安定運用 が実現できます。

差分処理の自動化は、Glue を使いこなす第一歩です。ぜひ一度試してみてください。

 

なお、ゼネットでは、AWS認定資格の取得を目的としたハンズオン中心のAWS研修も実施しています。

参照資料

docs.aws.amazon.com

youtu.be