Netflixのマエストロとアパッチアイスバーグを使用した増分処理

2025年3月11日

📊はじめに

Netflixでは、大規模なデータ処理が必要です。毎日のデータ処理は何十億もの行に及び、これを効率的に処理するために増分処理(Incremental Processing)を採用しています。

増分処理とは、前回の処理以降に発生した新しいデータのみを処理することで、全データの再処理を避ける手法です。

この手法により、計算リソースを節約し、処理時間を短縮できます。

🚩課題

伝統的なETL(抽出・変換・ロード)パイプラインでは、全データの再処理が必要でした。

これにより、計算コスト処理時間が増大し、ビジネスニーズに対応できなくなっていました。

Netflixは、MaestroApache Icebergを組み合わせた新しいアプローチを開発しました。

💼ビジネスユースケース

Netflixでは、以下のようなユースケースで増分処理が活用されています:

パートナーアナリティクス:コンテンツパートナーへの視聴データの提供

財務報告:収益と費用の分析

コンテンツ分析:視聴者の行動とコンテンツのパフォーマンス

🧩技術コンポーネント

主要テクノロジー
Apache Iceberg
+
Netflix Maestro

Apache Iceberg

オープンソーステーブルフォーマットで、大規模なデータセットを効率的に管理します。

スナップショットとデータのバージョニング

スキーマ進化の管理

パーティションとメタデータの最適化

Netflix Maestro

ワークフローオーケストレーションツールで、複雑なデータパイプラインを管理します。

タスク依存関係の管理

スケジューリングとリトライの機能

分散処理とスケーリング

⚙️増分処理の仕組み

基本的なフロー
データ収集
変更検出
増分処理

この実装には、3つの主要なアプローチがあります:

  1. タイムスタンプベース:特定の時間範囲のデータのみを処理
  2. スナップショットベース:Icebergのスナップショット機能を利用
  3. マニフェストベース:変更ファイルのリストを使用

🔍実装例

タイムスタンプベースの例

Apache Sparkで実装した場合:

val newData = spark.read
  .format("iceberg")
  .option("snapshots", "1")
  .load("path/to/table")
  .where(col("event_time") > lit("2023-01-01"))
            

スナップショットベースの例

Apache Icebergの機能を使用:

// 前回のスナップショットIDを取得
val prevSnapshot = "123456789"

// 現在と前回のスナップショット間の差分を処理
val deltaData = spark.read
  .format("iceberg")
  .option("start-snapshot-id", prevSnapshot)
  .load("path/to/table")
            

メリット

🔹

処理時間の短縮:全データの再処理が不要になり、処理時間が大幅に短縮

🔹

コスト削減:計算リソースの使用量が減少

🔹

スケーラビリティ:データ量が増えても処理効率を維持

🔹

データの鮮度:より頻繁なデータ更新が可能

🏁まとめ

NetflixのMaestroとApache Icebergを組み合わせた増分処理アプローチにより:

大規模データパイプラインの効率を10倍以上向上させることができました。

この技術は、Netflixのデータインフラストラクチャの中核となり、リアルタイムに近い分析効率的なデータ処理を可能にしています。

今後も、さらなる最適化とツール開発を通じて、データ処理の効率向上を目指しています。