출처 : https://if.kakao.com/2020/session/116
if(kakao)2020
오늘도 카카오는 일상을 바꾸는 중
if.kakao.com
Apache Flink를 이용하여 카카오의 로그 파이프라인을 개선한 경험을 소개합니다. 카카오의 전사 로그 파이프라인과 apache Flink에 대한 개념을 설명합니다.
리뷰 포인트
- log pipline, streaming 소개
- Apache Flink 기반 log streaming pipline 프로젝트 소개
log pipline, streaming 소개
- 용어
- Pipline
- 데이터 처리 단계의 출력이 다음 단계의 입력으로 이어지는 구조
- src와 dst가 있는 데이터의 흐름
- 데이터의 전송과 변환을 자동화
- 실시간성과 배치성을 모두 포함
- Log Pipline
- 로깅 데이터를 처리하는 파이프라인
- Streaming
- 데이터의 연속적인 흐름안에서 연속적인 연산과 처리를 하는 것
- 실시간성을 가지고 있다
- Lambda Architecture
- 실시간 분석을 지원하는 빅데이터 아키텍처로 대량의 데이터를 실시간으로 분석하기 어려우니 batch로 미리 만든 데이터와 실시간 데이터를 혼합해서 사용하는 방식이다. [Minsub's Blog]
- Pipline
- 기존 카카오의 Log Pipline KEMI (그림 1)
- 카카오의 모든 리소스(네트워크 장비, 가상 머신, 물리 머신, 컨테이너 등)에서 발생하는 데이터를 수집, 저장, 가공하고 이것을 필요한 이벤트로 만들어서 적재적소에 전달하는 역할을 하는 플랫폼
- KEMI Log Architecture는
- 람다 아키텍쳐를 따른다.
- 여러 리소스에서 생성되는 로그들이 fluentd를 통해 KEMI Log Aggregator로 모인다.
- Aggregator는 버퍼역할을 수행하고 여기에 취합된 로그 데이터는 하둡과 kafka에 동시에 전송된다.
- 하둡에 저장된 로그 데이터 처리
- 일정 주기로 데이터를 Elasticserch에 전송하고 필요에 따라 kibana를 통해 대쉬보드 형태로 로그 데이터를 확인할 수 있음 (배치성, 대쉬보드화)
- Hive를 통해 로그 데이터를 직접 확인할 수 있음 (실시간성, 쿼리 가능)
- kafka에 저장된 로그 데이터 처리
- Log Tailer를 통해 로그 데이터를 실시간으로 확인할 수 있음 (실시간성, 쿼리 힘듬)
- DIKE를 통해 로그 데이터 기반 알람을 받을 수 있음 (실시간성, 대응)
Apache Flink 기반 log streaming pipline 프로젝트 소개
- 핵심 요구사항
- 로그 데이터를 실시간으로 대쉬보드로 시각화해서 볼수는 없을까?
- 추가 요구사항
- 필터가 가능했으면
- 요청에 따라 ElasticSearch 적재를 옵션처럼 선택할 수 있었으면 (ES가 너무 비싸다)
- 확장 가능했으면
- 신뢰성이 높았으면
- 다양한 data Sink(데이터 목적지)를 지원했으면
- 하둡의 YARN처럼 리소스 관리가 가능했으면
- 전송, 변환, 적재가 자유롭도록 다양한 기능이 있었으면
- 해결 과정
- 기존에 하둡을 기반으로 배치 처리되던 Elasticserch를 Kafka 기반으로 실시간 처리하자
- 어떻게 kafka와 ElasticSearch 사이에 실시간 파이프라인을 만들지?
- Stream processing framework인 Apache Flink를 사용하자
- 왜?
- 무한하고 경계가 없는 Stream을 처리하기 위해 최적화된 컴퓨팅 엔진
- 분산 병렬 처리
- checkpoint 알고리즘을 통한 exactly-one (반드시 한 번 전달됨을 보장함)
- standalone(하둡처럼 혼자 클러스터를 구축할 수 있음), YARN, Mesos, Kubernetes 배포 지원
- 왜?
- Apache Flink 소개
- 자바 기반 프로젝트 (JVM위에서 돌아감)
- 구성 요소
- Job Manager(Master)
- Dataflow graph : 사용자가 정의한 Job에 대한 Overview, 이를 Task Manager에 적절하게 분배함
- Task sacheduling
- Checkpointing
- Recovery
- Task 관리 : Task의 상태, 통계정보 등을 수집하여 관리
- Actor System : Task Manager와 통신
- Task Manager(Worker)
- Task Slot들 : Task들이 할당되는 공간
- Task execution
- Actor System : Job Manager와 통신
- Network Manager : 다른 Task Manager 와 Data Stream 통신
- 하지만 이 기능은 네트워크 비용이 발생하기 때문에 Dataflow graph를 적절히 쪼개서 최대한 Task Manager간 통신이 발생하지 않게 하는 것이 좋다.(Task chaining / SlotSharingGroup / CoLocation)
- Job Manager(Master)
- Bifrost 프로젝트
- 특징
- Flink 기반 Kafka to Elasticsearch pipline
- on Kubernetes cluster
- monitoring By Prometheus
- 사내 API 연동(filter & transformation)
- MinIO 기반 checkpoint for reliability
- 아키텍처
- 쿠버네티스 클러스터 상에 Job Manager, Task Manager를 각각 Pod 형태로 띄운다.
- 장애 시 쿠버네티스로 복구 가능
- 쿠버네티스 서비스 객체로 배포되었기 때문에 Prometheus를 통해 모니터링 가능
- checkpoint를 위해 Object Storage인 MinIO를 연결하여 사용
- 쿠버네티스 클러스터 상에 Job Manager, Task Manager를 각각 Pod 형태로 띄운다.
- 데이터 흐름
- Task Manager들이 Kafka에서 데이터를 consume함
- consume한 데이터를 Filtering, Transformation을 수행후 ElasticSerch로 insert
- 모니터링 해야 하는 지표
- Backpressure
- 어떤 파이프라인의 입구는 넓고 출구가 좁다면 출구의 압력은 높아진다. 이처럼 데이터 파이프라인도 데이터가 많이 입력되는데 출력은 조금씩 된다면 대기하는 데이터가 많아지고 Backpressure 값이 증가하게 된다
- Custom metric
- kafka
- kafka lag / fetch rate / fetch latency / io wait time
- network 관련 지표
- JVM
- Job Manager CPU, Heap
- Task Manager CPU, Heap, young generation GC
- checkpoint duration
- Backpressure
- 특징
마무리
카카오의 로그 파이프라인을 책임지는 KEMI 플랫폼 통해 로그 수집부터 모니터링까지의 로그 파이프라인을 공부할수 있었고, Exactly one을 보장하는 실시간 처리 프레임워크인 Flink를 공부할 수 있었다. 특히 파이프라인을 구성하고 잘동작하는지 확인하기 위해 모니터링해야 하는 지표에 대한 이야기는 경험을 통해 얻을 수 있는 정보이기 때문에 더 도움이 되었다.
'Review' 카테고리의 다른 글
[if(kakao) 2021] 실시간 로그 처리를 위한 Flink on k8s 구축 사례 Review (0) | 2022.05.19 |
---|---|
[if(kakao) 2020] How to make log based Alert with Flink Review (0) | 2022.05.19 |
[if(kakao) dev 2019] 카카오톡 적용 사례를 통해 살펴보는 카카오 클라우드의 Kubernetes as a Service Review (0) | 2022.05.17 |
[if(kakao) dev 2019] Airflow를 활용하여 아름다운 데이터 파이프라인 구성하기 Review (0) | 2022.05.17 |
[if(kakao) dev 2019] 광고 데이터 처리 시스템 소개 Review (0) | 2022.05.16 |