Kafka

CCDAK対策にも効く:ksqlDB の Materialized Views — テーブルとクエリパターン

2026-04-19
NicheeLab編集部

ksqlDB のテーブルは、継続クエリで算出した結果を RocksDB のステートストアに保持し、Kafka のチェンジログ・トピックで耐障害性を確保するマテリアライズド・ビューです。これにより、低レイテンシなキー参照(Pull Query)と、継続配信(Push Query)の両方に対応できます。

本稿では、テーブルの成り立ちと内部、Pull/Push の使い分け、キー設計とパーティショニング、典型的なクエリパターン、運用と試験対策ポイントを、CCDAK で問われる要点に沿って解説します。

テーブルとマテリアライズド・ビューの基礎

ksqlDB の世界では、Stream は「不変のイベント列」、Table は「最新状態のアップサート表現」です。CREATE TABLE AS SELECT のような永続クエリは、計算結果をローカルのステートストアに維持し、背後で Kafka のトピックに変更履歴(チェンジログ)を永続化します。これが実質的なマテリアライズド・ビューです。

テーブルは主キーでインデックス化され、Pull Query による即時参照が可能です。一方で、Push Query は新規更新が発生するたびにストリームとして結果を押し流します。CCDAK では、用途に応じて Stream と Table、Pull と Push を正しく選ぶ設問が頻出します。

  • テーブル=アップサート(同一キーの最新値が有効)
  • マテリアライズド・ビュー=永続クエリで維持されるテーブル(結果が事前計算・保持)
  • Pull Query=キーを指定して即時読み出し(同期リクエスト)
  • Push Query=結果更新を連続配信(サブスクリプション型)

裏側のしくみ:Kafka トピックとステートストア

ksqlDB の永続クエリは Kafka Streams アプリケーションとして実行され、各パーティションに対応する RocksDB ステートストアを持ちます。更新はローカルに適用されるとともに、チェンジログ・トピックへ複製されます。ノード障害時はチェンジログから状態が復元されます。

再バランス時はパーティション担当が移動し、新しい担当ノードがチェンジログからキャッチアップします。これにより、マテリアライズド・ビューは耐障害性を保ちつつ、一貫性のある結果を提供できます。実運用では、チェンジログ・トピックの保護(適切な replication.factor と cleanup.policy)を確認します。

  • ローカル状態:RocksDB(パーティションごと)
  • 耐障害性:チェンジログ・トピックに更新を永続化
  • スケールアウト:パーティション単位で並列実行
  • 復元:担当変更・障害時にチェンジログからリストア
  • 整合性:アップサートの順序は同一キー内でパーティション順序に従う

Pull と Push の使い分け(比較表つき)

Pull Query は主キー条件での即時参照に最適です。ksqlDB はキーに基づき適切なノードへルーティングし、ローカルのマテリアイズド・ビューからすぐに応答します。一方、Push Query は連続的な更新通知に向き、監視ダッシュボードや下流へのストリーミング連携で有効です。

従来の Kafka コンシューマで同等を実現しようとすると、アプリ側で状態管理や照会機能を自作する必要があります。ksqlDB のテーブルはこれを標準機能として提供します。

  • 単発のキー参照=Pull Query
  • 最新の変化を流し続けたい=Push Query
  • 自作の状態管理が不要=ksqlDB テーブルの利点
観点Pull Query(テーブル)Push Query(テーブル/ストリーム)通常のKafkaコンシューマ
用途キーに対する即時参照更新の逐次配信イベント消費と独自処理
レスポンス同期リクエストで単発応答継続ストリームで逐次応答アプリ実装次第
必要条件主キー条件(等価)クエリをサブスクライブなし(自由)
レイテンシミリ秒〜サブ秒(ローカル状態)イベント到着依存の即時実装・ストア依存
スケールパーティション×ノードで水平分散ブローカー→ksqlDB→クライアントで拡張コンシューマグループで拡張
一貫性同一キーで最新値を返す到着順で更新を配信実装依存(自前の状態管理)

キー設計とパーティショニング:引けるビューにする

Pull Query は主キーでの検索を前提とします。すなわち、GROUP BY で指定したキー、あるいはテーブル定義の主キーに対する等価条件が必要です。適切なキー設計とパーティショニングが、低レイテンシ参照の成否を分けます。

JOIN や再パーティショニングが絡む場合、ksqlDB は必要に応じて再パーティション用トピックを自動作成します。結合ではキーとパーティション数の整合が重要で、必要に応じて PARTITION BY を用いた明示的な再パーティショニングを行います。

  • Pull Query は主キーの等価条件が基本(範囲検索はユースケースと実装に依存)
  • GROUP BY でビューのキーが決まる。キー変更時は再パーティショニングが発生
  • JOIN はコーパーティショニングが前提。キーとパーティション数の整合を確認
  • 高カーディナリティのキーはスケールに有利だが局所性とホットキーに注意

マテリアライズド・ビューのデータフロー(概念)

消費(永続クエリ)アップサート変更復元ローカル読み取りSource Topic(events)ksqlDB Persistent Query(CTAS/CSAS)Changelog Topic(compacted, Kafka)State Store(RocksDB/part)Pull Query (by key)ksqlDB が担当ノードへルーティング

代表的なクエリパターン:集計・参照・結合

テーブルは集計やディメンション参照を事前計算し、即時照会を可能にします。以下は典型的な定義と利用例です。

