Kafka/Connect

Kafka Connect 구성요소

재심 2023. 4. 22. 21:34

목차

    [용어 정리]

    Kafka Connect 흐름

    • Connect: Connect가 공식명칭으로 카프카로 데이터를 전달하고 읽어오는 스트림 프레임워크를 지칭한다.
      • connect는 connector(task) + transform + converter 형태로 구현된다. 
    • Connector: 데이터 스트리밍을 위한 상위 레벨의 추상화. 어디서 어디로 데이터를 내보내는가에 대한 정의
    • Worker: Connector와 Task가 실행되는 프로세스
    • Task: 실제로 외부 시스템에 데이터를 전달하기 위한 구현체
    • Converter: 데이터들을 Connector에서 변환하기 위해 사용하는 것. (Ex: Object → ByteArray)
    • Transform: 각각의 메시지를 요구사항에 맞게 변환하는 단순 로직
    • Dead Letter Queue: Connector가 에러를 처리하는 방법. 
      • Ex: SinkConnector가 데이터를 읽었는데 오류가 발생할 경우 전체 프로세스에는 영향 없이 별도로 오류를 보관해 추후 처리할 수 있도록 함

    Connector

    데이터를 어디서 어디로 전송하는가에 대한 정의를 함.

    구조

    • Connect Instance: Kafka와 외부 시스템간의 데이터 복사를 관리하는 논리적인 작업
    • Connector Plugin: Connector를 구현한 클래스의 모음.
      • jar파일로 존재하며 confluent hub에서 확인하고 다운로드 할 수 있다. 
      • custom connector 구현도 가능

     

    전체적으로 보면 Source에서 데이터를 읽고 스트림 처리 후 Sink System에 다시 쓰는 방식으로 많이들 사용한다. 

    즉, ETL과 유사한 방식의 동작을 한다. 

     

    Task

    Connect에서 작업을 수행하는 일종의 액터모델.

    Connect Instance가 Task를 관리하면서 실제 데이터 전송을 조절한다.  (ex: 몇개의 태스크를 어디서 돌릴것인가?)

     

     

    1. src data  커넥터 인스턴스에서 작업에 필요한 데이터를 가져옴 → Kafka
    2. internal convertor : src data에서 데이터 어디까지 갖고왔는지 처리,  Internal offset 정보를 만들고 저장함 
      1. distributed mode : kafka internal topic에 저장
      2. standalone mode : local disk에 저장
    3. key/value convertor : key-value convertor를 통해 변화, converted 된 데이터를 실제로 카프카로 전송
    4. 카프카에서는 실제 저장 대상 토픽에 저장

     

     

    Converter

    Kafka Connect - Converter

    데이터를 수신했을 때 데이터를 변환하는 작업

    기본적으로 제공하는 Converter들이 있으며 필요 시 커스터마이징 할 수 있다.

    • AvroConverter
    • ProtobufConverter
    • JsonConverter
    • StringConverter
    • ByteArrayConverter

     

    Transform

    Kafka Connect - Transform

    개별 메시지를 변환하는 작업.

    타입변환, 필드삭제, 헤더삭제, 필드추출 등의 "단순한" 작업을 수행.

    커스텀 트랜스폼도 가능하다. 

     

    Kafka Streams/KsqlDB는 Exactly Once Semantics를 지원하나 아직 많은 Connector들이 이를 지원하지 않아 많은 Connector들이 아직까지는 At Least Once까지만 보장한다. 

     

    복잡한 작업의 경우 스트림 처리를 권장한다. (Kafka Streams, KsqlDB, Apache Flink) 

    커넥터의 가장 중요한 목적은 데이터를 실어나르는 것이다.

    복잡한 로직은 성능상의 문제를 일으킬 소지가 있으므로 스트림처리를 권장하는 것이다. 

     

    Transform은 Chaining기능도 있어서 여러개의 트랜스폼을 순차적으로 처리할 수도 있다. 

     

     

    (src → source connector → transform(createKey) → transform(extractFoo) → converter → kafka)

     

    => Converter와 Transform은 Connect레벨의 구현이다. 그러므로 모든 Connector가 이 기능을 지원한다고 이해하면 된다.

     

    Dead Letter Queue

    넘어온 데이터가 형식에 맞지 않다거나해서 오류가 발생할 경우 이를 기록할 별도의 토픽.

    (ex. sink sys와 맞지 않는 포맷 혹은 잘못된 데이터가 넘어올 경우)

     

    error.tolerance

    • none: 잘못된 레코드가 오면 Task가 종료되고 failed 되어 멈추게 됨.
    • all: 무시하고 계속 처리. Dead Letter Queue로 전송가능하다. 필요한 경우 이 Dead Letter Queue를 별도로 후처리하면 된다. 

    error.deadletterqueue.topic.name: Dead Letter Queue로 활용할 토픽명, 없으면 default 값

     

    Internal Topics

    카프카 커넥트는 정보를 내부 토픽으로 관리한다.

    커넥트 생성 시 토픽이 3개 생성되며 compacted 토픽으로 구성 (RF=3, ISR=2)

    • offset: 데이터 처리 위치를 저장하는 토픽 (내가 어디까지 처리했지?, consumer_offsets와 유사)
    • status: 커넥터의 상태를 저장하는 토픽
    • config: 커넥터의 설정 정보를 저장하는 토픽

     

    각각의 토픽은 원하는 이름으로 생성할 수 있으며 각 클러스터는 각각의 내부토픽을 갖게 된다. (기본적으로 group.id를 바탕으로 설정된다.)

     

    Connect의 내부 토픽들