나누고 싶은 개발 이야기

Data Engineer로서 기록하고 공유하고 싶은 기술들. 책과 함께 이야기합니다.

전체 글 104

Kafka Connect docker image 만들기

이번 글에서는 Kafka Connect를 쿠버네티스(이하 K8s)에서 구축하기 위해 도커 이미지를 만드는 방법에 대해서 설명하려고 한다. 이 말을 들었을 때, "왜 이미지를 따로 만들지?"라고 생각할 수 있다. 왜냐하면 컨플루언트에서 제공하는 도커 이미지가 있기 때문이다. 하지만 필자는 직접 이미지를 만들기로 했다. 이유는 Kafka Connect 내에 따로 개발한 Connector들을 빌드할 때, 해당 Connector들을 포함한 Kafka Connect 도커 이미지를 만들고 싶었다. 그리고 현재 운영 중인 환경과 동일한 버전으로 구성된 도커 이미지를 만들어서 환경 차이에 따라 혹시 발생할지 모르는 문제를 피하고 싶었기 때문이다. 그럼 도커 이미지를 만드는 내용에 들어가기 앞서 왜 쿠버네티스 환경에서 ..

Big Data/Kafka 2024.07.19

schema registry HA 구성

이번 글에서는 schema registry를 HA로 설정하는 방법에 대해서 설명한다. 하지만 HA를 구성하기 위한 설정은 생각보다 단순하기 때문에 schema registry에 대해서 대략적으로 소개한다. 그리고 설치가 완료된 schema registry를 사용해서 카프카에 avro 포맷으로 데이터를 보내고 읽는 kafka-avro-console-producer와 kafka-avro-console-consumer를 사용해서 테스트하는 방법까지 해보자. 1. 개요 먼저 schema registry에 대해서 간략히 설명한다. 한 문장으로 설명하면 카프카에 기록할 메시지의 데이터 스키마를 관리하고 검증하는 서비스이다. 스키마를 관리하고 검증한다고 표현했는데 관리는 스키마를 기록하고 유지하는 역할이며, 검증은 ..

Big Data/Kafka 2024.03.12

Scala의 Enum

scala의 enum은 java와 같이 enum 키워드로 존재하지 않았다. 이 문장은 scala 3이 도입되면서 거짓이 되었다. scala 3에서 새롭게 디자인되었는데 scala 2의 문제점은 무엇이었는지 궁금해서 찾아보게 됐다. 1. Enumeration scala 2에서는 앞서 말한 대로 enum 키워드가 존재하지 않는다. 대신 Enumeration 클래스를 상속해서 사용한다. scala API 문서에 올라온 코드를 예를 들면 아래와 같이 사용한다. object WeekDay extends Enumeration { type WeekDay = Value val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value } 별도로 지정한 이름으로 Enumeration을 생성하려면 Valu..

Language/scala 2023.12.17

[Kafka] Producer Partitioner 변천사 (no key)

이번 글에서는 producer에서 데이터를 보낼 때, 데이터의 토픽 파티션 분배에 대해서 살펴봅니다. 특히 Key값이 정해지지 않았을 때 파티션 분배가 어떤 로직으로 이루어지는지 분석합니다. 카프카의 버전이 올라가면서 파티션 분배의 단점들을 개선하는 시도들이 이루어지는데 초기 버전에서부터 시작하여 현재의 분배 로직이 이루어진 과정에 대해 소개합니다. 1. 개요 (파티션) 카프카를 써 보신 분들이라면 파티션의 존재 이유에 대해서 아실 것입니다. 카프카는 분산 시스템으로 대규모의 데이터 처리를 위해 여러 파티션을 두고 데이터들을 분산해서 저장합니다. 파티션 분배 로직이 카프카 브로커에 존재하지 않나?라고 생각하실 수도 있는데, 파티션 분배 로직은 producer 내부에 존재합니다. 그리고 producer의..

Big Data/Kafka 2023.05.16

AtomicIntegerFieldUpdater

멀티 스레드 환경에서 원자성을 보장하는 Integer 변수가 필요하다면 대체로 AtomicInteger를 많이 사용한다. 그런데 AtomicInteger를 클래스 내부 변수에 추가해 사용하면 클래스 객체를 만들 때 마다 내부에 AtomicInteger 객체도 만들어지므로 이중으로 객체가 생성된다고 볼 수 있다. 예를 들면 아래와 같다. public class BaseClass { private final AtomicInteger counter = new AtomicInteger(); public add() { counter.getAndIncrement(); } } AtomicInteger는 getAndIncrement, getAndDecrement 같은 함수를 제공하며, 멀티 스레드 어플리케이션에서 카운..

Language/Java 2023.04.08

Raft 알고리즘 요약

오늘 글 에서는 합의(consensus) 알고리즘 중 하나인 Raft 알고리즘(이하 Raft)에 대해서 설명한다. Raft에 대해서 조사를 하게 된 이유는 Kafka에서 Zookeeper을 제외하는 대신 Controller의 역할 수행을 위해 Raft의 일부 개념을 가져와서 구현했기 때문이다. Kafka에서 사용하는 Raft는 정확히 같은 동작방식을 사용하는 것은 아니다. 크게 차이가 나는 부분은 로그 복제 부분이다. 대표적으로 Raft는 push 방식으로 controller가 데이터를 각 follower에 보내지만 Kafka에서는 pull 방식으로 follower들이 데이터를 가지고 온다. 이 글에서는 그 차이점에 대해 설명하기 보다 Raft 논문에서 설명하는 leader 선정 과정 및 로그 복제 방법..

