본문 바로가기

Review

[if(kakao)2020] Flink 기반 log streaming pipeline - log와 사용자를 잇는 무지개 다리

출처 : 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 프로젝트 소개

 

[그림 1] KEMI Log Architecture

log pipline, streaming 소개

  • 용어
    • Pipline
      • 데이터 처리 단계의 출력이 다음 단계의 입력으로 이어지는 구조
      • src와 dst가 있는 데이터의 흐름
      • 데이터의 전송과 변환을 자동화
      • 실시간성과 배치성을 모두 포함
    • Log Pipline
      • 로깅 데이터를 처리하는 파이프라인
    • Streaming
      • 데이터의 연속적인 흐름안에서 연속적인 연산과 처리를 하는 것
      • 실시간성을 가지고 있다
    • Lambda Architecture
      • 실시간 분석을 지원하는 빅데이터 아키텍처로 대량의 데이터를 실시간으로 분석하기 어려우니 batch로 미리 만든 데이터와 실시간 데이터를 혼합해서 사용하는 방식이다. [Minsub's Blog]
  • 기존 카카오의 Log Pipline KEMI (그림 1)
    • 카카오의 모든 리소스(네트워크 장비, 가상 머신, 물리 머신, 컨테이너 등)에서 발생하는 데이터를 수집, 저장, 가공하고 이것을 필요한 이벤트로 만들어서 적재적소에 전달하는 역할을 하는 플랫폼
    • KEMI Log Architecture는
      • 람다 아키텍쳐를 따른다.
      • 여러 리소스에서 생성되는 로그들이 fluentd를 통해 KEMI Log Aggregator로 모인다.
      • Aggregator는 버퍼역할을 수행하고 여기에 취합된 로그 데이터는 하둡과 kafka에 동시에 전송된다.
      • 하둡에 저장된 로그 데이터 처리
        • 일정 주기로 데이터를 Elasticserch에 전송하고 필요에 따라 kibana를 통해 대쉬보드 형태로 로그 데이터를 확인할 수 있음 (배치성, 대쉬보드화)
        • Hive를 통해 로그 데이터를 직접 확인할 수 있음 (실시간성, 쿼리 가능)
      • kafka에 저장된 로그 데이터 처리
        • Log Tailer를 통해 로그 데이터를 실시간으로 확인할 수 있음 (실시간성, 쿼리 힘듬) 
        • DIKE를 통해 로그 데이터 기반 알람을 받을 수 있음 (실시간성, 대응)

 

[그림 2] log streaming pipline

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)
  • 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를 연결하여 사용
    • 데이터 흐름
      • 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

 

 

마무리 

카카오의 로그 파이프라인을 책임지는 KEMI 플랫폼 통해 로그 수집부터 모니터링까지의 로그 파이프라인을 공부할수 있었고, Exactly one을 보장하는 실시간 처리 프레임워크인 Flink를 공부할 수 있었다. 특히 파이프라인을 구성하고 잘동작하는지 확인하기 위해 모니터링해야 하는 지표에 대한 이야기는 경험을 통해 얻을 수 있는 정보이기 때문에 더 도움이 되었다.