안녕하세요 오늘은 베스핀글로벌 D&A 한제호님이 작성해 주신 Apache Flink에 대해 알아보겠습니다.
궁금하신 부분이 있으시면 댓글을 달아주세요 🙂
스트림 프로세싱이란?
복수계의 데이터 소스로부터 연속적으로 인입되는 데이터가 레코드 또는 정의된 단위에 따라 순차적으로 처리되는 방식
단순 수집의 의미보다는 수집된 데이터를 일정한 단위 기반으로 집계/변환/결합등의 작업이 수반됨
https://towardsdatascience.com/modern-unified-data-architecture-38182304afcc
오픈소스 기반의 스트림 처리 프레임워크
- Flink
- Kafka Streams
- Spark Streaming
- Storm
- Samza
Stream Processing Style
Simple event processing
- 각각의 이벤트가 직접적으로 수행해야할 action과 매핑되어 처리 된다.실시간으로 작업의 흐름을 처리할 때 사용되며, 이벤트 처리 시간과 비용의 손실이 적다.
Event Stream Processing
- 이벤트를 중요도에 따라 필터링하여 걸러진 이벤트만을 수신자에게 전송.실시간으로 정보의 흐름을 처리할 때 사용되며, 기업에 적용될 경우 신속한 의사 결정을 가능하게 한다.(BAM)
Complex event processing
- 일상적인 이벤트의 패턴을 감지하여 더 복잡한 이벤트의 발생을 추론하는 것. 예를 들어 ‘주식의 등락’이라는 일상적인 이벤트의 패턴을 감지하여 ‘투자 적기’ 라는 상위의 이벤트를 추론해 낼 수 있다.
Flink 개요
스트림 프로세싱을 위한 오픈소스 프레임웍 (100만단위 이벤트 처리, Latency 1초 이하, 정확한 결과 보장 등을 제공하는 첫번째 오픈소스 프레임워크)
2009년 개발 시작, 2016년 첫 stable 버전 공개
1.15.2 버전까지 공개(2022-10-11 기준)
분산처리 시스템, In-memory, 고성능, 고가용성
배치프로세스 지원
내결함성(Fault-tolerance) – 시스템 장애시 장애 직전으로 돌아가서 다시 시작 가능
확장성(Rescalability) – 실행 도중에 리소스 추가 가능
전달 보장(delivery guarantee) – Exactly once (중복과 유실 없음)
Hadoop vs Spark vs Flink
특징
데이터 처리 방식
- Hadoop
- Spark & Flink
개발 편의성
스트리밍 프로세스 방식
Flink 데이터 처리 구조
Sources Operators – 수신 데이터 처리
Transformation Operators – 데이터 변환
Sink Operators – 데이터 출력
Parallel Dataflows
- 분산환경에서 각각의 operator들이 병렬로 처리될 수 있음
- Parallelism 설정을 통해 병렬 처리 가능
Flink 구성
Storage: Flink는 Spark과 동일하게 데이터를 처리만 가능한 시스템으로 다양한 저장 시스템과 연동 가능 ex) HDFS, Local File System, MongoDB, RDBMS, S3, RabbitMQ등
Deployment: 클러스터 관리 ex) Local, Standalone 클러스터, YARN, Mesos, AWS/GCP
Connector: Source와 Sink를 위한 다양한 Connector 제공(https://nightlies.apache.org/flink/flink-docs- master/docs/connectors/table/overview/) |
Software Stack
Infra Architecture
- Client: 배치 또는 스트리밍 애플리케이션을 dataflow 그래프로 컴파일한 다음 JobManager에 제출
- Job Manager: Task 스케줄링, 체크포인트 관리, 리커버리 담당
- 리소스 매니저: 리소스 할당/해제 및 프로비저닝 담당
- 디스패처: Flink 응용프로그램 제출 및 Flink webui 제공
- 잡마스터: 단일 JobGraph을 실행 관리함
- JobGraph: Flink application으로 개발된 코드는 연산자와 입출력 관계가 정의된 방향성 그래프로 변환
되어 실행됨
- JobGraph: Flink application으로 개발된 코드는 연산자와 입출력 관계가 정의된 방향성 그래프로 변환
- Task Manager:
- Task의 실행을 담당하는 컴포넌트.
- 1개의 JVM Process로써 동작
- 최소 1개 이상의 Task Slot 존재(보통 CPU Core 갯수로 지정됨)
- JVM 메모리 공유: 하나의 TaskManager에 속한 Task Slot들은 TaskManager의 메모리를 나누어 사용
- CPU Isolation 불가: Slot들은 JVM Thread로써 동작하기 때문에 CPU Isolation은 이룰 수 없음
- 자원 공유: 하나의 TaskManager에 속한 Slot들은 자원을 공유
[점선: task(subtesk), 노란색 동그라미: operator, 숫자: 병렬도]
- Task
- 1개의 Task는 1개 이상의 Subtask로 나뉠 수 있음.
- Task Slot에서 실행하는 작업의 단위는 사실 Task가 아닌 Subtask 단위
- Operator들을 Chaining하여 Task로 만들 수 있음
- 각 Task는 하나의 Thread에서 동작
- Deploy Mode
Application Mode
./bin/flink run-application -t yarn-application ./examples/streaming/TopSpeedWindowing.jar
Per-job Mode
./bin/flink run -t yarn-per-job --detached ./examples/streaming/TopSpeedWindowing.jar
Session Mode
./bin/flink run -t yarn-session -Dyarn.application.id=application_XXXX_YY ./examples/streaming/TopSpeedWindowing.jar
./bin/yarn-session.sh -id application_XXXX_YY
Stateful Stream Processing
이벤트를 각각 독립적으로 처리하면 state가 필요 없음 → stateless 예) 현재 인입된 데이터에 특정 숫자를 연산
여러 이벤트를 한꺼번에 보려고 하면 state가 필요하며 flink는 state 제공하고 관리하는 Stateful Streaming 솔루션입니다. 예) 패턴 찾기, 시간별로 집계, 과거 데이터 조회 등
checkpoint와 savepoint를 통해 내결함성을 갖 도록 설계되어 있음
- checkpoint (설정을 통해 Flink에서 자동으로 관리)
- 스트림 중간에 checkpoint를 끼워 넣어서 만약 실패가 발생하는 경우 마지막 저장된 checkpoint부터 다시 처리하는 방식
- savepoint는 사용자가 직접 코드로 관리
State Backend
- 상태 저장 방식
- MemoryStateBackend : JobManager의 Heap Memory에 저장
- RocksDBStateBackend: Flink에서 제공하는 RocksDB에 저장
checkpoint를 얼마나 자주 저장하냐에 따라 Trade off 존재
Timely Stream Processing
Flink에서의 Time 종류
- Event Time: 이벤트가 생성된 곳에서 만들어진 시간(데이터에 포함되어 있는 시간)
- Processing Time: 데이터를 처리하는 시스템의 시간
Processing Time의 장/단점
- 장점: window 분석 시 시스템 처리 시간 기준이기 때문에 빠른 성능과 Low Latency 보장
- 단점: 분산되고 비동기적인 환경에서는 정확한 통계데이터 추출 불가
– 정상(윈도우 사이즈 10, 5초마다 슬라이딩, 인입 건수 측정)
– 지연 (14초에 도달해야 할 데이터가 지연되어 19초에 도달했다면…)
– Event time을 사용하는 경우
Event time Watermark 기능
- 이벤트 시간의 진행상황을 측정하는 Flink 매커니즘
- 워터마크 지연처리 기능을 통해 일정 시간 지연된 데이터를 처리할 수 있음
override def getCurrentWatermark(): Watermark = {
new Watermark(System.currentTimeMillis - 5000)
}
Windowing
실시간 스트림 데이터는 무한한 데이터기 떄문에 모든 요소를 계산하는 것은 불가능함 대신, 특정 범위(window)단위로 집계 처리는 가능함 예) 시간 기반: 30초 단위, 데이터 기반: 레코드 100개
방식
- Tumbling Window: 고정된 시간 단위로(예: 5초, 10초등) 중복 데이터 없이 처리하는 방식
- Sliding Window: Tumbling Window와 같이 고정된 시간 단위로 데이터를 모아보지만 출력 주기가 시간 단위보다 더 짧은 작업(중복 있음) – 예) 10초 단위로 1분 간 평균 온도 측정
- Session Window: 정해진 일정 시간동안 데이터 인입이 없는 경우 세션 시작부터 인입이 없는 시간까지의 데이터를 하나의 window로 처리하는 방식 – 예) 유저 행동 패턴 분석
pyflink란?
Flink Application은 java 기반으로 개발 가능
2019년부터 python 기반으로 개발 가능한 pyflink 제공
pip install apache-flink |
AWS에서 Flink 활용
EMR
- EMR 5.1.0 버전 이상부터 사용 가능
- Flink 1.15.1 버전까지 릴리즈됨(2022-10-11 기준
Kinesis Analytics
- Flink 1.13 버전까지 릴리즈됨(2022-10-11 기준)
- KPU 단위의 컴퓨팅 파워 제공
- 개발 환경으로 Zeppelin 기반의 Studio Notebook 제공
Appendix
https://leeyh0216.github.io/posts/flink_concepts_1/
감사합니다 🙂