【第1回】AWS × Apache Iceberg入門:データレイクの課題とIcebergの全体像を整理してみた
投稿者:池田
目次
はじめに
こんにちは!NTTインテグレーションの池田です。
突然ですが、AWSで分析基盤を構築する際、S3を中心としたデータレイクは柔軟で拡張しやすい選択肢です。一方で、実際に運用していくと、単にS3にParquetなどのファイルを置くだけでは、更新・削除、履歴管理、スキーマ変更など様々な観点で課題に直面することもあります。
そうした中で、データ基盤の有力な選択肢として挙げられるのが Apache Iceberg です。S3上のデータを単なるファイルの集まりではなく、テーブルとして管理しやすくする仕組みです。
ただ、正直なところ、現時点で自分自身がIcebergにとても詳しいわけではありません。今回プロジェクトで導入を検討しているということもあり、このブログを書きながら理解を整理し、少しずつ勉強していきたいというのが率直なところです。
本記事では、主に以下の3つのポイントについて整理します。
- Apache Icebergは何を解決する技術なのか
- 従来型のS3データレイクと比べて何が変わるのか
- AWSでどのように活用できそうか
なお、今回は第1回として概要の整理が中心で、第2回以降では実際にIcebergを触ってみる流れを予定しています。
Apache Icebergとは何か
Apache Icebergは、S3のようなオブジェクトストレージ上に保存されたデータを、分析しやすい形で管理するための「オープンテーブルフォーマット」です。
少しわかりやすく言うと、「S3にバラバラに置かれているファイル群を、あたかも1つのデータベースのテーブルのように扱えるようにする、共通の仕様(ルール)」のことです。特定のツールに縛られず、AthenaやSparkなど様々なクエリエンジンから共通のテーブルとして読み書きできるのが特徴です。
ここで重要なのは、Icebergが単なるファイル形式(ParquetやORCなど)ではないという点です。Icebergはファイルそのものではなく、複数のファイルを束ねて「テーブルとしての整合性、履歴、スキーマの変化」まで管理するための仕組みを提供します。
Icebergは、次のような考え方を持っています。
- テーブルの状態をメタデータとして管理する
- どのデータファイルがどの時点のテーブルを構成しているかを追跡できる
- データ更新や削除を、ファイルの直接操作ではなくテーブル操作として扱える
その仕組みを超ざっくり視覚的に表してみたのが以下の図です。
※細かいファイル形式などはいったん無視しています

