「Apache Kafka」の版間の差分
Tarstassratsa (会話 | 投稿記録) 編集の要約なし |
m -{{Sakujo}} |
||
(2人の利用者による、間の11版が非表示) | |||
1行目: | 1行目: | ||
{{Infobox software |
|||
<!-- 削除についての議論が終了するまで、下記のメッセージ部分は除去しないでください。もしあなたがこのテンプレートを除去した場合、差し戻されます。またページが保護されることもあります。 --> |
|||
{{Sakujo/本体|2023年2月6日|Apache Kafka}} |
|||
<!-- 削除についての議論が終了するまで、上記部分は削除しないでください。 -->{{Infobox software |
|||
| title = Apache Kafka<ref>{{cite web|url=https://github.com/apache/kafka|title=Apache Kafka at GitHub|work=github.com|access-date=5 March 2018}}</ref> |
| title = Apache Kafka<ref>{{cite web|url=https://github.com/apache/kafka|title=Apache Kafka at GitHub|work=github.com|access-date=5 March 2018}}</ref> |
||
| name = Apache Kafka |
| name = Apache Kafka |
||
17行目: | 15行目: | ||
| website = {{Official URL}} |
| website = {{Official URL}} |
||
| logo size = 64px |
| logo size = 64px |
||
}}'''Apache Kafka'''は、[[分散コンピューティング|分散]]型イベントストアおよび[[ストリーム・プロセッシング|ストリーム処理]]プラットフォームである。[[Apacheソフトウェア財団]] |
}}'''Apache Kafka'''は、[[分散コンピューティング|分散]]型イベントストアおよび[[ストリーム・プロセッシング|ストリーム処理]]プラットフォームである。[[Apacheソフトウェア財団]]が管理する[[オープンソース]]のシステムで、[[Java]]と[[Scala]]を用いて実装されている。このプロジェクトは、リアルタイムのデータフィードを処理するための、統一された高スループット・低遅延のプラットフォームを提供することを目的としている。Kafka Connectと呼ばれるフレームワークを用いることにより、外部システムと接続しデータのインポート/エクスポートを行うことができるほか、ストリーム処理を行うアプリケーション向けのKafka Streams[[ライブラリ]]が提供されている。通信の効率化を行うため、Kafkaは[[Transmission Control Protocol|TCP]]上でバイナリ形式による通信を行い、また「メッセージセット」と呼ばれる概念を導入し複数のメッセージをまとめて送受信することを可能にしている。これらの工夫により、Kafkaは「より大きなネットワークパケット、より大きなシーケンシャルなディスク操作、連続したメモリブロック(中略)を実現し、莫大な数のランダムなメッセージを線形に書き込むことができる<ref>{{Cite web |url=https://kafka.apache.org/documentation/#maximizingefficiency |title=Efficiency |website=kafka.apache.org |access-date=2019-09-19}}</ref>」と主張する。 |
||
== 歴史 == |
== 歴史 == |
||
Kafkaは元々[[LinkedIn]]で開発され、その後2011年初めにオープンソース化された。 |
Kafkaは元々[[LinkedIn]]で開発され、その後2011年初めにオープンソース化された。ジェイ・クレプス、{{Ill|ネーハ・ナルケデ|en|Neha Narkhede}}、ジュン・ラオによって共同で開発された<ref name="ForbesKreps">Li, S. (2020).</ref>。2012年10月23日に[[Apache Incubator]]から卒業した<ref>{{Cite web |title=Apache Incubator: Kafka Incubation Status |url=https://incubator.apache.org/projects/kafka.html |access-date=2023年2月6日}}</ref>。このシステムの名称は[[フランツ・カフカ]]に由来するが、クレプスはその理由として、Kafkaが「書くことに最適化されたシステム」であり、また彼がカフカの作品が好きだったためと語っている<ref>{{Cite web |title=What is the relation between Kafka, the writer, and Apache Kafka, the distributed messaging system? |website=[[Quora]] |url=https://www.quora.com/What-is-the-relation-between-Kafka-the-writer-and-Apache-Kafka-the-distributed-messaging-system/answer/Jay-Kreps |access-date=2023-02-08}}</ref>。 |
||
== アプリケーション == |
== アプリケーション == |
||
Apache Kafkaは[[コミット (データ管理)|コミット]]ログをベースにしており、ユーザーはそれをサブスクライブして、任意の数のシステムやリアルタイムアプリケーションにデータを公開することができる。 |
Apache Kafkaは[[コミット (データ管理)|コミット]]ログをベースにしており、ユーザーはそれをサブスクライブして、任意の数のシステムやリアルタイムアプリケーションにデータを公開することができる。Kafkaの採用例として、[[Uber]]における乗客とドライバーのマッチング管理、ブリティッシュガスのスマートホームサービスにおけるリアルタイム分析および予知保全の提供、LinkedIn全体における多数のリアルタイムサービスの実行などがある<ref>{{Cite web |url=https://www.confluent.io/what-is-apache-kafka/ |title=What is Apache Kafka |website=confluent.io |access-date=2018-05-04}}</ref>。 |
||
== アーキテクチャ == |
== アーキテクチャ == |
||
[[ファイル:Overview_of_Apache_Kafka.svg|左|サムネイル|Kafkaの概要]] |
[[ファイル:Overview_of_Apache_Kafka.svg|左|サムネイル|Kafkaの概要]] |
||
⚫ | Kafkaは、「プロデューサー」と呼ばれる任意の数のプロセスから送られてくるKey-Valueメッセージを保存する。データは、異なる「トピック」内の異なる「パーティション」に分割することができる。パーティション内では、メッセージはオフセット(パーティション内でのメッセージの位置)の順に記録され、タイムスタンプとともにインデックス化されて保存される。「コンシューマー」と呼ばれる他のプロセスは、パーティションからメッセージを読み取ることができる。ストリーム処理については、KafkaはStreams APIを提供しており、Kafkaからデータを取り出して、何らかの計算結果をKafkaに書き戻すJavaアプリケーションを書くことができる。また、Apache Kafkaは、Apache Apex、[[Apache Beam]]、Apache Flink、[[Apache Spark]]、Apache Storm、Apache NiFiなどのストリーム処理システムとも連携させることができる。 |
||
⚫ | Kafkaは1台以上の「ブローカー」と呼ばれるサーバーから構成されるクラスタ上で動作し、全てのトピックのパーティションがクラスタノードに分散される。さらに、パーティションは複数のブローカーに複製されている。このアーキテクチャにより、Kafkaは大量のメッセージストリームをフォールトトレラントな方法で配信でき、[[Java Message Service]] (JMS)や[[Advanced Message Queuing Protocol]] (AMQP) などの従来のメッセージングシステムの一部を代替できるようになった。バージョン0.11.0.0でトランザクション書き込みが実装され、Streams APIを用いたexactly-onceなストリーム処理が実現可能となった。 |
||
⚫ | |||
⚫ | Kafkaは、プロデューサーと呼ばれる任意の数のプロセスから送られてくるKey-Valueメッセージを保存する。データは、異なる「トピック」内の異なる「パーティション」に分割することができる。パーティション内では、メッセージはオフセット(パーティション内でのメッセージの位置) |
||
⚫ | Kafkaは1台以上の |
||
⚫ | |||
Kafkaには、5つの主要なAPIがある。 |
Kafkaには、5つの主要なAPIがある。 |
||
* メッセージの公開を行うためのProducer API |
|||
* プロデューサーAPI - アプリケーションがレコードのストリームを公開することを許可する。 |
|||
* |
* トピックをサブスクライブし、メッセージのストリームを処理するためのConsumer API |
||
* |
* 既存のアプリケーションにトピックをリンクさせることができるConnector API |
||
* |
* 入力されたストリームのメッセージを変換し別のストリームとして出力するためのStreams API |
||
* |
* トピック、ブローカー、およびその他のKafkaオブジェクトを管理するためのAdmin API |
||
Consumer APIとProducer APIは、基盤となるメッセージング[[通信プロトコル|プロトコル]]によってKafkaのコア機能から[[結合度|切り離され]]ている。これにより、Consumer APIとProducer APIと互換性のあるAPIをJava以外の言語でも性能を保ったまま実装することができる。Apache Kafkaプロジェクトは、このようなサードパーティ製のAPIのリストを管理している。 |
|||
== Kafka API == |
== Kafka API == |
||
=== |
=== Connector API === |
||
Kafka Connect(または |
Kafka Connect(またはConnector API)は、バージョン0.9.0.0で追加された他のシステムとの間でデータをインポート/エクスポートするためのフレームワークである。Connectフレームワーク自体は、他のシステムからデータを読み書きするための実際のロジックが実装された、いわゆる「コネクター」を実行する。Connector APIは、カスタムコネクタを構築するために実装しなければならないプログラミングインターフェースを定義している。一般的なデータシステム向けのオープンソースおよび商用のコネクターは、すでに多数提供されている。しかし、Apache Kafka自体には、実用可能なコネクターは含まれていない。 |
||
=== |
=== Streams API === |
||
Kafka Streams(またはStreams API)は、Javaで記述されたストリーム処理ライブラリである。Kafka 0.10.0.0リリースで追加された。このライブラリにより、拡張性、伸縮性、耐障害性に優れたステートフルなストリーム処理アプリケーションを開発 |
Kafka Streams(またはStreams API)は、Javaで記述されたストリーム処理ライブラリである。Kafka 0.10.0.0リリースで追加された。このライブラリにより、拡張性、伸縮性、耐障害性に優れたステートフルなストリーム処理を行うアプリケーションを開発できる。主なAPIはストリーム処理用の[[ドメイン固有言語|DSL]]で、フィルタ、マップ、グループ化、ウィンドウ、集約、結合、テーブルの概念などの一般的なストリーム操作を提供する。より詳細なストリーム処理の実装のためにProcessor APIも用意されており、DSLとProcessor APIを併用して処理を記述することもできる。ステートフルなストリーム処理のために、Kafka Streamsは[[RocksDB]]を使ってローカルな各演算子の状態を保持する。[[RocksDB]]はディスクへの書き込みが可能なため、保持される状態は利用可能なメモリ容量よりも大きくなる可能性がある。また、耐障害性の観点から、ローカルのステートストアへの更新はすべてKafkaクラスタのトピックに書き込まれる。このため、これらのトピックを読み込むことで状態を再現し、すべてのデータをRocksDBに送り込むことができる。 |
||
== バージョンの互換性 == |
== バージョンの互換性 == |
||
バージョン0.9.xまでのKafkaブローカーは、古いクライアントとのみ後方互換性 |
バージョン0.9.xまでのKafkaブローカーは、古いクライアントとのみ後方互換性をもつ一方、バージョン0.10.0.0以降では、ブローカーは新しいクライアントと前方互換性もある。新しいクライアントが古いブローカーに接続した場合、ブローカーがサポートする機能のみを使用することができる。Streams APIについては、バージョン0.10.1.0から完全な互換性がある。0.10.1.0のKafka Streamsアプリケーションは、0.10.0や古いブローカーと互換性はない。 |
||
== パフォーマンス == |
== パフォーマンス == |
||
エンドツーエンドのパフォーマンスを監視するには、ブローカー、コンシューマー、プロデューサーのメトリクスを追跡する必要があり、さらにKafkaがコンシューマー間の調整に使用している[[Apache ZooKeeper|ZooKeeper]]も監視する必要がある<ref>{{Cite web |url=https://www.datadoghq.com/blog/monitoring-kafka-performance-metrics/#broker-metrics |title=Monitoring Kafka performance metrics |date=2016-04-06 |language=en-US |access-date=2016-10-05}}</ref><ref>{{Cite web |url=https://www.datadoghq.com/blog/monitoring-kafka-performance-metrics/#toc-why-zookeeper- |title=Monitoring Kafka performance metrics |author=Mouzakitis |first=Evan |date=2016-04-06 |website=datadoghq.com |language=en-US |access-date=2016-10-05}}</ref>。現在、Kafkaのパフォーマンスを追跡するためのモニタリング・プラットフォームがいくつか存在する。これらのプラットフォームに加えて、Kafkaデータの収集は、JConsoleを含む |
エンドツーエンドのパフォーマンスを監視するには、ブローカー、コンシューマー、プロデューサーのメトリクスを追跡する必要があり、さらにKafkaがコンシューマー間の調整に使用している[[Apache ZooKeeper|ZooKeeper]]も監視する必要がある<ref>{{Cite web |url=https://www.datadoghq.com/blog/monitoring-kafka-performance-metrics/#broker-metrics |title=Monitoring Kafka performance metrics |date=2016-04-06 |language=en-US |access-date=2016-10-05}}</ref><ref>{{Cite web |url=https://www.datadoghq.com/blog/monitoring-kafka-performance-metrics/#toc-why-zookeeper- |title=Monitoring Kafka performance metrics |author=Mouzakitis |first=Evan |date=2016-04-06 |website=datadoghq.com |language=en-US |access-date=2016-10-05}}</ref>。現在、Kafkaのパフォーマンスを追跡するためのモニタリング・プラットフォームがいくつか存在する。これらのプラットフォームに加えて、Kafkaデータの収集は、JConsoleを含む一般的に[[Java]]にバンドルされているツールを使用して実行することもできる<ref>{{Cite web |url=https://www.datadoghq.com/blog/collecting-kafka-performance-metrics/#jconsole |title=Collecting Kafka performance metrics - Datadog |date=2016-04-06 |language=en-US |access-date=2016-10-05}}</ref>。 |
||
== 関連項目 == |
== 関連項目 == |
||
* [[RabbitMQ]] |
* [[RabbitMQ]] |
||
* [[Apache Pulsar]] |
|||
* [[Redis]] |
* [[Redis]] |
||
* |
* {{Ill|Apache Flink|en|Apache Flink}} |
||
* |
* {{Ill|Apache Samza|en|Apache Samza}} |
||
* [[Apache Spark|Apache Spark Streaming]] |
* [[Apache Spark|Apache Spark Streaming]] |
||
* [[Data Distribution Service]] |
* [[Data Distribution Service]] |
||
* |
* {{Ill|Enterprise Integration Patterns|en|Enterprise Integration Patterns}} |
||
* |
* {{Ill|Enterprise messaging system|en|Enterprise messaging system}} |
||
* [[ストリーム・プロセッシング |
* [[ストリーム・プロセッシング]] |
||
* |
* {{Ill|Event-driven SOA|en|Event-driven SOA}} |
||
* |
* {{Ill|Hortonworks DataFlow|en|Hortonworks DataFlow}} |
||
* [[メッセージ指向ミドルウェア]] |
* [[メッセージ指向ミドルウェア]] |
||
* [[サービス指向アーキテクチャ]] |
* [[サービス指向アーキテクチャ]] |
||
84行目: | 79行目: | ||
* [https://kafka.apache.org/ 公式サイト] |
* [https://kafka.apache.org/ 公式サイト] |
||
{{Apache}} |
|||
[[Category:企業アプリケーション統合]] |
[[Category:企業アプリケーション統合]] |
||
[[Category: |
[[Category:オープンソースソフトウェア]] |
||
[[Category:Apacheソフトウェア財団|Kafka]] |
|||
[[Category:Javaプラットフォーム]] |
[[Category:Javaプラットフォーム]] |
||
[[Category:メッセージ指向ミドルウェア]] |
[[Category:メッセージ指向ミドルウェア]] |
2023年2月13日 (月) 23:25時点における最新版
作者 | |
---|---|
開発元 | Apache Software Foundation |
初版 | 2011年1月[2] |
最新版 |
3.8.0[3]
/ 26 7月 2024 |
リポジトリ | |
プログラミング 言語 | Scala, Java |
対応OS | クロスプラットフォーム |
種別 | ストリーム・プロセッシング, メッセージブローカー |
ライセンス | Apache License 2.0 |
公式サイト |
kafka |
Apache Kafkaは、分散型イベントストアおよびストリーム処理プラットフォームである。Apacheソフトウェア財団が管理するオープンソースのシステムで、JavaとScalaを用いて実装されている。このプロジェクトは、リアルタイムのデータフィードを処理するための、統一された高スループット・低遅延のプラットフォームを提供することを目的としている。Kafka Connectと呼ばれるフレームワークを用いることにより、外部システムと接続しデータのインポート/エクスポートを行うことができるほか、ストリーム処理を行うアプリケーション向けのKafka Streamsライブラリが提供されている。通信の効率化を行うため、KafkaはTCP上でバイナリ形式による通信を行い、また「メッセージセット」と呼ばれる概念を導入し複数のメッセージをまとめて送受信することを可能にしている。これらの工夫により、Kafkaは「より大きなネットワークパケット、より大きなシーケンシャルなディスク操作、連続したメモリブロック(中略)を実現し、莫大な数のランダムなメッセージを線形に書き込むことができる[4]」と主張する。
歴史
[編集]Kafkaは元々LinkedInで開発され、その後2011年初めにオープンソース化された。ジェイ・クレプス、ネーハ・ナルケデ、ジュン・ラオによって共同で開発された[5]。2012年10月23日にApache Incubatorから卒業した[6]。このシステムの名称はフランツ・カフカに由来するが、クレプスはその理由として、Kafkaが「書くことに最適化されたシステム」であり、また彼がカフカの作品が好きだったためと語っている[7]。
アプリケーション
[編集]Apache Kafkaはコミットログをベースにしており、ユーザーはそれをサブスクライブして、任意の数のシステムやリアルタイムアプリケーションにデータを公開することができる。Kafkaの採用例として、Uberにおける乗客とドライバーのマッチング管理、ブリティッシュガスのスマートホームサービスにおけるリアルタイム分析および予知保全の提供、LinkedIn全体における多数のリアルタイムサービスの実行などがある[8]。
アーキテクチャ
[編集]Kafkaは、「プロデューサー」と呼ばれる任意の数のプロセスから送られてくるKey-Valueメッセージを保存する。データは、異なる「トピック」内の異なる「パーティション」に分割することができる。パーティション内では、メッセージはオフセット(パーティション内でのメッセージの位置)の順に記録され、タイムスタンプとともにインデックス化されて保存される。「コンシューマー」と呼ばれる他のプロセスは、パーティションからメッセージを読み取ることができる。ストリーム処理については、KafkaはStreams APIを提供しており、Kafkaからデータを取り出して、何らかの計算結果をKafkaに書き戻すJavaアプリケーションを書くことができる。また、Apache Kafkaは、Apache Apex、Apache Beam、Apache Flink、Apache Spark、Apache Storm、Apache NiFiなどのストリーム処理システムとも連携させることができる。
Kafkaは1台以上の「ブローカー」と呼ばれるサーバーから構成されるクラスタ上で動作し、全てのトピックのパーティションがクラスタノードに分散される。さらに、パーティションは複数のブローカーに複製されている。このアーキテクチャにより、Kafkaは大量のメッセージストリームをフォールトトレラントな方法で配信でき、Java Message Service (JMS)やAdvanced Message Queuing Protocol (AMQP) などの従来のメッセージングシステムの一部を代替できるようになった。バージョン0.11.0.0でトランザクション書き込みが実装され、Streams APIを用いたexactly-onceなストリーム処理が実現可能となった。
トピックには通常のトピックとコンパクト化されたトピックの2種類がある。通常のトピックにおいては保持時間または容量上限を設定することができる。指定された保持時間よりも古いレコードが存在する場合やパーティションの容量上限を超えた場合には、ストレージ領域を確保するために古いデータが削除される。コンパクト化されたトピックでは、あるキーを持つメッセージが送られてきた際に、同じキーを持つメッセージの更新としてそのメッセージを扱う。メッセージは期限切れや容量超過などの理由により削除されることはなく、特定のキーに対しNULL値を持ついわゆるtombstone(墓標)メッセージを書くことで初めて削除される。
Kafkaには、5つの主要なAPIがある。
- メッセージの公開を行うためのProducer API
- トピックをサブスクライブし、メッセージのストリームを処理するためのConsumer API
- 既存のアプリケーションにトピックをリンクさせることができるConnector API
- 入力されたストリームのメッセージを変換し別のストリームとして出力するためのStreams API
- トピック、ブローカー、およびその他のKafkaオブジェクトを管理するためのAdmin API
Consumer APIとProducer APIは、基盤となるメッセージングプロトコルによってKafkaのコア機能から切り離されている。これにより、Consumer APIとProducer APIと互換性のあるAPIをJava以外の言語でも性能を保ったまま実装することができる。Apache Kafkaプロジェクトは、このようなサードパーティ製のAPIのリストを管理している。
Kafka API
[編集]Connector API
[編集]Kafka Connect(またはConnector API)は、バージョン0.9.0.0で追加された他のシステムとの間でデータをインポート/エクスポートするためのフレームワークである。Connectフレームワーク自体は、他のシステムからデータを読み書きするための実際のロジックが実装された、いわゆる「コネクター」を実行する。Connector APIは、カスタムコネクタを構築するために実装しなければならないプログラミングインターフェースを定義している。一般的なデータシステム向けのオープンソースおよび商用のコネクターは、すでに多数提供されている。しかし、Apache Kafka自体には、実用可能なコネクターは含まれていない。
Streams API
[編集]Kafka Streams(またはStreams API)は、Javaで記述されたストリーム処理ライブラリである。Kafka 0.10.0.0リリースで追加された。このライブラリにより、拡張性、伸縮性、耐障害性に優れたステートフルなストリーム処理を行うアプリケーションを開発できる。主なAPIはストリーム処理用のDSLで、フィルタ、マップ、グループ化、ウィンドウ、集約、結合、テーブルの概念などの一般的なストリーム操作を提供する。より詳細なストリーム処理の実装のためにProcessor APIも用意されており、DSLとProcessor APIを併用して処理を記述することもできる。ステートフルなストリーム処理のために、Kafka StreamsはRocksDBを使ってローカルな各演算子の状態を保持する。RocksDBはディスクへの書き込みが可能なため、保持される状態は利用可能なメモリ容量よりも大きくなる可能性がある。また、耐障害性の観点から、ローカルのステートストアへの更新はすべてKafkaクラスタのトピックに書き込まれる。このため、これらのトピックを読み込むことで状態を再現し、すべてのデータをRocksDBに送り込むことができる。
バージョンの互換性
[編集]バージョン0.9.xまでのKafkaブローカーは、古いクライアントとのみ後方互換性をもつ一方、バージョン0.10.0.0以降では、ブローカーは新しいクライアントと前方互換性もある。新しいクライアントが古いブローカーに接続した場合、ブローカーがサポートする機能のみを使用することができる。Streams APIについては、バージョン0.10.1.0から完全な互換性がある。0.10.1.0のKafka Streamsアプリケーションは、0.10.0や古いブローカーと互換性はない。
パフォーマンス
[編集]エンドツーエンドのパフォーマンスを監視するには、ブローカー、コンシューマー、プロデューサーのメトリクスを追跡する必要があり、さらにKafkaがコンシューマー間の調整に使用しているZooKeeperも監視する必要がある[9][10]。現在、Kafkaのパフォーマンスを追跡するためのモニタリング・プラットフォームがいくつか存在する。これらのプラットフォームに加えて、Kafkaデータの収集は、JConsoleを含む一般的にJavaにバンドルされているツールを使用して実行することもできる[11]。
関連項目
[編集]- RabbitMQ
- Redis
- Apache Flink
- Apache Samza
- Apache Spark Streaming
- Data Distribution Service
- Enterprise Integration Patterns
- Enterprise messaging system
- ストリーム・プロセッシング
- Event-driven SOA
- Hortonworks DataFlow
- メッセージ指向ミドルウェア
- サービス指向アーキテクチャ
参考文献
[編集]- ^ “Apache Kafka at GitHub”. github.com. 5 March 2018閲覧。
- ^ “Open-sourcing Kafka, LinkedIn's distributed message queue”. 27 October 2016閲覧。
- ^ “Release 3.8.0” (26 7月 2024). 20 8月 2024閲覧。
- ^ “Efficiency”. kafka.apache.org. 2019年9月19日閲覧。
- ^ Li, S. (2020).
- ^ “Apache Incubator: Kafka Incubation Status”. 2023年2月6日閲覧。
- ^ “What is the relation between Kafka, the writer, and Apache Kafka, the distributed messaging system?”. Quora. 2023年2月8日閲覧。
- ^ “What is Apache Kafka”. confluent.io. 2018年5月4日閲覧。
- ^ “Monitoring Kafka performance metrics” (英語) (2016年4月6日). 2016年10月5日閲覧。
- ^ Mouzakitis (2016年4月6日). “Monitoring Kafka performance metrics” (英語). datadoghq.com. 2016年10月5日閲覧。
- ^ “Collecting Kafka performance metrics - Datadog” (英語) (2016年4月6日). 2016年10月5日閲覧。