Flink Architecture

2024-06-06

entrance

Intro

Apach Flink는 대규모 데이터 스트리밍 처리를 위한 오픈 소스 분산 스트리밍 데이터 처리엔진입니다. Apach Flink는 대규모 데이터를 여러 서버에 분산하여 처리하기 때문에 각 서버의 리소스를 관리해야하며 안정적이고 신뢰성있게 데이터를 처리하기 위해서 장애상황을 생각하고 고가용성을 갖춰야 합니다. 이러한 요구사항은 분산 처리 시스템이 기본적으로 갖춰야 할 사양입니다.

FlinkJobManager, TaskManagerMaster-Worker구조로 Flink 클러스터를 구성합니다. JobManagerFlink의 마스터 프로세스로서 Flink Application을 안정적으로 실행해야할 의무를 갖습니다. TaskManagerJobManager로 부터 할당받은 Task를 실행해야합니다.

FlinkJobManagerTaskManager가 분산 처리 시스템의 요구사항을 만족하기 위해서 Apache Mesos, Apache Hadoop Yarn 또는 Kubernetes와 같은 클러스터 인프라를 이용합니다. 물론 StandAlone을 제공하여 로컬 클러스터를 구성하여 테스트 환경을 구축할 수 있습니다. 또한 Apache Zookeeper를 통해 JobManager를 이중화하여 고가용성을 제공합니다.

JobManager

JobManagerFlink의 마스터 프로세스로 Flink Application들을 안정적으로 운영하기 위해 다양한 작업을 담당합니다. 주요 역할로는 Task Scheduling, Resource Monitoring, CheckPointing 등이 있습니다. 이러한 작업은 JobManager의 여러 컴포넌트로 세분화되어 수행됩니다.

JobManager는 다음과 같은 주요 컴포넌트로 구성되어 있습니다:

  • ResourceManager: 클러스터의 리소스를 관리합니다. 여기서 리소스는 Memory, CPU와 같은 하드웨어 리소스를 말하며 리소스는 TaskManagerSlot으로 구분되어 있습니다.
  • Dispatcher: 사용자로 부터 Flink Application 를 받는 REST API를 제공합니다. 그리고 JobMaster를 생성합니다.
  • JobMaster: Flink Application마다 1개씩 생성되며 작업의 실행을 관리하며 작업 상태를 모니터링하고 체크포인트를 처리합니다.

내부 이미지 경로 URL

JobManager는 사용자가 제출한 Flink Application을 수신합니다. Flink ApplicationJobGraph라고 불리는 논리 데이터플로우 그래프와 애플리케이션에 필요한 클래스, 라이브러리를 포함한 JAR파일로 구성되어 있습니다. JobManagerJobGraph실행그래프(ExecutionGraph)라고 부르는 물리 데이터플로우 그래프로 변환합니다. 그리고 JobManagerResourceManager에게 ExecutionGraph를 실행에 필요한 자원(태스크 매니저 슬롯)을 요청합니다. ExecutionGraph를 실행할 수 있는 충분한 태스크 슬롯을 할당받으면 JobManagerTaskManagerExecutionGraph를 배포합니다.

JobManagerExecutionGraph를 배포한 후 작업들이 Task Slot에서 정상적으로 잘 작동하는지 모니터링합니다. 또한 데이터 흐름을 조정하고 작업 간의 데이터 파티셔닝과 재분배를 관리합니다. 작업이 완료되면 자원을 해제하고 결과를 수집한 후 저장합니다.

TaskManagers

TaskManagerFlink의 워커 프로세스입니다. TaskManager는 작업을 실행하기 리소스를 슬롯의 형태로 관리합니다. 일반적으로 TaskManager는 여러개의 슬롯을 갖고 있습니다.

TaskManager는 실행될 때 자신이 갖고 있는 슬롯을 ResourceManager에 등록합니다. ResourceManager로 부터 슬롯이 필요하다는 요청이 오면 TaskManager는 유후상태인 슬롯을 JobManager에게 제공합니다. JobManagerExecutionGraph를 해당 슬롯에 할당합니다.

TaskManager는 여러개의 슬롯을 갖고 있으며 Slot마다 Task를 실행할수 있습니다. TaskManagerJVM애플리케이션이므로 Task를 실행하기 위해서 Thread를 사용합니다. 그러므로 만약 하나의 Thread에서 에러가 발생한 경우 TaskManager애플리케이션이 비정상적으로 종료가 될 위험이 있습니다. 그러므로 하나의 서버에 Slot한 개의 여러 개의 TaskManager를 실행하는 것이 안전성을 높이는 방법일 수 있습니다.

Outro

간단하게 Flink의 Architecture를 살펴보았습니다. 추후에 내용을 조금 더 보완할 필요가 있겠네요.