kok202
카프카 - 05 - 스트림즈, KSQL

2020. 4. 14. 08:16[정리] 데이터베이스/[Message] Kafka

카프카 스트림즈 API

스트림 프로세심은 실시간 분석이라고도 불린다.

스트림 프로세싱과 대비되는 개념은 배치처리, 정적 데이터 처리를 들 수 있다.

스트림 처리를 하다보면 이전 스트을 처리한 결과를 참조해야하는 경우가 있는데 이를 상태 기반 처리라고 한다.

반면 이전 스트림의 처리 결과와 관계 없이 현재 어플리케이션에 도달한 스트림만을 기준으로 처리하는 것을 무상태 기반 처리라고 한다.

카프카 스트림즈는 스파크 스트림이나 스톰과 같이 스트림 처리를 하는 프로세서들이 있다.

카프카 스트림즈 API 는 이런 프로세서들이 연결되는 형상(토폴로지)을 만들어 처리하는 API이다.

 

 

 

카프카 스트림즈 용어 정리

  • 스트림 : 카프카 API 를 사용해 생성된 토폴로지, 끊임없이 전달되는 데이터 세, key-value 형태이다.
  • 스트림 처리 어플리케이션 : 카프카 스트림 클라이언트를 사용하는 어플리케이션
  • 프로세서 : 스트림을 처리하는 하나의 단위
  • 프로세서 토폴로지 : 스트림 프로세서가 서로 연결된 그래프
  • 소스 프로세서 : 위쪽으로 연결된 프로세서가 없는 프로세서
  • 싱크 프로세서 : 아래쪽으로 연결된 프로세서가 없는 프로세서

 

 

 

카프카 스트림즈 아키텍쳐

카프카 스트림즈에 들어오는 데이터는 토픽의 메시지이다.

카프카 스트림즈는 사용자가 스레드 개수를 지정할 수 있다.

카프카 스트림즈에서는 한개의 스레드에 1개 이상의 태스크를 처리할 수 있다.

  • 스트림 파티션은 토픽 파티션에 저장된 정렬된 메시지이다.
  • 스트림 데이터 레코드는 토픽 메시지의 key-value 이다
  • 데이터 레코드의 키를 통해 다음 스트림으로 전달된다.

 

카프카 스트림즈는 입력 스트림의 파티션 개수만큼 태스크를 생성한다.

태스크에 입력 스트림 파티션이 할당된다.

태스크에 입력 스트림 파티션이 할당되면 입력 입력 토픽의 파티션이 변화가 없는 이상 변하지 않는다.

 

카프카 스트림즈를 사용하기 위해 추가로 패키지 설치는 필요하지 않다.

카프카에 이미 카프카 스트림즈가 포함되어 배포된다.

 

 

 

KSQL intro

최근의 카프카는 점차 스트리밍 처리를 위한 중간 데이터(데이터 버스)처럼 사용된다.

카프카는 다른 메시지 큐에 비해 정해진 룰으로 라우팅하는 기능과 데이터를 처리해서 다른 큐로 전달하는 기능이 부족하다.

이러한 부족한 기능을 보완하기 위해 Samza 같은 오픈소스가 존재한다.

그리고 Samza 는 람다 아키텍쳐로 설계되어있다.

 

 

 

람다 아키텍쳐

데이터를 처리해서 기간과 용량에 따라 별도의 저장소를 가져가는 것

장점 

  1. 파이프라인을 통해 큰 어려움 없이 기술들을 연결해 장기/단기 데이터를 동시에 관리할 수 있다.
  2. 병목이 생길 경우 병목이 생기는 특정 컴포넌트만을 증가시켜서 해소시킬 수 있다.
  3. 데이터 조회 영엉에서 큰 어려움 없이 단기/장기 데이터를 한번에 조회 가능하다.

단점

  1. 연결할 기술들이 너무 많아서 부담이 된다.
  2. 예산이 부족하고 인원이 작은 곳에서는 사실상 사용하기 어렵다.

 

 

 

카파 아키텍쳐

간단한 계산과 필터링은 카프카에서 직접 수행하고 계산 프로그램도 장기/단기 구분없이 동일한 프로그램을 사용하는 방식이다.

람다와의 가장 큰 차이점은 계산된 데이터 조회가 필요하면 그때 그때 계산해서 결과를 전달하는 방식이라는 것이다.

저장된 곳에서 가져오던 람다 아키텍쳐와는 달리 언제나 계산을 통해 만들어 내는 것이 카파 아키텍쳐의 핵심이다.

조회 대신 계산으로 전환함으로서 데이터 파이프라인 뿐만 아니라 데이터 관리를 단순화한다.

 

 

 

KSQL 

KSQL 은 카파 아키텍쳐이다.

KSQL 은 카파 아키테쳐 + 데이터를 가져오는 영역도 단순화 시키고 저장 기간에 관계없이 통합시켜보자는 데에서 출발했다.

 

 

 

KSQL 클라이언트

사용자는 KSQL 클라이언트를 통해 KSQL 이라 불리는 SQL 을 작성하여 KSQL 서버로 부터 데이터를 얻어온다.

기존 SQL 에서 지원하는 테이블 외에 연속된 정형화 데이터를 의미하는 스트림 이라는 데이터 모델도 제공한다.

스트림에는 데이터가 기록될 수 있지만 한번 기록되면 변경되지 않는다.

 

 

 

KSQL 서버

KSQL 서버는 KSQL 클라이언트의 KSQL 쿼리를 받아 분석, 실행 계획, 실행 까지 처리한다.

  1. 쿼리를 받는다.
  2. 받은 쿼리를 재작성한다.
  3. 재작성한 쿼리를 바탕으로 논리 계획을 작성한다.
  4. 논리 계획은 바탕으로 바탕으로 물리 계획을 작성한다.
  5. 물리 계획을 실행한다.

논리 계획과 물리 계획을 작성할 때 필요한 테이블 메타 정보는 저장소가 아닌 메모리에 저장되어 있다.

필요한 경우 ksql__commands 라는 카프카 토픽에 저장한다는 점이 SQL 엔진과의 차이점이다.

 

 

 

KSQL 스트림 생성 샘플

CREATE STREAM pageviews (viewtime BIGINT, user_id VARCHAR, page_id VARCHAR) WITH (VALUE_FORMAT = 'JSON', KAFKA_TOPIC='my-pageviews-topic');

 

 

 

KSQL 테이블 생성 샘플

CREATE TABE users (usertimestamp BIGINT, user_id VARCHAR, gender VARCHAR, region_id VARCHAR) WITH (VALUE_FORMAT = 'JSON', KAFKA_TOPIC='my-users-topic');