試験対策の観点では、CTAS によるテーブル作成=マテリアイズ、Pull=キー参照、Push=連続配信、JOIN 時のキー整合と再パーティショニング、という対応関係を押さえておきましょう。

  • 集計テーブル:COUNT/SUM などを GROUP BY でアップサート
  • Pull Query:主キー指定で即時参照(同期)
  • Push Query:更新を連続配信(監視・下流連携)
  • 参照結合:Stream と Table の JOIN でエンリッチ

ksqlDB の定義例(マテリアイズ+参照+結合)

/* ソースストリーム定義 */
CREATE STREAM pageviews (
  user_id VARCHAR,
  page VARCHAR,
  ts BIGINT
) WITH (
  KAFKA_TOPIC='pageviews',
  VALUE_FORMAT='JSON'
);

/* ユーザー属性のディメンションテーブル(参照用) */
CREATE TABLE users (
  user_id VARCHAR PRIMARY KEY,
  plan VARCHAR
) WITH (
  KAFKA_TOPIC='users',
  VALUE_FORMAT='JSON'
);

/* 集計テーブル(マテリアライズド・ビュー) */
CREATE TABLE pv_count_by_user AS
SELECT user_id, COUNT(*) AS view_cnt
FROM pageviews
GROUP BY user_id
EMIT CHANGES;

/* Pull Query:単発のキー参照(最新の集計を即時取得) */
SELECT view_cnt FROM pv_count_by_user WHERE user_id='u-123';

/* Push Query:更新があるたびにストリーミング */
SELECT user_id, view_cnt FROM pv_count_by_user EMIT CHANGES;

/* 参照結合:ストリームをディメンション情報でエンリッチ */
CREATE STREAM enriched_pageviews AS
SELECT p.user_id, p.page, u.plan
FROM pageviews p
LEFT JOIN users u
ON p.user_id = u.user_id
EMIT CHANGES;

運用と試験対策ポイント:再構築・障害対応・設計の勘所

マテリアライズド・ビューを再構築したい場合は、元トピックに必要な履歴が残っていること(十分な保持期間やコンパクション)が前提です。クエリを再作成すれば、ksqlDB は最初から読み直し、状態を再構築します。

障害やリバランス時は、チェンジログからローカル状態が復元されます。スケールはパーティション数とノード数に依存し、ホットキーがあると偏りが生じます。キー分布とパーティション設計は必ず検討しましょう。

  • 再構築=クエリ再作成+ソース履歴の確保(保持期間・compact を検討)
  • 結合や GROUP BY でキーが変わると再パーティショニング・トピックが作成される
  • Pull はキー必須。Push は連続配信。用途で選ぶ
  • CCDAK では Stream と Table のセマンティクス、キーとパーティション、テーブルのマテリアイズとチェンジログの関係が頻出

問題で確認

CCDAK

問題 1

ユーザーごとのページビュー回数を即時に取得し、API から user_id を指定して単発で最新の値を返したい。最も適切なアーキテクチャはどれか?

  1. ksqlDB で GROUP BY user_id のテーブルを作成し、Pull Query で参照する
  2. アプリが生の pageviews トピックを頭から最後まで毎回走査して集計する
  3. ksqlDB の Push Query を使って流れてくる更新を API でバッファしておく
  4. Stream-Stream JOIN を行い、結果を通常のコンシューマで検索する

正解: A

単発のキー参照には、主キーでインデックス化されたテーブル(マテリアライズド・ビュー)+ Pull Query が最適。Push Query は連続配信向けで単発参照には不向き。生トピックの都度走査や JOIN のみでは即時のキー参照要件を満たしにくい。

よくある質問

テーブルの背後のトピックはコンパクションが必須ですか?

テーブルはアップサートのモデルに適しており、チェンジログ・トピックはキー単位の最新値を保つためにコンパクションが用いられます。シンク側トピックの cleanup.policy は環境設定に依存しますが、最新状態を保持したい用途では compact を有効にするのが一般的です。

Pull Query はどうやってスケールしますか?

キーでパーティションが決まり、対応ノードのローカル状態から即時応答します。パーティション数とノード数を増やすことで水平スケールでき、ksqlDB はキーに基づき担当ノードへルーティングします。

キーを変えて再設計したいときはどうすればよいですか?

PARTITION BY または GROUP BY により再パーティショニングされた新しいパイプライン(テーブル)を作成します。内部的に再パーティショントピックが生成され、以降は新キーでの Pull/Push が可能になります。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Kafka

Kafka Topic と Partition の基礎: 分散とスケーラビリティの要

CCDAK 対策と実務の両立を意識し、Topic/Partition/Replica/Consumer Group の役...

Kafka

CCDAK 試験ガイド:出題範囲・配点・申込み・対策

Confluent Certified Developer for Apache Kafka (CCDAK) の出題範囲...

Kafka

Confluent Certified Administrator (CCAAK) 対策: 出題範囲・配点の考え方・運用観点の要点

CCAAKに向けて、試験領域の押さえどころを運用目線で整理。プロダクションで通用する設定・監視・セキュリティの実践知を、...

Kafka

Kafka の Replica と In-Sync Replicas を正しく設計する: 耐障害性と一貫性

レプリカとISRの仕組みを起点に、acks と min.insync.replicas、クリーン/アンクリーンリーダー選...

Kafka

Kafka の Offset とコミット: ポジション管理と at-least-once の基礎

CCDAK 対策と実務の両立を意識して、Kafka コンシューマのオフセット管理とコミット戦略を整理。at-least-...

Kafkaの記事一覧 (100件)
© 2026 NicheeLab All rights reserved.