top of page

Apache Kafka でクラウド ストレージを使用して効率的な長期データ管理を行うためのベスト プラクティス

Apache Kafka は、高スループットと低レイテンシでリアルタイムデータストリームを処理できることで広く知られています。しかし、長期データストレージの管理に関しては、Kafka のネイティブストレージモデルには限界があります。この記事では、Apache Kafka による長期データの管理の効率性、代替手段としてのクラウドストレージバケットの役割、そして Kafka とクラウドストレージを組み合わせて効率的なデータアクセスと取得を実現するためのベストプラクティスについて解説します。



サーバーの列と点滅するライトが並ぶクラウド ストレージ データセンターの目線の高さのビュー


Apache Kafka が長期データストレージを処理する方法

Apache Kafka は、トピック内のデータを Kafka ブローカーのローカルディスク上に不変のログとして保存します。この設計は、ストリーミングユースケースにおける高速な書き込みと読み取りをサポートします。ただし、Kafka のローカルストレージは、以下の理由により、大量のデータの長期保存には最適化されていません。


  • ストレージの制限: Kafka ブローカーのディスク容量は限られているため、データを無期限に保存するにはコストがかかり、複雑になります。

  • 保持ポリシー: Kafka は通常、時間ベースまたはサイズベースの保持を使用して古いデータを自動的に削除します。

  • 回復の複雑さ: ブローカーの障害後に Kafka からデータを復元することは、非常に大きなデータセットの場合に困難になる可能性があります。


Kafka のストレージモデルは、数時間から数週間に及ぶ短期から中期のデータ保持に最適です。より長期間のデータ保持には、外部ストレージソリューションを検討する組織が多くあります。


Kafka キューの代わりに Cloud Storage バケットを使用する

Amazon S3、Google Cloud Storage、Azure Blob Storageなどのクラウドストレージバケットは、スケーラブルで耐久性があり、コスト効率の高い長期データストレージオプションを提供します。多くのアーキテクチャでは、Kafkaの内部ストレージのみに依存するのではなく、古いKafkaデータをクラウドバケットにオフロードしています。


クラウドBLOBとバケットに保存されたオブジェクト

メッセージの検索と取得の効率

クラウドストレージバケットはオブジェクトストアであり、メッセージキューではありません。つまり、


  • データは個々のメッセージではなく、ファイルまたはオブジェクトとして保存されます。

  • 特定のメッセージを取得するには、インデックス作成またはパーティション分割の戦略が必要です。

  • Kafka のローカル ストレージと比較すると、アクセスのレイテンシが高くなります。


検索を効率的に行うために、多くの場合、データは高速クエリとパーティションプルーニングをサポートする形式と構造で保存されます。


データ形式とパーティション分割: Parquet と ORC

Apache Kafka 自体は、Parquet や ORC 形式をネイティブに使用していません。これらの列指向ストレージ形式は、圧縮率とクエリ効率の高さから、ビッグデータエコシステムで人気があります。


Kafkaデータをクラウドストレージにエクスポートする際、多くのチームはメッセージをParquetまたはORCファイルに変換します。このアプローチには次のような利点があります。


  • 効率的な圧縮により、ストレージ コストが削減されます。

  • 列レイアウトでは、関連する列のみを読み取ることでクエリが高速化されます。

  • 時間、トピック、その他のキーでパーティション分割すると、高速フィルタリングが可能になります。


例えば、Kafkaメッセージを日付とトピックで区切られた1時間ごとのParquetファイルにまとめるというパターンがよく見られます。この構造により、下流の分析ツールは関連データを迅速に特定し、スキャンすることができます。


Apache Kafka でクラウド ストレージを使用するためのベスト プラクティス


1. Kafka Connect を Cloud Storage Sink コネクタと併用する

Kafka Connectは、Kafkaトピックをクラウドストレージにエクスポートするための既製のコネクタを提供します。これらのコネクタは、バッチ処理、ファイル形式の変換、パーティション分割を自動的に処理します。


  • Parquet または ORC 出力をサポートするコネクタを選択します。

  • クエリ パターンに合わせてパーティション スキームを構成します。

  • レイテンシとファイル サイズのバランスをとるために適切なフラッシュ間隔を設定します。


2. 階層型ストレージアーキテクチャを実装する

階層型ストレージは、Kafka ブローカーに保存されているホット データ (最近、頻繁にアクセスされるデータ) と、クラウド バケットに保存されているコールド データ (古い、あまりアクセスされないデータ) を分離します。


  • 高速ストリーミングと処理のために、最新のデータを Kafka に保存します。

  • 古いデータをクラウド ストレージにオフロードして、コスト効率の高い長期保存を実現します。

  • Apache Kafka の階層型ストレージ機能 (一部のディストリビューションで利用可能) やカスタム パイプラインなどのツールを使用します。


3. パーティション分割と命名規則を慎重に設計する

効果的なパーティショニングは、クラウド ストレージでの効率的なデータ取得の鍵となります。


  • 時間ベースのクエリを有効にするには、日付/時刻でデータをパーティション分割します。

  • フィルタリングのために、パーティション キーにトピックまたはイベント タイプを含めます。

  • 一貫したファイル命名規則を使用して、インデックス作成を簡素化します。


4. メタデータとインデックスを使用して高速検索を行う

クラウド ストレージはメッセージ キューではないため、メタデータのインデックス作成が不可欠です。


  • 外部インデックスまたはカタログ (AWS Glue、Apache Hive Metastore など) を維持します。

  • スキーマ レジストリを使用して、データの形式とバージョンを追跡します。

  • クラウド ストレージやメタデータと統合する Presto や Apache Spark などのクエリ エンジンを活用します。


5. データライフサイクルの監視と管理

クラウド バケットにライフサイクル ポリシーを設定して、データの古さとコストを管理します。


  • 保持期間後にデータをアーカイブまたは削除します。

  • アクセス頻度の低いデータにはストレージ クラス (S3 Glacier など) を使用します。

  • 不要なストレージコストを回避するためにクリーンアップを自動化します。


実例: ストリーミング分析パイプライン

ある小売企業は、Apache Kafka を通じて取引データをストリーミングしています。最近の取引は不正検出のためにリアルタイムで処理されます。古い取引は、日付と店舗の場所ごとに分割され、Parquet 形式で 1 時間ごとに Amazon S3 にエクスポートされます。


アナリストは、Parquetファイルを効率的に読み取るAmazon Athenaを使用してS3データにクエリを実行します。この設定により、Kafkaブローカーのストレージ要件が軽減され、スケーラブルでコスト効率の高い長期ストレージと高速なクエリパフォーマンスが実現します。



bottom of page