Contents
Apache Kafka の概要と主なユースケース
Apache Kafka は、分散型のストリーミングプラットフォームとして設計されたミドルウェアです。データをリアルタイムで永続化しつつ、複数のコンシューマーへ同時配信できる点が特徴です。このセクションでは、Kafka が提供する高スループット・高可用性の仕組みと、代表的な利用シーンを簡潔に解説します。
-
リアルタイム分析
IoT デバイスやクリックストリームなど大量かつ高速に生成されるデータを、Kafka に集約して即座に集計・可視化できます。 -
イベント駆動アーキテクチャ (EDA)
マイクロサービス間の非同期通信基盤として利用し、システム全体の結合度を下げながらスケーラビリティを確保します。 -
データレプリケーション
データベースの変更ログ (CDC) を Kafka に流すことで、異なるストレージやクラウド環境へリアルタイムに同期できます。
Kafka は「高速・高可用」だけでなく、スキーマ管理やストリーム処理フレームワーク(Kafka Streams、ksqlDB)との連携も標準でサポートしているため、幅広い業務要件に適合します。
2026 年執筆時点の最新安定版 Kafka の取得とインストール手順
この章では、公式サイトからのダウンロード方法、Docker イメージを用いたローカルクラスター構築、そして OS 別パッケージマネージャーでのインストール手順を紹介します。なお、情報は 2026‑03‑15 時点のもの(Apache Kafka Downloads)に基づいています。バージョン番号やイメージタグは定期的に更新されるため、常に公式ページを確認してください。
1. 公式サイトからのダウンロード
Kafka の配布パッケージは Apache のミラーサーバーから取得できますが、JDK は同梱されていません。実行には別途 JDK 17 以上をインストールしておく必要があります(例: sudo apt install openjdk-17-jdk)。
|
1 2 3 4 |
# 例:Kafka 3.5.0 (Scala 2.13) を取得 wget https://downloads.apache.org/kafka/3.5.0/kafka_2.13-3.5.0.tgz tar -xzf kafka_2.13-3.5.0.tgz |
ポイント
- ダウンロード URL は公式ページの「Binary downloads」欄に記載されています。
-kafka_2.13の「2.13」は Scala バージョンで、Java クライアントはどちらでも利用可能です。
2. Docker を使ったクイックスタート(KRaft モード対応)
Kafka はバージョン 3.4 以降、デフォルトで KRaft (Kafka Raft) モード が推奨されており、Zookeeper が不要です。以下は Apache が提供する公式 Docker イメージ apache/kafka を用いた最小構成例です(執筆時点のタグは 3.5.0‑kafka‑2.13‑latest)。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# docker-compose.yml version: "3.8" services: kafka: image: apache/kafka:3.5.0-kafka-2.13-latest container_name: kafka ports: - "9092:9092" environment: KAFKA_NODE_ID: 1 KAFKA_PROCESS_ROLES: broker,controller KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka:9093 KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 |
|
1 2 |
docker compose up -d |
- KRaft の利点
- Zookeeper を別プロセスで管理する必要がなく、構成がシンプルになる。
- クラスタの拡張やアップグレード時にブローカーだけを追加すればよい。
注意:Confluent が提供する
confluentinc/cp-kafkaは Apache 本体とは別パッケージで、商用サポートや独自機能が含まれます。純粋にオープンソースの Kafka を試したい場合はapache/kafkaを選択してください。
3. Homebrew / Linux パッケージマネージャーでのインストール
| OS | 推奨コマンド例 | 補足 |
|---|---|---|
| macOS (Homebrew) | brew install kafka@3.5 |
インストール後は brew services start kafka@3.5 で自動起動可能 |
| Debian/Ubuntu | sudo apt-get update && sudo apt-get install -y kafkacat(Kafka 本体は公式サイトから) |
Apache が提供する APT リポジトリは無いため、バイナリ展開が一般的 |
| RHEL/CentOS | sudo yum install -y java-17-openjdk && wget … |
JDK のインストールを忘れないこと |
各パッケージマネージャーは依存関係(JDK 等)を自動で解決しますが、KRaft モードへの切り替え設定は手動で行う必要があります。config/kraft/server.properties に以下の項目を追加してください。
|
1 2 3 4 |
process.roles=broker,controller node.id=1 controller.quorum.voters=1@localhost:9093 |
ローカル環境での Kafka クラスター起動と基本操作
本節では、KRaft モードで起動したブローカーの稼働確認からトピック作成、簡単なプロデューサー/コンシューマーのテストまでを順に示します。すべて公式スクリプトまたは CLI ツールを使用しています。
1. ブローカー起動確認
KRaft のコントローラーポート(9093)とブローカーポート(9092)の両方がリッスン状態であることを確認します。kafka-broker-api-versions.sh はブローカーの API バージョン情報を返すので、正常稼働の指標になります。
|
1 2 |
kafka-broker-api-versions.sh --bootstrap-server localhost:9092 |
出力例(省略形):
|
1 2 3 4 5 6 |
{ "brokers": [ { "id": 1, "host": "localhost", "port": 9092 } ] } |
この JSON が返ってきたら、クライアントからの接続は問題ありません。
2. トピック作成(KRaft 推奨設定)
KRaft 環境では --replication-factor はブローカー数に依存します。単一ノードでテストする場合は 1 に設定してください。
|
1 2 3 4 5 6 7 |
kafka-topics.sh --create \ --bootstrap-server localhost:9092 \ --topic orders \ --partitions 3 \ --replication-factor 1 \ --config retention.ms=86400000 # 24 時間保持 |
作成後は --describe オプションで設定を確認できます。
|
1 2 3 |
kafka-topics.sh --bootstrap-server localhost:9092 \ --describe --topic orders |
3. 簡易プロデューサーとコンシューマーの実行
以下は Bash スクリプトだけで動く最小構成です。JSON メッセージを送信し、同じトピックから受信します。
|
1 2 3 4 5 6 7 8 |
# producer.sh printf '{"id":"order-001","amount":150}' | \ kafka-console-producer.sh --broker-list localhost:9092 --topic orders # consumer.sh kafka-console-consumer.sh --bootstrap-server localhost:9092 \ --topic orders --from-beginning --max-messages 1 |
この手順で、Kafka が正しくデータを永続化し、コンシューマーが取得できることが確認できます。
プロデューサー・コンシューマーの実装サンプル(Java & Python)
実務では言語固有のクライアントライブラリを利用します。ここでは Java 17 + Spring Boot と Python 3.12 の 2 パターンを示し、シリアライズ方式は共通で StringSerializer(キー)と JsonSerializer(バリュー)を使用しています。
Java 17 + Spring Boot
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
// build.gradle (抜粋) implementation 'org.springframework.boot:spring-boot-starter' implementation 'org.springframework.kafka:spring-kafka' // src/main/resources/application.yml spring: kafka: bootstrap-servers: localhost:9092 producer: key-serializer: org.apache.kafka.common.serialization.StringSerializer value-serializer: org.apache.kafka.common.serialization.JsonSerializer consumer: group-id: demo-group key-deserializer: org.apache.kafka.common.serialization.StringDeserializer value-deserializer: org.apache.kafka.common.serialization.JsonDeserializer // Order.java (シンプル POJO) public record Order(String id, double amount) {} // ProducerService.java @Service public class ProducerService { private final KafkaTemplate<String, Order> template; public ProducerService(KafkaTemplate<String, Order> t) { this.template = t; } public void send(Order order) { template.send("orders", order.id(), order); } } // ConsumerListener.java @Component public class ConsumerListener { @KafkaListener(topics = "orders") public void listen(ConsumerRecord<String, Order> record) { System.out.printf("key=%s, value=%s%n", record.key(), record.value()); } } |
ポイント
- application.yml に設定を集約するだけで、プロデューサー・コンシューマーが自動的にシリアライズ/デシリアライズされます。
- Spring の DI コンテナが KafkaTemplate と @KafkaListener を管理するため、コード量が大幅に削減できます。
Python 3.12 + kafka‑python
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# pip install kafka-python from kafka import KafkaProducer, KafkaConsumer import json producer = KafkaProducer( bootstrap_servers='localhost:9092', key_serializer=str.encode, value_serializer=lambda v: json.dumps(v).encode('utf-8') ) order = {"id": "order-002", "amount": 320} producer.send('orders', key=order['id'], value=order) producer.flush() consumer = KafkaConsumer( 'orders', bootstrap_servers='localhost:9092', group_id='demo-group', key_deserializer=lambda k: k.decode(), value_deserializer=lambda v: json.loads(v.decode()) ) for msg in consumer: print(f"key={msg.key}, value={msg.value}") break # デモ用に1件だけ取得 |
ポイント
- kafka-python は純粋 Python 実装なので、追加のネイティブ依存は不要です。
- キーとバリューのシリアライズ関数をラムダで渡すだけで、JSON データの送受信が完結します。
データ連携・スキーマ管理入門(Kafka Connect & Schema Registry)
外部システムとのデータ流通では Kafka Connect と Schema Registry の併用が推奨されます。以下は JDBC Source コネクタと Avro スキーマを利用した最小構成です。
1. Kafka Connect(KRaft 環境向け)
connect-standalone.properties にブローカー情報とシリアライザ設定を書き、jdbc-source.properties で PostgreSQL からトピックへデータを流します。KRaft クラスタでも bootstrap.servers のみで接続可能です。
|
1 2 3 4 5 6 |
# connect-standalone.properties bootstrap.servers=localhost:9092 key.converter=org.apache.kafka.connect.storage.StringConverter value.converter=io.confluent.connect.avro.AvroConverter value.converter.schema.registry.url=http://localhost:8081 |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# jdbc-source.properties name=jdbc-source-pg connector.class=io.confluent.connect.jdbc.JdbcSourceConnector tasks.max=1 connection.url=jdbc:postgresql://db-host:5432/sales connection.user=dbuser connection.password=secret table.whitelist=orders mode=incrementing incrementing.column.name=id topic.prefix=pg- |
|
1 2 |
connect-standalone.sh connect-standalone.properties jdbc-source.properties |
2. Schema Registry と Avro スキーマ
公式 Docker イメージ confluentinc/cp-schema-registry を利用してローカルで起動します(Confluent のパッケージは商用サポート版ですが、OSS バイナリとしても利用可能です)。
|
1 2 3 4 5 |
docker run -d --name schema-registry \ -p 8081:8081 \ -e SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS=PLAINTEXT://localhost:9092 \ confluentinc/cp-schema-registry:7.5.0 |
Avro スキーマ例 (order.avsc)
|
1 2 3 4 5 6 7 8 9 10 11 |
{ "type": "record", "name": "Order", "namespace": "com.example", "fields": [ {"name":"id","type":"string"}, {"name":"amount","type":"double"}, {"name":"createdAt","type":"long"} ] } |
登録コマンド(curl):
|
1 2 3 4 |
curl -X POST -H "Content-Type: application/vnd.schemaregistry.v1+json" \ --data '{"schema": "'"$(cat order.avsc)"'"}' \ http://localhost:8081/subjects/orders-value/versions |
プロデューサー側で KafkaAvroSerializer、コンシューマー側で KafkaAvroDeserializer を使用すれば、スキーマのバージョニングと互換性チェックが自動的に適用されます。
運用・監視とよくあるエラーへの対処法
本番環境では可観測性を確保しつつ、障害発生時の原因切り分けが重要です。ここでは CLI ベースの基本モニタリングに加えて、Prometheus + Grafana を用いたメトリクス収集、代表的なエラーとその対処手順をまとめます。
1. 基本的な CLI モニタリング
| コマンド | 主な目的 |
|---|---|
kafka-topics.sh --describe |
パーティション・レプリカ・ISR の状態確認 |
kafka-consumer-groups.sh --list |
コンシューマーグループ一覧取得 |
jcmd <pid> VM.native_memory summary |
JVM ヒープとネイティブメモリの使用状況把握 |
例: ISR がすべて揃っているか確認する
|
1 2 3 |
kafka-topics.sh --bootstrap-server localhost:9092 \ --describe --topic orders |
出力に Isr: 1(単一ブローカーの場合)が表示されれば正常です。
2. Prometheus + Grafana によるメトリクス可視化
- JMX Exporter を各ブローカーの起動オプションに追加
yaml
KAFKA_JVM_PERFORMANCE_OPTS="-javaagent:/opt/jmx_exporter/jmx_prometheus_javaagent.jar=5555:/opt/jmx_exporter/kafka.yml" - Prometheus の
scrape_configsにブローカーの JMX Exporter エンドポイントを登録
yaml - job_name: 'kafka'
static_configs:- targets: ['localhost:5555']
- targets: ['localhost:5555']
- Grafana で公式ダッシュボード「Kafka Overview」 (ID 758) をインポートすると、スループット・レイテンシ・ディスク使用率が一目で把握できます。
3. 代表的なエラーと対処手順
| エラー | 主な原因 | 推奨対策 |
|---|---|---|
| ブローカー起動失敗 | ポート競合、JVM ヒープ不足、ディスク空きなし | netstat -tlnp でポート確認、KAFKA_HEAP_OPTS="-Xmx2G -Xms2G" を調整、ディスク容量を確保 |
| コンシューマーグループのリバランスが長時間 | パーティション数 > コンシューマ数、古いオフセット保持 | コンシューマ数を増やすか partition.assignment.strategy=range を検討、session.timeout.ms と max.poll.interval.ms の値を適切に設定 |
| トピック作成時のレプリカ不足 | クラスタサイズが 1 のとき replication-factor > 1 指定 |
開発環境では --replication-factor 1 に変更、またはブローカーを増設してクオーラム確保 |
ポイント:エラーログは必ず
/logs/server.log(Docker コンテナの場合はdocker logs <container>)で確認し、スタックトレースに記載されたキーワードで検索すると原因特定が早まります。
まとめ
本稿では、2026 年執筆時点の最新安定版 Apache Kafka の取得方法から、KRaft モードを前提としたローカルクラスター構築、基本的な操作・サンプルコード、さらにデータ連携に必要な Connect と Schema Registry の設定例まで網羅しました。
- 公式配布は JDK を同梱しないため、事前に JDK 17 以上を用意してください。
- KRaft が標準であり、Zookeeper は必須ではなくなっています(必要ならオプションで有効化可)。
- Docker 利用時は Apache の公式イメージ
apache/kafkaと Confluent 製品イメージ を目的別に使い分けましょう。 - 運用フェーズでは Prometheus + Grafana による可観測性と、CLI での迅速なトラブルシュートが鍵となります。
これらの手順をローカル環境で実践すれば、Kafka の基礎から本番運用までの流れを体感できるはずです。次は公式ドキュメントや各種ハンズオン教材を活用し、実際の業務シナリオに合わせた PoC(概念実証)へとステップアップしてください。