
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処理します。

メリット
-
✅ 同じデータを重複処理しない
-
✅ S3 のアクセスコストを削減
-
✅ Glue 実行時間の短縮
Bookmarkのモード
| モード名 | 説明 |
|---|---|
job-bookmark-enable |
前回以降の差分データのみ処理 |
job-bookmark-disable |
デフォルト設定。毎回全データを処理(Bookmarkを無視) |
job-bookmark-pause |
Bookmark情報は保持するが、今回の実行では利用しない |
実装してみた
ここからは、実際に AWS Glue Job Bookmark を使ってみた手順を紹介します。
Step 1:S3にデータを格納
S3 に CSV ファイルを格納します。
パーティション設計のため、S3 プレフィックスを「年/月/日」の形式にしています。

Step 2:Glueジョブの設定
AWS Glue Studio の「Job details」内にある Job bookmark 設定を「Enable」に変更します。

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

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

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が無効化される
(例:DropFieldsやMapを多用する場合) -
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研修も実施しています。
