コンテンツにスキップ

Apache Kafka

出典: フリー百科事典『ウィキペディア(Wikipedia)』

これはこのページの過去の版です。Tarstassratsa (会話 | 投稿記録) による 2023年2月12日 (日) 17:34個人設定で未設定ならUTC)時点の版 (→‎アーキテクチャ)であり、現在の版とは大きく異なる場合があります。

Apache Kafka[1]
作者 LinkedIn
開発元 Apache Software Foundation
初版 2011年1月 (13年前) (2011-01)[2]
最新版
3.8.0[3] ウィキデータを編集 / 26 7月 2024
リポジトリ ウィキデータを編集
プログラミング
言語
Scala, Java
対応OS クロスプラットフォーム
種別 ストリーム・プロセッシング, メッセージブローカー
ライセンス Apache License 2.0
公式サイト kafka.apache.org ウィキデータを編集
テンプレートを表示

アパッチ・カフカは、分散型イベントストアおよびストリーム処理プラットフォームである。Apacheソフトウェア財団が管理するオープンソースのシステムで、JavaScalaを用いて実装されている。このプロジェクトは、リアルタイムのデータフィードを処理するための、統一された高スループット・低遅延のプラットフォームを提供することを目的としている。カフカ・コネクトと呼ばれるフレームワークを用いることにより、外部システムと接続しデータのインポート/エクスポートを行うことができるほか、ストリーム処理を行うアプリケーション向けのカフカ・ストリームズライブラリが提供されている。通信の効率化を行うため、カフカはTCP上でバイナリ形式による通信を行い、また「メッセージセット」と呼ばれる概念を導入し複数のメッセージをまとめて送受信することを可能にしている。これらの工夫により、カフカは「より大きなネットワークパケット、より大きなシーケンシャルなディスク操作、連続したメモリブロック(中略)を実現し、莫大な数のランダムなメッセージを線形に書き込むことができる[4]」と主張する。

歴史

カフカは元々LinkedInで開発され、その後2011年初めにオープンソース化された。ジェイ・クレプス、ネーハ・ナルケデ英語版、ジュン・ラオによって共同で開発された[5]。2012年10月23日にアパッチIncubatorから卒業した[6]。このシステムの名称はフランツ・カフカに由来するが、クレプスはその理由として、カフカが「書くことに最適化されたシステム」であり、また彼がカフカの作品が好きだったためと語っている[7]

アプリケーション

アパッチ・カフカはコミットログをベースにしており、ユーザーはそれをサブスクライブして、任意の数のシステムやリアルタイムアプリケーションにデータを公開することができる。カフカの採用例として、Uberにおける乗客とドライバーのマッチング管理、ブリティッシュガスのスマートホームサービスにおけるリアルタイム分析および予知保全の提供、LinkedIn全体における多数のリアルタイムサービスの実行などがある[8]

アーキテクチャ

カフカの概要

カフカは、「プロデューサー」と呼ばれる任意の数のプロセスから送られてくるキーバリューメッセージを保存する。データは、異なる「トピック」内の異なる「パーティション」に分割することができる。パーティション内では、メッセージはオフセット(パーティション内でのメッセージの位置)の順に記録され、タイムスタンプとともにインデックス化されて保存される。「コンシューマー」と呼ばれる他のプロセスは、パーティションからメッセージを読み取ることができる。ストリーム処理については、カフカはストリームAPIを提供しており、カフカからデータを取り出して、何らかの計算結果をカフカに書き戻すJavaアプリケーションを書くことができる。また、アパッチ・カフカは、アパッチ・エイペックス、アパッチ・ビーム、アパッチ・フリンク、アパッチ・スパーク、アパッチ・ストーム、アパッチ・ナイファイなどのストリーム処理システムとも連携させることができる。

カフカは1台以上の「ブローカー」と呼ばれるサーバーから構成されるクラスタ上で動作し、全てのトピックのパーティションがクラスタノードに分散される。さらに、パーティションは複数のブローカーに複製されている。このアーキテクチャにより、カフカは大量のメッセージストリームをフォールトトレラントな方法で配信でき、Java Message Service (JMS)やAdvanced Message Queuing Protocol (AMQP) などの従来のメッセージングシステムの一部を代替できるようになった。バージョン0.11.0.0でトランザクション書き込みが実装され、ストリームAPIを用いたexactly-onceなストリーム処理が実現可能となった。

トピックには通常のトピックとコンパクト化されたトピックの2種類がある。通常のトピックにおいては保持時間または容量上限を設定することができる。指定された保持時間よりも古いレコードが存在する場合やパーティションの容量上限を超えた場合には、ストレージ領域を確保するために古いデータが削除される。コンパクト化されたトピックでは、あるキーを持つメッセージが送られてきた際に、同じキーを持つメッセージの更新としてそのメッセージを扱う。メッセージは期限切れや容量超過などの理由により削除されることはなく、特定のキーに対しNULL値を持ついわゆるtombstone(墓標)メッセージを書くことで初めて削除される。