Algorithm 2023.03.30

[Spark] event log의 spark 옵션 Elasticsearch 적재

이번 글에서는 spark 관리자 역할에서 사용하고 있는 spark 버전 및 설정 정보를 수집하여 dashboard 형태로 모니터링하는 방법에 대해서 공유한다. 이런 아이디어를 생각하게 된 이유는 다른 사용자에 의해서 사용되는 spark 버전들을 관리하고 최신의 버전으로 가이드하기 위해서는 먼저 현황 파악이 우선되어야 했기 때문이다. 사실 spark는 event log를 적재하여 history server를 통해 spark job의 실행 결과를 분석할 수 있다. 문제는 history server의 UI에서는 전체적인 현황을 파악하기 보다는 한 개의 job에 대한 분석을 하는데 더 용이하다는데 있다. 그래서 일부 spark 옵션에 대해서만 수집해서 spark job들의 옵션들을 통합하고 통계화하면 spark..

Big Data/Spark 2023.03.20

[ksqlDB] concepts

ksqlDB 공식 문서를 보면 concepts 항목에 ksqlDB를 이해하기 위한 주요 개념들을 설명하고 있다. 이 글을 concepts 공식 문서의 내용을 간략하게 요약했다(글에 포함된 사진은 ksqlDB 공식 문서에서 가져왔다). 전체적인 개념만 파악하는 용도로 이 글을 활용하고 자세한 사항은 ksqlDB의 공식문서를 읽어보자. 1. ksqlDB란? 전통적인 RDB를 활용한 방식이 아닌 Event 처리 관점으로 어플리케이션을 개발하기 위한 목적으로 만들어졌다. Event는 시간의 흐름 안에서 특정 시점에 발생하고 기록된 데이터이다. ksqlDB는 Event를 쉽게 사용하게 한다는 목적을 지향한다. 그리고 Event의 저장 및 처리 기능을 카프카 플랫폼에 두고 그 위에 추상화하는 형태로 만들어졌다. E..

Big Data/Kafka 2022.12.22

[ksqlDB] High Availability를 위한 설정

ksqlDB에서 HA(High Availability)를 무슨 작업을 위해서 존재할까? HA는 한글로 고가용성이라는 명칭으로 해석된다. 고가용성은 클러스터로 묶여 있는 서버들 중에 일부가 다운되더라도 서비스에 영향이 없어야 한다. ksqlDB에서의 고가용성은 pull query에서 필요하다. pull query에서의 고가용성을 위해 materialized state를 다른 서버에 복제해둬야 한다. materialized state의 복제를 위해서 ksqlDB의 기본 설정에서 변경해야할 값이 있다. 1. ksqlDB 클러스터 서버들의 내부 통신 listeners=http://0.0.0.0:8088 ksql.advertised.listener=http://host1.example.com:8088 기본 설정에..

Big Data/Kafka 2022.12.17

hadoop 2.6.0 버전을 위한 spark 3.x 빌드

이번에는 spark 빌드 관련해서 이야기를 하려고 합니다. spark은 대부분 hadoop yarn 기반에서 실행하는 경우가 많습니다. 하지만 hadoop cluster의 버전이 회사의 환경에 따라 다르므로 빌드하는 spark 버전에 따라 호환성을 잘 살펴야 합니다. 필자는 낮은 버전의 hadoop을 사용하고 있는데, 사용 하는 hadoop이 spark의 어느 버전까지 빌드해서 사용 가능한지 검토하게 됐습니다. 이 글은 그런 경험을 토대로 정리하는 목적으로 쓰게 됐습니다. 실행 가능한 spark 배포판을 빌드할 때, 사용하는 hadoop 버전을 명시해서 빌드를 합니다. 예를 들어 hadoop 3.3.0 버전을 사용할 때 아래와 같이 옵션을 넣어서 spark 배포판을 빌드합니다. ./build/mvn -P..

Big Data/Spark 2022.09.28

MirrorMaker2 소개 발표

2022년 4월 14일. Kafka 한국 사용자 모임 Virtual Meetup에서 발표를 했습니다. 주제는 MirrorMaker2 소개 입니다. MirrorMaker2를 처음 들어보시는 분들에 맞춰서 기초적인 내용을 포함하여 자료를 준비했습니다. MirrorMaker2의 아키텍처, 활용, 모니터링, 운영 팀의 목차로 구성되었습니다. Kafka 한국 사용자 모임 Github에도 올라갈 예정이나 먼저 블로그에 자료 공유합니다.

Big Data/Kafka 2022.04.15

[Kafka] Avro Consumer의 GenericRecord schema

이번 글에서는 KafkaAvroDeserializer를 사용한 컨슈머에 대해서 이야기하려고 한다. KafkaAvroDeserializer를 사용했다는 것은 Schema-Registry(이하 스키마 레지스트리)를 사용했다는 의미이다. 스키마 레지스트리를 간단히 설명하면 Confluent에서 제공한 Schema 관리 시스템이다. 카프카로 들어오는 레코드들의 버전 관리가 필요할 때 스키마 레지스트리를 사용한다. 도입부에 많은 용어들을 나열했는데 기본적인 내용을 먼저 정리해야 이 글에서 이야기할 내용이 전달될 수 있을 듯 하다. 다음 용어들의 개념을 간단히만 살펴보고(자세한 내용은 링크 추가) 이해를 돕고자 한다. AVRO(이하 에이브로) 스키마 스키마 레지스트리 1. 에이브로 에이브로는 스키마, 스키마 레지스..

Big Data/Kafka 2021.12.30
반응형