본문 바로가기

Big Data/Flink

Flink 시작하기 #1 소개 (Basic Concept)



#Flink란?
stream processing framework for distributed, high-performing, always-available, and accurate data streaming applications.
라고 소개되고 있다. 간단히 말해 최근 많이 사용되는 apache Storm, Spark Streaming과 같은 스트리밍 & 배치 프로세싱 플랫폼이다.

Flink는 Streaming model이 batch가 아닌 native 방식으로 스트림 처리에 대해 low latency 특성을 가진다.
그리고 Exactly-once를 보장하고 높은 처리량을 보이기 때문에 최근 스트림 처리 분야에서 곽광받고 있다.

실시간 처리 프레임워크 비교 포스팅에서 최근 많이 사용하고 있는 스트림 처리 시스템에 대해 비교해볼 수 있다.

#Levels of Abstraction
Flink의 추상화 레벨은 아래 그림과 같다. 

가장 밑단에는 사용자가 직접 state, time등을 관리할 수 있는 loe-level이 있다. 그리고 가장 많이 사용되는 dataStream, Dataset API를 사용하는 레벨, Library로 제공되는 Table API가 다음단계로 제공된다. 이 레벨에서는 select, join, aggregate등의 고차원 함수를 사용할 수 있다. 그리고 SQL를 사용할 수 있는 High-level language도 제공한다.

#Programs and Dataflows
Flink의 기본 빌딩 블록은 다른 스트림 시스템과 유사하다. flink에서는 인풋 스트림을 Source, Operation을 Transformation 그리고 아웃풋을 Sink라고 명명하고 있다.
Source로 스트림 데이터를 받아 여러 Transformation으로 데이터를 가공하고 Sink로 데이터를 처리(저장)을 하는 전체 플로우가 Streaming dataflow이다.

아래 그림은 Flink에서 dataflow를 구성하는 소스코드와 스트림이 처리되는 flow를 그림으로 잘표시하고 있다.
처음과 끝을 Source와 Sink로 구성되어 있고, 중간에 Transformation을 2개 구성하여 데이터를 가공한다. Source, Transformation, Sink간의 데이터는 Stream 형태로 전달된다.


#Parallel Dataflows
Flink는 분산환경에서 각각의 operator들이 Parallel하게 처리될 수 있다.
Stream은 여러 stream paritions으로 구성될 수 있고, Operator또한 여러 operator subtasks로 나뉠 수 있다. Flink가 나름 용어를 지정하여 사용하고 있지만, 간단히 말해 여러 스레드에서 parallel하게 분산처리를 한다고 생각하면 된다.

위에서 설명한 dataflow를 Parallel하게 처리되는 구조로 변경된 그림이다. 2개의 Parallelism 설정하면 각 operator들이 각각의 스레드에서 실행하여 처리된다.
이때 연산자의 특성에 따라 모든 stream에서 데이터를 받아 처리될 수 있고 1:1로 매핑될 수 있다. 
이 예제에서는 keyBy()연산자는 각 subtasks에서 key별로 처리되기 때문에 이전의 transformation에서 map으로 처리된 데이터를 양쪽 모두에서 받아서 처리된다.


#Distributed Execution
Flink는 두 종류의 Process가 있다.
  • master Process (Job Manager) : Task를 스케줄링하고, 체크포인트, 리커버리담당
  • Worker Process (Task Manager) : Task를 실행 

Master가 worker들을 관리하고, Worker는 각 task를 실행하는 구조이다. Client는 런타임안에서 실행되지 않고 접속하여 컨트롤 및 정보 전달을 수행한다.
그리고 flink는 Standalone으로 구성될 수 있고 Container, YARN, Moses 같은 resource framework환경에서 실행할 수 있다.


각 worker(Task Manager)는 JVM 프로세스 단위로 동작하고 1개 이상의 Subtask들이 각 스레드로 실행된다.
task는 task slot안에서 실행되는데 task slot은 각 worker내의 resource(메모리)를 나누어 관리한다. 즉, slot별로 개별적인 메모리 공간에서 task들이 실행되는 구조이다. 보통 slot의 갯수는 CPU core갯수로 지정하는 것이 좋다.


#Windows
스트림 처리 시스템의 기본적인 개념인 windows가 있다. 스트림 데이터는 기본적으로 unbounded 데이터이다. 즉 시작과 끝이 없다는 것이다.
집계 연산을 수행하기 시작과 끝이 일정한 룰에 따라 정해서 연산을 수행하기 위해 사용한다.
Windows 개념에 대해 자세히 알고 싶다면 Introducing Stream windows in Apache Flink 이 글을 보면 쉽게 이해가 간다.


Flink에서 기본 제공되는 Windows종류는 Tumbling, Sliding, Session, Global이 있다.
그리고 각 windows는 시간, 갯수 기반으로 설정이 가능하다.

간단히 아래 그림으로 설명하면 똑같은 데이터가 유입되는 과정에서의 time, count기반의 bound가되는 과정을 쉽게 이해할 수 있다.
데이터를 어떻게 분석할지에 대한 목적성에 맞게 적절히 사용하면 된다.


#Time
스트림 처리 시스템에서는 time의 설정이 중요하다. Flink에서는 3종류의 Time이 있다.
  • Event Time: 데이터가 발생한 시간
  • Ingestion Time: 데이터가 Flink 로 유입된 시간
  • Processing Time: 데이터가 처리된 시간



#Stateful Operations
Flink는 각 operator들이 데이터의 처리 상태를 관리하는 stateful operation 특성을 가지고 있다.


#Checkpoints for Fault Tolerance
거의 모든 스트림 처리 시스템은 Fault Tolerance 기능을 가지고 있다. Flink는 Checkpoint라는 이름의 방식을 사용하고 있다.
이방식은 처리되는 스트림 중간에 checkpoint barrier를 끼워넣어 ack를 처리하는 개념이다. 만약 fault가 발생하면 checkpoint 부터 다시 처리하는 방식이다. 모든 레코드마다 하지 않기 때문에 빠른 성능을 보여주고 exactly-once를 보장 할 수 있다. 



#Batch on Streaming
Flink의 batch processing 방식은 bounded stream 데이터를 streaming 으로 처리하는 방식을 사용하고 있다.
DataSet API를 사용하고 DataStream 방식에서 사용하고 있는 checkpoint방식을 사용하지 않고 fault시 모두 재실행하는 방식을 사용한다.

#참조