図のように、Icebergは大きく分けて「カタログ」「メタデータ層」「データ層」の3つの階層で構成されています。
- Iceberg Catalog(カタログ): テーブルの「最新のメタデータがどこにあるか」を指し示す入り口(ポインタ)です。
- Metadata Layer(メタデータ層): テーブルのスキーマや履歴(スナップショット)を階層状に管理する中核部分です。ここが「どのデータファイルが現在のテーブルを構成しているか」を正確に追跡します。
- Data Layer(データ層): 実際にS3などに保存されている実データ(Parquetファイルなど)です。
つまりIcebergは、この強力な「メタデータ層」を挟むことで、オブジェクトストレージ上の単なるデータを、よりデータベース的に扱いやすくする仕組みと捉えるとイメージしやすいです。
Apache Icebergの主なメリット
1. レコード単位の更新・削除・MERGEが扱いやすい
従来型のS3データレイクでは、データの更新や削除を「レコード(行)単位」で行うのが非常に苦手でした。なぜなら、1行だけデータを書き換えたくても、その行が含まれる「ファイル全体(あるいはパーティション全体)」を丸ごと作り直して差し替える必要があったからです。処理も運用も重くなりがちでした。
Icebergでは、こうした「ファイル単位での修正・再作成」の苦労がなくなり、レコード単位での更新・削除・MERGEが扱いやすくなります。
例えば、次のようなケースでは特に相性がよさそうです。
- 日次で差分更新が入るマスタデータ
- 訂正や論理削除が発生する業務データ
- 再処理により過去データを差し替えたいケース
2. ACIDトランザクションによる安全なデータ操作
従来のS3データレイクでは、データの書き込み(更新)中に別の人がデータの読み込みを行うと、書き込み途中の「中途半端なデータ」が見えてしまったり、エラーになったりするリスクがありました。
IcebergはACIDトランザクションをサポートしているため、データの変更が「完全に成功して反映される」か「失敗して全く反映されない」かのどちらかになります。
これにより、裏側でバッチ処理がデータをガリガリ更新している最中であっても、Athenaなどでクエリを叩くユーザーは「更新前の安全な状態」のデータを参照し続けることができます。そして更新が完了した瞬間に、新しいデータへとスパッと切り替わります。複数の処理やユーザーが同時にアクセスする分析基盤において、データ不整合の心配をしなくてよいのは非常に大きなメリットです。
3. タイムトラベルができる
Icebergの大きな特徴のひとつが、過去時点のテーブル状態を参照できることです。これにより、特定時点のデータを再現したい場合や、更新前後の差分を確認したい場合に役立ちます。
例えば、以下のような用途が考えられます。
- 障害発生時の調査
- データ更新ミス時の原因確認
- 特定日時時点のレポート再現
- 監査や検証用途
従来型のデータレイクでは「その時点のファイル一式をどう保持していたか」に依存しやすいですが、Icebergではテーブルの履歴として扱いやすいのが大きなポイントです。
4. スキーマ進化に対応しやすい
分析基盤では、一度作ったテーブル定義がずっと変わらないとは限りません。実際には、要件追加に応じてカラムが増えたり、定義を見直したりすることがよくあります。
従来型のデータレイクでは、スキーマ変更時に既存データとの整合やクエリエンジン側の解釈で悩まされることがあります。Icebergは、こうしたスキーマの進化を前提にした設計になっており、変更に強いテーブル運用をしやすくします。
5. パーティション管理や運用負荷を軽減しやすい
従来のHiveスタイルの運用では、パーティション設計や追加・修復の管理が負担になりがちでした。Icebergでは、パーティション管理の扱いが改善され、利用者がディレクトリ構造を強く意識しなくても済む場面が増えます。
【まとめ】従来型S3データレイクとの比較
ここまでのメリットを踏まえ、従来型のS3データレイクとIcebergの違いをサクッと振り返ってみます。
| 項目 | 従来型S3データレイク | Iceberg |
| 更新・削除 | 1行の修正でもファイル(パーティション)単位での再作成が必要になりがち。 | データベースのように、レコード単位での更新・削除・MERGEを前提とした管理ができる。 |
| 履歴管理 | スナップショットを自前で管理しないと、過去の状態に戻すのが難しい。 | 「タイムトラベル機能」により、過去状態の参照が簡単にできる。 |
| スキーマ変更 | カラム追加などのたびに、既存データとの互換性確認などで消耗しやすい。 | スキーマの進化(変更)を前提としており、安全に扱いやすい。 |
つまりIcebergは、従来型S3データレイクの弱点(ファイル管理の泥臭さ)を補い、分析用途に耐えやすい形へ進化させる技術と言えそうです。
AWSでの活用イメージ
AWSでは、Icebergを単独で使うというより、複数サービスと組み合わせて活用する形になるはずです。
各サービスの役割
- Amazon S3: データ保存先です。生データ、整備済みデータ、履歴を含めたデータレイクの基盤になります。
- Apache Iceberg: S3上のデータをテーブルとして管理する役割です。
- AWS Glue Data Catalog: テーブルメタデータの管理に使います。AWSサービス間でテーブル情報を共有するうえで重要な役割を担います。
- AWS Glue / Amazon EMR: ETL、変換、MERGEなどの処理を実行する層です。Icebergテーブルに対するデータ加工の中心になります。
- Amazon Athena: Icebergテーブルに対してクエリを実行しやすく、検証やアドホック分析に向いています。
構成イメージ
全体像としては、たとえば次のような流れになります。

- 各種ソースからデータをS3に取り込む
- GlueやEMRなどで整形し、Icebergテーブルとして管理する
- 更新・削除・履歴管理はIceberg側で担う
- Athenaなどで必要に応じて参照・検証する
このような構成により、S3ベースのデータレイクを、より運用しやすい分析基盤として扱いやすくなります。
最後に
今回は第1回として、Apache Icebergの基本概念、従来型データレイクとの違い、AWSでの活用イメージを中心に整理しました。
Apache Icebergは、S3上のデータを単なるファイルの集まりではなく、テーブルとして扱いやすくする仕組みであり、更新・削除、履歴管理、スキーマ変更といったデータレイク運用の課題を改善できるのが大きな魅力です。
とはいえ、公式のドキュメントやブログ記事のメリットだけを読んでいると、「本当にS3上でそんなに都合よくレコード単位の更新ができるのか?」「裏側の仕組みは本当に想定通りに動くのか?」といった疑問も湧いてきます。正直なところ、エンジニアとしては「実際に手を動かして検証してみないと、まだ手放しでは信頼できない」というのが率直な感想です。
なので次回以降は、実際にIcebergテーブルを作成したり、AthenaやSparkから参照したりしながら、本当に想定通りの挙動になるのかを具体的に確認していく予定です。
あわせて、AWSでのIceberg活用を語る上で外せないトピックである「Amazon S3 Tables」についても、今後の検証に組み込んでいきたいと考えています。
概念だけでは見えにくい部分もあるので、今後は手を動かしながら一緒に理解を深めていきましょう!
私と同じようにIcebergをこれから学ぼうとしている方の参考になればうれしいです。