본문 바로가기

Review

[if(kakao) 2020] How to make log based Alert with Flink Review

출처 : https://if.kakao.com/2020/session/112

 

if(kakao)2020

오늘도 카카오는 일상을 바꾸는 중

if.kakao.com

Apache Flink 플랫폼을 이용하여 Log를 기반으로 알람을 보내는 방법을 설명합니다.
추가로 플링크의 윈도우의 개념과 동작 방식, 플링크의 워터마크 흐름 및 개념을 설명합니다.

 

리뷰 포인트

  • Flink Window 소개
  • 카카오의 Log 알람 Process

 

Flink Window 소개

  • Apache Flink : Data Stream을 처리하는 프레임워크
  • 구성 요소
    •  Window
      • Data Stream의 무한하고 연속적인 Element들에 대해 Window 단위로 시작과 끝을 정의함
        • Tumbling Window : Element a, b, c, d가 있을 때 [a, b] -> [c, d]로 Window
        • Sliding Window : Element a,b,c,d 가 있을 때 [a, b] -> [b, c] -> [c, d]로 Window
      • Window의 기준이 시간인 경우 어떤 시간을 기준으로 할까? (시간 특성 설정)
        • EventTime : Element 내부에 있는 Time Stamp 필드의 값을 기준으로 window를 나눈다.
          • Watermark
            • Flink에서 시간의 흐름을 제어하는 특수한 방식
            • EventTime으로 시간 특성을 설정한다면 특정 시점에서 Element에 적힌 시간을 추출할 수 있는데, 이 추출된 시간을 Watermark로 만들어 DownStream(다음 단계)로 Broadcasting하는 방식으로 전달
            • Watermark는 Flink에 Element가 유입되는 순간 해당 Element와 같이 유입됨, 따라서 Flink 유입 전에 Watermark를 생성하는 로직이 있어야 함
            • 유입된 Watermark 값이 곧 Flink의 현재 시간
            • 유입된 Watermark의 값들이 곧 Flink의 시간의 흐름
        • IngestionTime : Flink에 Element가 들어오는 순간 Time Stamp를 찍어서 그 값을 기준으로 window를 나눈다
        • ProcessingTime : Flink가 동작중인 머신의 시간을 기준으로 window를 나눈다. 
    • aggregate
      • Element들을 특정 방식으로 집계 함 ex) 들어온 Element의 수를 집계해라
    • WindowState
      • Window 단위 동안 집계된 Element를 저장함 
    • Trigger
      • Window의 마지막 순간에 개발자가 정의한 종료 로직이 실행되도록 함
      • 마지막 순간을 판단하는 방법
        • ProcessingTime
          • Java에서 제공하는 Scheduler를 이용하여 Window 생성 시 Window 종료 시점에 맞게 Scheduler에 Winodw Trigger를 등록하면, 머신의 시간의 흐름에 따라 Scheduler에 등록된 Trigger의 종료 로직이 실행됨
          • 네트워크 장비 부하로 인해 데이터가 늦게 도착하는 경우 수집 결과가 매번 달라짐
        • EventTime
          •  watermark를 통해 Timer(시간의 흐름)를 만들고 그 시간의 흐름에 따라 Trigger의 종료 로직이 실행됨

 

 

 

[그림 1] 카카오의 Log 알람 Process

카카오의 Log 알람 Process

  • 수집 단계
    • Log를 tailing(아마도 마지막 n줄을 뽑아서) 라인 단위로 Kafka에 저장하고 이를 Flink 지원 클래스를 통해 Log와 Watermark(시간의 흐름)를 (log 알람 process) 내부로 스트리밍한다.
  • 필터 단계
    • Duration 시간(ex 3분) 동안 log를 집계했을 때 알람을 보낼 조건
    • 수집되는 log 중 query(ex "log = 'ERROR'")에 맞는 log를 집계하고
    • 집계한 log의 개수가 Count(ex 10개)이상인 경우 알람을 보내라
  • Flink Window 단계
    • 필터된 Log의 개수를 1분간 수집하고 집계 로직에 전달
    • Flink를 사용해 1분 단위로 Tumbling Window -> aggregate를 사용해 필터된 Log의 개수 +1 -> 1분동안 필터된 Log의 개수는 WindowState에 저장됨
    • Tumbling Window의 마지막인 경우 Trigger가 발동해 WindowState의 값을 집계 단계로 보낸다.
  • 집계 단계
    • Slot이라는 공간에 필터된 로그의 수를 1분 단위로 저장함
      • Duration/1분 + 1개의 Slot이 필요함(Duration이 3분이면 총 4개의 Slot이 필요함)
        • 왜냐하면 3분동안 집계된 필터된 log의 수 즉 Slot 3개를 합쳐서 처리하는 동안 4번 째 Slot은 다음 순서의 Duration 동안 필터된 log를 수집하고 있어야 하기 때문에
    • Flink를 사용해 1분마다 Slot을 이동시키는 메소드를 호출함(끝에 다다르면 다시 처음으로)
    • 이 때 Duration동안 Slot에 집계된 필터된 Log의 수가 필터의 Count 값을 넘으면 알람을 보냄
  • 알람 단계
    • Rest API 형태로 메시지를 보낼 수 있는 서비스를 이용하여 알람을 보냄

 

마무리

  •  Apache Flink를 통해 실시간 Data Stream을 처리할 때 window 단위로 데이터를 끊어서 처리하는 방법을 알 수 있었다.
  • window단위 실시간 처리는 마치 버퍼에 데이터를 채워서 특정 시간마다 버퍼를 출발시키는 것과 같다. 
  • window단위 실시간 처리에서 window의 끝에서 특정 로직을 실행 시키는 것(버퍼 출발)이 window 단위 실시간 처리의 핵심인 것 같다. 
  • window의 끝에서 특정 로직을 실행시키려면 시스템이 시간을 인식할 수 있어야 하는데, Flink 시스템이 시간을 인식하는 방법을 알 수 있었다. (Event time, Ingestion time, Processing time)