이번에는 회사에서 Flink를 구축하고 있어서 정리했던 내용을 조금씩 다시 블로그에 정리해보면서 공부하려고 합니다!!
그리고 슬프게도 한국에는 Flink에 대한 자료가 그렇게 많이 없더라구요.. 저 뿐만 아니라 많은 분들이 공유를 했으면 좋겠네요 ㅎㅎ
Apache Flink는 Bounded나 Unbounded stream data를 처리하기 위한 상태 기반의 오픈 소스 분산 엔진입니다. 여기서 stream은 물 흐르듯 데이터가 흘러가기 의미를 가지고 있고 실시간 데이터 처리에서는 계속해서 데이터가 들어오기 때문에 stream이라는 단어를 쓰고 있다고 합니다!
stream 데이터를 처리하는 데이터 처리 엔진으로 Flink 이외에도 Spark 같은 것도 있고 Kafka Streams으로도 실시간 데이터 처리가 가능하다고 해요~
하지만 Spark의 경우 Micro Batch 방식으로 stream 데이터를 처리하고 있기 때문에 Flink처럼 Native Stream 방식에 비해 실시간 데이터가 많아질 경우 latency가 생길 수 있다고 합니다 !
그리고 Flink의 경우 데이터 처리 방식을 exactly once처리 방식을 보장하고 있기 때문에 데이터의 무결성도 지킬 수 있다고 합니다~!
Flink는 주로 세가지 유형의 애플리케이션을 구현하는데 사용되고 있습니다.
- 데이터 파이프라인 & ETL 애플리케이션
- 스트리밍 데이터 분석 애플리케이션
- 이벤트 기반 애플리케이션
다 단어 그대로의 의미를 가지고 있으며 애플리케이션을 구현하기 위해서 Flink에서는 State와 Window 등 다양한 기능들을 제공해주고 있습니다. 또한, Flink는 Checkpoint라는 기능을 통해서 장애를 복구할 수 있도록 해주고 있습니다. 이러한 Checkpoint에 대한 개념은 나중에 다룰 예정이며 Flink가 Fault Tolerance를 가질 수 있게 하는 중요한 요소입니다.
Flink는 이 뿐만 아니라 다양한 추상화 계층의 API도 제공해주고 있는데 SQL이 익숙한 분들은 Table API나 SQL을 이용할 수 있고 Java나 Scala, Python에 익숙하신 분들은 DataStream API를 사용할 수 있습니다. 참고로 Python의 경우 Java나 Scala에 비해 완벽한 기능을 제공해주고 있진 않지만 앞으로도 계속 추가되는 추세인 것 같습니다!! 이러한 부분도 추후에 다룰 예정이에요😁
오늘은 간단하게 아키텍쳐와 DataFlow에 대해 잠깐 살펴보겠습니다!! 자료는 다 Flink의 공식 문서를 참고했습니다.
먼저 Flink의 실제 구조에 대해 한번 알아보겠습니다. Flink는 크게 JobManager와 TaskManager로 구분할 수 있습니다! 두 요소는 standalone cluster나 컨테이너, YARN 엔진 등에서 사용할 수 있습니다.
JobManager는 체크포인트 관리나 Task 스케쥴링 등을 담당하고 있고 client program으로부터 만들어진 dataflow graph도 관리하고 있습니다. dataflow graph는 아래 그림처럼 하나의 데이터 처리 과정이며 보통 이걸 하나의 job이라고 부릅니다.
TaskManager 같은 경우는 실제 Task가 실행하게 되는 프로세스입니답. 여기서 Task랑 job이랑 많이 헷갈리실 수 있는데 job이 이제 하나의 dataflow라면 job에 있는 하나 하나는 전부 다 Task가 됩니다. 즉, 아래 그림에서는 source나 map 등이 Task가 될 수 있어요!
본론으로 돌아가서..!! TaskManager는 위에 그림처럼 Task slot이라는 곳에서 하나의 Task를 수행하게 됩니다. OS를 배우셨다면 TaskManager는 하나의 프로세스이고 Task slot은 Thread라고 생각하시면 이해하기 편할 것 같아요~
이외에도 ResourceManager 같은 Task slot을 관리하는 컴포넌트도 존재한답니답!
다음은 공식 예제를 통해 Dataflow를 한번 살펴보겠습니다~
해당 그림처럼 하나의 Job은 Source부터 Sink까지의 과정으로 볼 수 있어요 (물론 Sink 키워드를 안쓰고 그냥 print 할 수도 있어욥) Source의 경우 input이라고 보면 되시구 Sink는 output이라고 생각하면 될 것 같아요~
map은 저희가 흔히 알듯이 데이터를 다른 형식으로 mapping하는 과정이고 window나 apply 등은 나중에 window section에서 다룰테지만 Flink에서는 실시간 데이터를 window라는 유한개의 데이터 집합으로 묶어서 처리하고 있습니다. apply의 경우 window가 구체화되면 실제 실행되는Window Function이라고 보시면 될 것 같아요! keyBy는 key마다 묶어서 window로 따로 처리하거나 그런 작업을 할 수 있습니다. key를 잘 이용한다면 비슷한 데이터들끼리만 한번에 처리할 수 있겠죠?! ㅎㅎ
위의 그림은 source랑 sink가 여러 대상이 될 수 있다는 걸 보여주고 있어요~ 보이는 것처럼 Flink는 다양한 애플리케이션이나 디바이스로부터의 데이터를 처리할 수 있고 마찬가지로 여러 가지 시스템으로 내보낼 수 있어요. 기본적으로 파일, 소켓 등이 지원되고 connector라고 불리는 요소들로 kafka나 elasticsearch 등 다양하게 활용할 수 있답니다.
또한, Flink는 아래처럼 병렬로 처리할 수도 있어요!!
하지만 너무 많은 병렬로 Task를 나눠서 처리하게 된다면 각각의 Task가 서로 다른 TaskManager로 들어간 상황이 되어버리면 TaskManager 사이에선 많은 network shuffle이 일어날 수 있다고 합니다!!
이외에도 아직 다루지 않았지만 Flink에는 State, StateBackend, Checkpoint, Window 등 중요한 개념이 되게 많더라구요 ㅎㅎ
그리고 Flink는 여러 개의 Resource Provider를 제공해주고 있어서 알맞게 사용하시면 될 것 같아요
저는 Flink k8s operator를 쓰려고 하는데 다들 어떤걸 주로 쓰는지 잘 모르겠네요 ㅎㅎ
좋은 구현 방법이 있다면 공유해주시면 감사하겠습니답!! 🙇♂️
'AI & Data' 카테고리의 다른 글
Flink Kubernetes Operator Concept (3) | 2024.03.24 |
---|---|
비지도 학습 (0) | 2021.11.07 |
Matplotlib 기초 학습 내용 (0) | 2021.10.30 |
머신러닝 기초 학습 내용 (0) | 2021.10.29 |
pandas 기초 학습 내용 (0) | 2021.10.29 |