Apache Flink

안녕하세요 오늘은 베스핀글로벌 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으로 개발된 코드는 연산자와 입출력 관계가 정의된 방향성 그래프로 변환
        되어 실행됨
  • 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

https://www.alibabacloud.com/blog/principles-and-practices-of-flink-on-yarn-and-kubernetes-flink-advanced-tutorials_596625

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

https://nightlies.apache.org/flink/flink-docs-master/docs/deployment/resource-providers/yarn/#getting-started

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/

감사합니다 🙂

Leave a Comment