カフカには、5つの主要なAPIがある。

  • メッセージの公開を行うためのプロデューサーAPI
  • トピックをサブスクライブし、メッセージのストリームを処理するためのコンシューマーAPI
  • 既存のアプリケーションにトピックをリンクさせることができるコネクターAPI
  • 入力されたストリームのメッセージを変換し別のストリームとして出力するためのストリームAPI
  • トピック、ブローカー、およびその他のカフカオブジェクトを管理するためのアドミンAPI

コンシューマーAPIとプロデューサーAPIは、基盤となるメッセージングプロトコルによってカフカのコア機能から切り離されている。これにより、コンシューマーAPIとプロデューサーAPIと互換性のあるAPIをJava以外の言語でも性能を保ったまま実装することができる。アパッチ・カフカプロジェクトは、このようなサードパーティ製のAPIのリストを管理している。

カフカ API

コネクターAPI

カフカ・コネクト(またはコネクターAPI)は、バージョン0.9.0.0で追加された他のシステムとの間でデータをインポート/エクスポートするためのフレームワークである。Connectフレームワーク自体は、他のシステムからデータを読み書きするための実際のロジックが実装された、いわゆる「コネクター」を実行する。コネクターAPIは、カスタムコネクタを構築するために実装しなければならないプログラミングインターフェースを定義している。一般的なデータシステム向けのオープンソースおよび商用のコネクターは、すでに多数提供されている。しかし、アパッチ・カフカ自体には、実用可能なコネクターは含まれていない。

ストリームAPI

カフカ・ストリームズ(またはストリームAPI)は、Javaで記述されたストリーム処理ライブラリである。カフカ 0.10.0.0リリースで追加された。このライブラリにより、拡張性、伸縮性、耐障害性に優れたステートフルなストリーム処理を行うアプリケーションを開発できる。主なAPIはストリーム処理用のDSLで、フィルタ、マップ、グループ化、ウィンドウ、集約、結合、テーブルの概念などの一般的なストリーム操作を提供する。より詳細なストリーム処理の実装のためにプロセッサーAPIも用意されており、DSLとプロセッサーAPIを併用して処理を記述することもできる。ステートフルなストリーム処理のために、カフカ・ストリームズはRocksDBを使ってローカルな各演算子の状態を保持する。RocksDBはディスクへの書き込みが可能なため、保持される状態は利用可能なメモリ容量よりも大きくなる可能性がある。また、耐障害性の観点から、ローカルのステートストアへの更新はすべてカフカクラスタのトピックに書き込まれる。このため、これらのトピックを読み込むことで状態を再現し、すべてのデータをRocksDBに送り込むことができる。

バージョンの互換性

バージョン0.9.xまでのカフカブローカーは、古いクライアントとのみ後方互換性をもつ一方、バージョン0.10.0.0以降では、ブローカーは新しいクライアントと前方互換性もある。新しいクライアントが古いブローカーに接続した場合、ブローカーがサポートする機能のみを使用することができる。ストリームAPIについては、バージョン0.10.1.0から完全な互換性がある。0.10.1.0のカフカ・ストリームズアプリケーションは、0.10.0や古いブローカーと互換性はない。

パフォーマンス

エンドツーエンドのパフォーマンスを監視するには、ブローカー、コンシューマー、プロデューサーのメトリクスを追跡する必要があり、さらにカフカがコンシューマー間の調整に使用しているZooKeeperも監視する必要がある[9][10]。現在、カフカのパフォーマンスを追跡するためのモニタリング・プラットフォームがいくつか存在する。これらのプラットフォームに加えて、カフカデータの収集は、JConsoleを含む一般的にJavaにバンドルされているツールを使用して実行することもできる[11]

関連項目

参考文献

  1. ^ Apache Kafka at GitHub”. github.com. 5 March 2018閲覧。
  2. ^ Open-sourcing Kafka, LinkedIn's distributed message queue”. 27 October 2016閲覧。
  3. ^ Release 3.8.0” (26 7月 2024). 20 8月 2024閲覧。
  4. ^ Efficiency”. kafka.apache.org. 2019年9月19日閲覧。
  5. ^ Li, S. (2020).
  6. ^ Apache Incubator: Kafka Incubation Status”. 2023年2月6日閲覧。
  7. ^ What is the relation between Kafka, the writer, and Apache Kafka, the distributed messaging system?”. Quora. 2023年2月8日閲覧。
  8. ^ What is Apache Kafka”. confluent.io. 2018年5月4日閲覧。
  9. ^ Monitoring Kafka performance metrics” (英語) (2016年4月6日). 2016年10月5日閲覧。
  10. ^ Mouzakitis (2016年4月6日). “Monitoring Kafka performance metrics” (英語). datadoghq.com. 2016年10月5日閲覧。
  11. ^ Collecting Kafka performance metrics - Datadog” (英語) (2016年4月6日). 2016年10月5日閲覧。

外部リンク