본문 바로가기

[Data Engineering]/[Kafka]

[Kafka] Intro. + AWS에 Kafka 브로커 생성하기

728x90

[하나씩 배우고 싶은데, 프로젝트는 기다려주질 않고...]

 

아파치 카프카 애플리케이션 프로그래밍 with 자바 - YES24

아파치 카프카 애플리케이션 개발을 위한 「실전 가이드」아파치 카프카란 무엇일까? 카프카 애플리케이션은 어떻게 만들까? 데이터 파이프라인을 만들기 위해 어떤 카프카 라이브러리를 사용

www.yes24.com

 < 공부 + 이 포스팅에 참고 중인 서적. 몰랐는데 원영님이 학교 선배...! >

추천시스템 프로젝트를 시작하면서 내가 써보고 싶었던 것은 FastAPI, AWS S3(Object Storage), 그리고 빅데이터 아키텍쳐였다. 앞의 두개는 금방 배우고 적용했는데, 그나마 제일 베이스가 많았던 빅데이터 아키텍쳐는... 역시 쉽지않다. 알아야 할게 너무 많아!!! Spark..ML공부하기도 벅차..제대로 알고 쓰고 있는건지도 모르겠어! 아무튼 이번에는 AWS 상에  Kafka 브로커를 생성하는 법을 기록으로 남기려고 한다. 참고중인 서적을 위에 남겼는데 깔끔하고 이해하기 쉽게 정리가 잘 되어있다. 강추!!

[Kafka가 뭔데!]

카프카는 결국 데이터 파이프라인의 '파편화' 문제를 해결하고 데이터를 '중앙집중화' 하기 위해 만들어졌다. 마치 신체의 척추처럼 일종의 '중추신경' 역할을 하는 것이다. 그럼 파편화란 무엇이고, 데이터를 중앙집중화 해야하는 이유는 무엇일까? 핵심은 End-to-End 구조에 있다. 이 소스-타겟이 직접 연결된 구조는 데이터의 양이 적을 경우에는 아무 문제가 되지 않고 오히려 운영이 편할 수 있다. 하지만 이 End-to-End의 데이터 라인이 엄청 많아진다면 이걸 어떻게 다 관리해야 할까? 관리도 관리고 하나가 문제가 생기면 그 에러가 다른 라인에까지 영항을 미칠 가능성이 굉장히 높다! 그래서 아키텍쳐를 아래 그림처럼 바꾼 것이다.

이렇게 카프카를 중앙에 두면 소스와 타겟간의 의존도를 최소화 할 수 있다. 동시에 End-to-End 방식의 적재방식에서, 안정적이고 확장성이 높은 '데이터 파이프라인' 으로 기능할 수 있다. 따라서 Kafka는 다음의 4가지 장점을 가진다. 

  • 높은 처리량 : 데이터를 배치 + 빠르게 -> 실시간으로!
  • 확장성 : Scale in-out
  • 영속성 : 다른 메세징 플랫폼과 다르게 메모리가 아닌 파일 시스템(운영체제 레벨에서의 페이지 캐시를 활용해서 속도도 보완)에 저장!
  • 고가용성 : '그' HA

카프카는 장점이 많은 많큼 많은 기업에서 사용중이다. 그리고 활용방법도, 기능도 계속 업그레이드 중인 매력적인 플랫폼이다! 처음에 카프카는 데이터 레이크 아키텍처 중에 '람다 아키텍처' 중 실시간 데이터 영역 처리를 담당하는 ETL-pipeline(speed-layer)에서 역할했다. 그러다가 제이크 크랩스(kafka를 만든 사람)이 '카파 아키텍처'를 제안하면서 이사람은 람다 아키텍터에서 뭘 자꾸 뺀다...Speed-layer가 Batch-Layer, Serving-Layer의 영역까지 점점 통합해 버리면서 Kafka의 역할이 점점 커졌다! 아직 자주 접근하지 않는 데이터를 비싼 자원에 유지하는 문제, 데이터를 쿼리할 수 있는 주변 데이터 플랫폼의 필요성 의 문제가 남아있지만 충분히,,, 멋지다!

 

[Kafka - AWS에 구성하기]

다행히 전에 Redis, RabbitMQ를 아주 쬐끔(?) 다뤄본 적이 있어서 컨슈머나 브로커의 개념이 생소하지는 않았다. 이번에는 AWS에 Kafka 브로커를 구축해본다. AWS 에서의 Kafka는 MSK(Managed Service Kafka)를 사용할 수 도 있고 EC2에 설치해서 사용할 수 도 있다. 그 중에서 EC2에 직접 설치해서 사용하는 방법을 기록으로 남긴다.

1. 먼저 인스턴스를 생성한다. 나는 프리티어, t2.micro를 사용했고, 인바운드 규칙은 보안수준에 맞춰 설정해주자. 다만 카프카 브로커와 주키퍼가 돌아갈 예정이기 때문에 각각의 기본 포트인 9092, 2181번은 열어주어야 한다.

 

2. Java 설치

sudo yum install -y java-1.8.0-openjdk-devel.x86_64

 

3. 주키퍼, 카프카 브로커 바이너리 패키지 다운로드, 실행

wget https://archive.apache.org/dist/kafka/2.5.0/kafka_2.12-2.5.0.tgz
tar xvf kafka_2.12-2.5.0.tgz

 

4. (t2.micro 한정) Kafka broker heap memory 축소(환경변수로 선언)

export KAFKA_HEAP_OPTS="-Xmx400m -Xms400m"
echo $KAFKA_HEAP_OPTS

그 후에 인스턴스가 종료되고 나서도 쓸 수 있도록 .bashrc에 넣어준다. 저 KAFKA_HEAP_OPTS는 나중에 .sh스크립트에 적용된다.

 

5. 브로커 실행 옵션 설정 (advertised.listener: 카프카 클라이언트를 브로커와 연결할 때 사용) -> 자기 인스턴스 public ip로 설정!

nano config/server.properties

 

6. 주키퍼 실행!(스크립트를 사용하면 바로 백그라운드로 실행)

bin/zookeeper-server-start.sh -daemon config/zookeeper.properties
jps -vm

 

7. Kafka 브로커 실행 및 로그 확인

bin/kafka-server-start.sh -daemon config/server.properties
jps -m
tail -f logs/server.log # 아까 server.properties 설정할때 보면 로그파일도 지정해둠

 

8. 이제 마지막으로 로컬에서 EC2 Kafka와 통신이 잘 되는지 확인한다! 브로커 정보를 요청해보면 굳이 컨슈머를 만들지 않아도 확인가능! 그러면 브로커 정보는 어떻게 요청할까? Kafka에서는 브로커의 정보를 가져올 수 있는 kafka-broker-api를 제공한다. 카프카 바이너리 패키지에 있다!

curl https://archive.apache.org/dist/kafka/2.5.0/kafka_2.12-2.5.0.tgz --output kafka.tgz

그 다음 bin/kafka-broker-api-versions.sh --bootstrap-server 를 통해 스크립트를 실행하면.... 짠!

bin/kafka-broker-api-versions.sh --bootstrap-server EC2-public-ip:9092

 

 

끝! 

 

728x90