오늘의 수업(1103)

galoo·2023년 11월 3일
0

HelloVision Dx Data School

목록 보기
70/72

✔ Kafka

개요

  • 링크드인에서 파편화된 데이터 수집 및 분배 아키텍처 구현을 위해서 개발
  • 데이터를 생성하는 소스 애플리케이션과 데이터가 최종 적재되는 애플리케이션을 별도로 개발
  • 애플리케이션의 종류가 늘어나면서 파이프라인의 개수가 늘어나면서 소스 코드 및 버전 관리에서 이슈가 발생하기 시작했다.
  • 데이터 파편화가 발생함
  • 내부 데이터 흐름을 개선하기 위해서 새로운 시스템을 개발
    - 이것이 Kafka
    - 소스 애플리케이션과 저장하는 애플리케이션을 직접 연결하지 않고 한 곳에 모아서 처리하자
  • 결국 kafka의 목적은, 애플리케이션끼리 직접 연결해서 처리하지 않고, 한 곳에 모아 처리할 수 있도록 중앙 집중화를 하는 것이다.
    - 이래야 관리가 편하고 애플리케이션끼리의 결합도가 낮아진다.
    - kafka를 통해서 웹사이트, 애플리케이션 센서 등에서 취합한 데이터를 실시간으로 관리

  • kafka는 소스 애플리케이션에서 전송된 데이터를 Queue를 이용해서 관리
  • 큐에 데이터를 보내는것이 프로듀서이고, 큐에서 데이터를 가져가는 것이 컨슈머이다.

  • 하나의 데이터를 파티션이라하고, 파티션을 모은 것을 토픽이라 하며, 토픽 단위로 통신을 한다.
  • 카프카에 전송하는 데이터 포맷은 제한이 없음
  • 카프카가 자바(스칼라)로 만들어져서 실제로는 ByteArray로 통신
  • 실무에서는 카프카를 3개 이상을 하나로 묶은 클러스터 단위로 구동

  • 실무에서는 카프카를 3개 이상을 하나로 묶은 클러스터 단위로 구동
  • 오픈 소스이며, 깃허브 저장소에 소스 코드가 공개되어 있음
  • 데이터 파이프라인을 구성할 때, 좋은 방법 중의 하나로 카프카를 많이 사용

Data Lake, Warehouse, Mart?

Data Lake

  • 가공하지 않은 순수한 데이터의 모음

Datawarehouse

  • 데이터를 필터링하고 패키지화 한 것
  • 필요한 데이터를 가공해서 모아 놓은 것

Data Mart

  • Datawarehouse보다 적은 양의 데이터를 소유

장점

  • 높은 처리량
  • 확장성
    - 클러스터의 개념으로 동작
  • 영속성
    - 종료되더라도 데이터를 유지

카파 아키텍처

  • 람다 아키텍쳐에서 배치 레이어를 제거
  • 배치 레이어를 두게 되면, 데이터를 실시간으로 처리하지 않기 때문에 데이터를 처리하는 로직의 파편화, 디버깅, 배포, 운영에 대한 분리 등의 이슈가 발생
  • 일정한 주기를 가진 배치 데이터도 스트림으로 바로바로 처리
    - 모든 데이터를 로그(데이터의 집합 - Byte Array)로 바로 보는 시점

스트리밍 데이터레이크

  • 기존의 방식에서는 데이터를 수집하고, 서빙 레이어(Hadoop, S3 등..)에 저장해서 사용
  • 최근에는 서빙 레이어를 제거(이미 분석된 데이터를 저장하자)하는 방식으로 발전하면 서빙 레이어가 필요가 없어짐
    - 이전에는 수집 데이터 != 사용데이터
    - 최근에는 수집 데이터 뿐 아니라, 분석된 결과도 동일한 곳에 저장
    - 데이터 수집 애플리케이션이 있으면, 이를 카프카랑 연결해서 데이터 분석 및 사용하는 애플리케이션에 전달하는 구조
    - 최근에는 데이터 수집 애플리케이션과 데이터 분석 및 사용 애플리케이션 모두를 kafka랑 연결해버림
    - spark이 원래는 kafka 뒤에 있었는데, 이제는 앞으로 나올 수 있음
    - kafka에 저장하는 것도 있고, 데이터를 가져오는 것도 있음 spark에는 현재
  • 비용이 많이 발생함
  • 데이터를 자주 사용하는 곳에서는 이 아키텍쳐를 고민하지만, 아직까지는 카파 아키텍쳐를 많이 사용

✔ Kafka와 같이 사용되는 애플리케이션

Zookeeper

  • 카프카의 브로커를 관리하는 애플리케이션
  • kafka를 사용할 때 필수

Confluent

  • 카프카의 데이터를 SQL을 이용해서 조회할 수 있도록 해주는 애플리케이션

✔ Docker를 이용해서 Kafka를 설치하고 콘솔에서 사용해보자

Docker에 설치

  • Zookeeper와 Kafka 이미지르 ㄹ다운로드 받아서 설치하고 연결
  • 2개의 이미지를 설치해서 연결
    - docker-compose(aws에서는 task-definition)
  • docker-compose.yaml 파일을 작성하자
  • docker-compose -f docker-compose.yaml up --build

토픽(하나의 데이터 묶음) 생성 및 구독

  • 토픽 생성
    - 먼저 생성해도 되고, 데이터 전송시 없는 토픽이름을 사용하면 자동 생성
    - kafka접속 : docker exec -it kafka /bin/bash
    - kafka 명령어가 있는 곳으로 디렉토리 이동 : cd /opt/kafka/bin
    - 토픽 생성
    - kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 --partitions 1 --topic exam-topic
    - 물론 삭제하려면 create가 아니라 delete 하면 된다.
  • 메시지 전송 창을 생성
    - kafka-console-producer.sh --topic exam-topic --broker-list localhost:9092
  • 메시지 수신 창을 생성 - 다른 터미널을 생성해서 작업하자
    - kafka-console-consumer.sh --topic exam-topic --bootstrap-server localhost:9092

  • 동기화 되었다. 해당 토픽 이름으로 송수신을 합니다.

python에서 메시지 전송 애플리케이션을 생성

  • kafka 사용 라이브러리를 설치
    - pip install kafka-python
  • exam-topic을 송.수신하는 py파일 두개를 만들어보자.
  • 실행은 python name.py 해보면 되겠지
  • consumer는 무한 반복(대기)하면서 있는다.
  • producer는 한번 보내고 끝난다.

  • 여길 보면 python으로 실행해서 하는거랑 console에서 kafka 명령어 해서 받는거랑 독립적으로 사용 가능하다.

✔ Kafka를 EC2에 설치해보자

EC2에 접속

EC2에서 2181, 9092포트를 외부에서 사용할 수 있도록 설정하기

profile
밀가루 귀여워요

0개의 댓글