
ksqlDB(이전 명칭: KSQL, Kafka SQL)는 Apache Kafka를 위한 스트리밍 SQL 엔진입니다. SQL 인터페이스를 제공하여 개발자들이 익숙한 SQL 구문으로 Kafka에서 실시간 스트리밍 처리를 쉽게 할 수 있도록 도와줍니다.
2017년 Confluent 사에서 개발을 시작했으며, 2019년에 KSQL에서 ksqlDB로 재브랜딩되었습니다. Confluent Community License 하에 제공되고 있습니다.
관계형 데이터베이스와 유사한 방식으로 실시간 스트리밍 데이터를 처리할 수 있습니다. 복잡한 스트림 처리 로직을 간단한 SQL로 표현할 수 있어 학습 곡선이 낮습니다.
ksqlDB는 fault-tolerant하고 수평 확장이 가능하도록 설계되어 있어, 대용량 데이터 처리에도 안정적으로 동작합니다.
SUM, COUNT, UCASE, REPLACE, TRIM 등 다양한 함수를 제공하며, 사용자 정의 함수(UDF) 및 람다 함수도 지원합니다.
ksqlDB 내에서 Kafka Connect를 직접 관리할 수 있어, 데이터 소스 및 싱크 연결이 간편합니다.
ksqlDB의 아키텍처는 크게 세 가지 주요 구성 요소로 이루어져 있습니다:
클라이언트가 ksqlDB 엔진에 접근할 수 있도록 중개 역할을 수행합니다.
RocksDB는 Facebook에서 개발한 오픈소스 embedded key-value 저장소로, 대용량 데이터 처리에 최적화되어 있습니다.
| 특징 | ksqlDB | Kafka Streams |
|---|---|---|
| 구문 | SQL 기반 | Java/Scala 코드 |
| 학습 곡선 | 낮음 (SQL 지식만 필요) | 높음 (라이브러리 이해 필요) |
| 개발 속도 | 빠름 (즉시 테스트 가능) | 상대적으로 느림 |
| 복잡도 | 간단한~중간 수준 처리에 적합 | 복잡한 스트리밍 처리에 유리 |
| 인터랙티브 | CLI로 즉시 확인 가능 | 컴파일 및 배포 필요 |
ksqlDB는 Kafka Streams 라이브러리 기반으로 개발되었으므로, 내부적으로는 Kafka Streams의 강력한 기능을 활용하면서도 SQL이라는 친숙한 인터페이스를 제공합니다.
-- Kafka topic에서 Stream 생성
CREATE STREAM riderLocations (
profileId VARCHAR,
latitude DOUBLE,
longitude DOUBLE
)
WITH (
kafka_topic='locations',
value_format='json',
partitions=1
);
-- 라이더의 최신 위치를 추적하는 테이블 생성
CREATE TABLE currentLocation AS
SELECT profileId,
LATEST_BY_OFFSET(latitude) AS la,
LATEST_BY_OFFSET(longitude) AS lo
FROM riderlocations
GROUP BY profileId
EMIT CHANGES;
실시간으로 변경되는 결과를 지속적으로 구독합니다.
-- Stream 데이터를 실시간으로 조회
SELECT * FROM riderLocations
WHERE GEO_DISTANCE(latitude, longitude, 37.4133, -122.1162) <= 5
EMIT CHANGES;
테이블의 현재 상태를 한 번만 조회합니다.
-- 현재 Mountain View에서 10마일 이내의 라이더 조회
SELECT * FROM ridersNearMountainView
WHERE distanceInMiles <= 10;
ksqlDB는 시간 기반 윈도우 연산을 지원합니다:
WINDOW TUMBLING (SIZE 1 HOUR)
WINDOW HOPPING (SIZE 30 SECONDS, ADVANCE BY 10 SECONDS)
WINDOW SESSION (60 SECONDS)
-- 30초 텀블링 윈도우로 지역별 페이지뷰 수 집계
CREATE TABLE pageviews_per_region AS
SELECT userid, gender, regionid, COUNT(*) AS numusers
FROM pageviews_stream
WINDOW TUMBLING (SIZE 30 SECOND)
GROUP BY userid, gender, regionid
HAVING COUNT(*) > 1
EMIT CHANGES;
실시간 스트림과 테이블을 조인하여 풍부한 데이터를 생성할 수 있습니다.
-- pageviews 스트림과 users 테이블 조인
CREATE STREAM user_pageviews AS
SELECT users_table.id AS userid, pageid, regionid, gender
FROM pageviews_stream
LEFT JOIN users_table
ON pageviews_stream.userid = users_table.id
EMIT CHANGES;
ksqlDB는 다양한 산업 분야에서 활용되고 있습니다:
# docker-compose.yml 다운로드
curl --output docker-compose.yml \
https://raw.githubusercontent.com/confluentinc/cp-all-in-one/latest/cp-all-in-one/docker-compose.yml
# Confluent Platform 시작
docker-compose up -d
# ksqlDB CLI 접속
docker exec -it ksqldb-cli ksql http://ksqldb-server:8088
curl --location --request POST 'http://localhost:8088/ksql' \
--header 'Content-Type: application/json' \
--data-raw '{
"ksql": "SHOW STREAMS;",
"streamProperties":{}
}'
ksqlDB는 Apache License 2.0이 아닌 Confluent Community License로 제공됩니다.
ksqlDB는 익숙한 SQL 구문으로 Kafka의 강력한 스트리밍 처리 능력을 쉽게 활용할 수 있게 해주는 혁신적인 도구입니다. 복잡한 코드 작성 없이 실시간 데이터 파이프라인을 구축하고 싶다면, ksqlDB는 최고의 선택이 될 것입니다.
특히 SQL에 익숙한 데이터 엔지니어나 분석가라면, 학습 곡선 없이 바로 실시간 스트리밍 처리를 시작할 수 있다는 점이 큰 장점입니다.
이 글이 도움이 되셨나요? 카프카와 ksqlDB를 활용한 실시간 데이터 처리에 대해 더 궁금한 점이 있다면 댓글로 남겨주세요! 🚀