출처 : 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의 시간의 흐름
- Watermark
- IngestionTime : Flink에 Element가 들어오는 순간 Time Stamp를 찍어서 그 값을 기준으로 window를 나눈다
- ProcessingTime : Flink가 동작중인 머신의 시간을 기준으로 window를 나눈다.
- EventTime : Element 내부에 있는 Time Stamp 필드의 값을 기준으로 window를 나눈다.
- Data Stream의 무한하고 연속적인 Element들에 대해 Window 단위로 시작과 끝을 정의함
- aggregate
- Element들을 특정 방식으로 집계 함 ex) 들어온 Element의 수를 집계해라
- WindowState
- Window 단위 동안 집계된 Element를 저장함
- Trigger
- Window의 마지막 순간에 개발자가 정의한 종료 로직이 실행되도록 함
- 마지막 순간을 판단하는 방법
- ProcessingTime
- Java에서 제공하는 Scheduler를 이용하여 Window 생성 시 Window 종료 시점에 맞게 Scheduler에 Winodw Trigger를 등록하면, 머신의 시간의 흐름에 따라 Scheduler에 등록된 Trigger의 종료 로직이 실행됨
- 네트워크 장비 부하로 인해 데이터가 늦게 도착하는 경우 수집 결과가 매번 달라짐
- EventTime
- watermark를 통해 Timer(시간의 흐름)를 만들고 그 시간의 흐름에 따라 Trigger의 종료 로직이 실행됨
- ProcessingTime
- Window
카카오의 Log 알람 Process
- 수집 단계
- Log를 tailing(
아마도마지막 n줄을 뽑아서) 라인 단위로 Kafka에 저장하고 이를 Flink 지원 클래스를 통해 Log와 Watermark(시간의 흐름)를 (log 알람 process) 내부로 스트리밍한다.
- Log를 tailing(
- 필터 단계
- 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를 수집하고 있어야 하기 때문에
- Duration/1분 + 1개의 Slot이 필요함(Duration이 3분이면 총 4개의 Slot이 필요함)
- Flink를 사용해 1분마다 Slot을 이동시키는 메소드를 호출함(끝에 다다르면 다시 처음으로)
- 이 때 Duration동안 Slot에 집계된 필터된 Log의 수가 필터의 Count 값을 넘으면 알람을 보냄
- Slot이라는 공간에 필터된 로그의 수를 1분 단위로 저장함
- 알람 단계
- Rest API 형태로 메시지를 보낼 수 있는 서비스를 이용하여 알람을 보냄
마무리
- Apache Flink를 통해 실시간 Data Stream을 처리할 때 window 단위로 데이터를 끊어서 처리하는 방법을 알 수 있었다.
- window단위 실시간 처리는 마치 버퍼에 데이터를 채워서 특정 시간마다 버퍼를 출발시키는 것과 같다.
- window단위 실시간 처리에서 window의 끝에서 특정 로직을 실행 시키는 것(버퍼 출발)이 window 단위 실시간 처리의 핵심인 것 같다.
- window의 끝에서 특정 로직을 실행시키려면 시스템이 시간을 인식할 수 있어야 하는데, Flink 시스템이 시간을 인식하는 방법을 알 수 있었다. (Event time, Ingestion time, Processing time)
'Review' 카테고리의 다른 글
[if(kakao) 2021] 추천 시스템 airflow 2.0 도입기 Review (0) | 2022.05.21 |
---|---|
[if(kakao) 2021] 실시간 로그 처리를 위한 Flink on k8s 구축 사례 Review (0) | 2022.05.19 |
[if(kakao)2020] Flink 기반 log streaming pipeline - log와 사용자를 잇는 무지개 다리 (0) | 2022.05.18 |
[if(kakao) dev 2019] 카카오톡 적용 사례를 통해 살펴보는 카카오 클라우드의 Kubernetes as a Service Review (0) | 2022.05.17 |
[if(kakao) dev 2019] Airflow를 활용하여 아름다운 데이터 파이프라인 구성하기 Review (0) | 2022.05.17 |