📊はじめに
Netflixでは、大規模なデータ処理が必要です。毎日のデータ処理は何十億もの行に及び、これを効率的に処理するために増分処理(Incremental Processing)を採用しています。
増分処理とは、前回の処理以降に発生した新しいデータのみを処理することで、全データの再処理を避ける手法です。
この手法により、計算リソースを節約し、処理時間を短縮できます。
🚩課題
伝統的なETL(抽出・変換・ロード)パイプラインでは、全データの再処理が必要でした。
これにより、計算コストと処理時間が増大し、ビジネスニーズに対応できなくなっていました。
Netflixは、MaestroとApache Icebergを組み合わせた新しいアプローチを開発しました。
💼ビジネスユースケース
Netflixでは、以下のようなユースケースで増分処理が活用されています:
パートナーアナリティクス:コンテンツパートナーへの視聴データの提供
財務報告:収益と費用の分析
コンテンツ分析:視聴者の行動とコンテンツのパフォーマンス
🧩技術コンポーネント
Apache Iceberg
オープンソーステーブルフォーマットで、大規模なデータセットを効率的に管理します。
スナップショットとデータのバージョニング
スキーマ進化の管理
パーティションとメタデータの最適化
Netflix Maestro
ワークフローオーケストレーションツールで、複雑なデータパイプラインを管理します。
タスク依存関係の管理
スケジューリングとリトライの機能
分散処理とスケーリング
⚙️増分処理の仕組み
この実装には、3つの主要なアプローチがあります:
- タイムスタンプベース:特定の時間範囲のデータのみを処理
- スナップショットベース:Icebergのスナップショット機能を利用
- マニフェストベース:変更ファイルのリストを使用
🔍実装例
タイムスタンプベースの例
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のデータインフラストラクチャの中核となり、リアルタイムに近い分析と効率的なデータ処理を可能にしています。
今後も、さらなる最適化とツール開発を通じて、データ処理の効率向上を目指しています。