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으로 개발된 코드는 연산자와 입출력 관계가 정의된 방향성 그래프로 변환
되어 실행됨 - 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 제공