Apache Flink란 무엇인가?
Apache Flink는 대규모 데이터 스트림 처리와 배치 처리 작업을 수행할 수 있는 오픈 소스 분산 데이터 처리 엔진입니다. 특히 실시간 데이터 스트림 처리에 강점을 가지고 있으며, 이벤트 기반 데이터 파이프라인과 분석 애플리케이션을 위한 강력한 도구로 널리 사용됩니다.
스트림 프로세싱의 개념
스트림 프로세싱(Stream Processing)은 실시간으로 연속적으로 들어오는 데이터를 처리하는 방식입니다. 이는 데이터를 저장한 후 나중에 처리하는 배치 프로세싱(Batch Processing)과는 다릅니다. 스트림 프로세싱은 데이터가 생성됨과 동시에 처리되므로, 지연 시간이 매우 낮고 실시간 분석 및 대응이 필요할 때 매우 유용합니다.
- 데이터 스트림(Data Stream): 연속적으로 들어오는 데이터의 흐름입니다. 데이터 스트림은 로그 파일, 센서 데이터, 금융 거래, 소셜 미디어 피드 등에서 생성될 수 있습니다.
- 이벤트(Event): 데이터 스트림 내의 개별 단위입니다. 예를 들어, 각 로그 항목, 센서 측정값, 트랜잭션 등이 이벤트입니다.
- 윈도잉(Windowing): 데이터를 일정한 시간 간격이나 데이터 개수로 나누어 처리하는 방법입니다. 이를 통해 데이터 스트림을 작게 분할하여 처리할 수 있습니다.
스트림 프로세싱의 주요 프레임워크
- Apache Flink: 강력한 스트림 프로세싱 엔진으로, 실시간 데이터 처리를 위한 상태 저장 및 정확히 한 번(Exactly-once) 처리 보장을 제공합니다.
- Apache Storm: 실시간 이벤트 프로세싱 시스템으로, 빠르고 확장 가능한 데이터 스트림 처리를 지원합니다.
- Apache Spark Streaming: Apache Spark의 확장 모듈로, 배치와 스트림 처리를 동일한 API로 지원합니다.
- Google Cloud Dataflow: Google Cloud의 스트림 및 배치 데이터 처리를 위한 통합 서비스입니다.
Flink 주요 특징
- 실시간 스트림 처리: Flink는 낮은 지연 시간과 높은 처리량을 제공하며, 실시간 데이터 스트림 처리를 효율적으로 수행합니다.
- 상태 저장: 상태 저장 기능을 통해 데이터 스트림 처리 중간에 상태를 유지할 수 있으며, 이로 인해 복잡한 이벤트 기반 애플리케이션을 구현할 수 있습니다.
- 높은 정확성: Flink는 "정확히 한 번(Exactly-once)"의 데이터 처리 보장을 제공하여 데이터 처리의 정확성을 보장합니다.
- 유연한 배치 처리: 스트림 처리뿐만 아니라 배치 처리도 지원하며, 동일한 API를 사용하여 스트림과 배치 작업을 모두 처리할 수 있습니다.
- 확장성: 클러스터 환경에서 수평 확장이 가능하여 대규모 데이터 처리에 적합합니다.
장점
- 실시간 분석: 낮은 지연 시간으로 실시간 데이터 스트림 분석이 가능하여 실시간 대시보드, 실시간 이벤트 감지 등에 활용됩니다.
- 고급 이벤트 처리: 상태 저장 기능과 시간 기반의 이벤트 윈도잉(windowing)을 통해 복잡한 이벤트 처리 논리를 구현할 수 있습니다.
- 탄력성: 내장된 체크포인트(Checkpointing) 메커니즘을 통해 장애 발생 시에도 작업을 복구할 수 있습니다.
- 유연성: 동일한 API로 스트림 및 배치 작업을 모두 처리할 수 있어, 다양한 데이터 처리 시나리오에 적용 가능합니다.
- 강력한 커뮤니티와 지원: Apache Flink는 활발한 오픈 소스 커뮤니티와 풍부한 문서, 다양한 서드파티 통합 도구를 제공합니다.
Flink 상세 구조
Apache Flink는 고성능, 저지연 실시간 데이터 스트림 처리를 위해 설계된 분산 데이터 처리 엔진입니다. Flink의 구조는 스트림 처리 작업을 효율적으로 관리하고 실행하기 위해 다양한 구성 요소로 이루어져 있습니다. Flink의 주요 구성 요소와 그들의 역할을 상세히 설명하겠습니다.
Flink의 주요 구성 요소
- JobManager
- TaskManager
- Client
- Execution Graph
- Checkpointing
- State Backend
1. JobManager
JobManager는 Flink 클러스터의 중앙 제어 장치로, 다음과 같은 주요 역할을 수행합니다:
- 작업 계획 및 스케줄링: 사용자 애플리케이션(Job)을 실행 계획으로 변환하고, 이 계획을 여러 태스크(Task)로 분할하여 TaskManager에게 할당합니다.
- 리소스 관리: 클러스터의 리소스를 관리하고, TaskManager의 상태를 모니터링하며, 필요시 리소스를 할당합니다.
- 장애 복구: 작업 중 장애가 발생하면 체크포인트(Checkpoint)를 기반으로 작업을 복구합니다.
2. TaskManager
TaskManager는 실제 데이터 처리를 수행하는 작업자입니다. 각 TaskManager는 여러 개의 작업 슬롯(Slot)을 가지며, 각 슬롯은 하나의 태스크(Task)를 실행합니다.
- 태스크 실행: TaskManager는 JobManager로부터 할당받은 태스크를 실행합니다.
- 데이터 전송: 태스크 간 데이터를 주고받으며, 네트워크를 통해 데이터를 교환합니다.
- 메모리 관리: TaskManager는 자체 메모리 관리를 통해 데이터를 효율적으로 처리하고, 필요한 경우 디스크에 데이터를 저장합니다.
3. Client
Client는 사용자 애플리케이션을 제출하는 역할을 합니다. 일반적으로 사용자가 작성한 Flink 애플리케이션을 Flink 클러스터에 제출하고 실행을 시작하는 데 사용됩니다.
- 작업 제출: 사용자가 작성한 Flink 애플리케이션(Job)을 JobManager에게 제출합니다.
- 모니터링 및 관리: 작업의 상태를 모니터링하고, 필요 시 작업을 취소하거나 수정합니다.
4. Execution Graph
Execution Graph는 Flink 애플리케이션이 실행되는 동안 생성되는 실행 계획입니다. 작업은 여러 개의 태스크(Task)로 나누어져 병렬로 실행됩니다.
- 병렬 처리: 각 태스크는 병렬로 실행되며, 데이터 스트림을 처리합니다.
- 데이터 흐름: Execution Graph는 태스크 간의 데이터 흐름을 정의하고, 데이터가 어떻게 이동하고 처리되는지를 나타냅니다.
5. Checkpointing
Checkpointing은 Flink에서 상태 저장(Stateful) 작업의 일관성을 보장하는 메커니즘입니다. 주기적으로 애플리케이션의 상태를 저장하여, 장애 발생 시 이 상태로 복구할 수 있습니다.
- 주기적 체크포인트: Flink는 주기적으로 애플리케이션의 상태를 체크포인트로 저장합니다.
- 장애 복구: 장애 발생 시, 마지막으로 성공한 체크포인트에서 애플리케이션을 복구하여 실행을 재개합니다.
- Exactly-once 처리 보장: 체크포인트를 통해 데이터가 정확히 한 번만 처리되는 것을 보장합니다.
6. State Backend
State Backend는 상태 저장 작업에서 상태를 저장하는 방식과 위치를 정의합니다. 주로 메모리 또는 디스크에 상태를 저장합니다.
- 메모리 기반 백엔드: 상태를 메모리에 저장하여 빠른 접근이 가능하지만, 메모리 크기에 제한이 있습니다.
- 디스크 기반 백엔드: RocksDB와 같은 디스크 기반 저장소를 사용하여 대규모 상태를 저장할 수 있습니다.
- 유연한 설정: 애플리케이션 요구사항에 따라 적절한 State Backend를 선택할 수 있습니다.
Flink의 실행 흐름
- 애플리케이션 제출: 사용자가 작성한 Flink 애플리케이션은 Client를 통해 JobManager에게 제출됩니다.
- 작업 계획 생성: JobManager는 애플리케이션을 실행 계획(Execution Plan)으로 변환하고, 이를 실행 그래프(Execution Graph)로 변환합니다.
- 태스크 할당: JobManager는 Execution Graph를 여러 태스크(Task)로 나누어 TaskManager에게 할당합니다.
- 태스크 실행: TaskManager는 할당받은 태스크를 실행하며, 태스크 간 데이터를 주고받습니다.
- 상태 관리: 상태 저장이 필요한 태스크는 State Backend를 통해 상태를 관리합니다.
- 체크포인트: 주기적으로 체크포인트를 생성하여 장애 복구를 대비합니다.
- 장애 복구: 장애 발생 시, 체크포인트를 이용해 작업을 복구하고 실행을 재개합니다.
- 결과 출력: 처리된 데이터는 최종적으로 싱크(Sink)에 저장되거나 다른 시스템으로 전달됩니다.
'빅데이터' 카테고리의 다른 글
[dbt] dbt란 무엇인가? (0) | 2024.06.14 |
---|---|
[Airflow] Airflow란 무엇인가? (0) | 2024.06.13 |
[Spark] Apache Spark란 무엇인가? (0) | 2024.06.10 |
[데이터 거버넌스] 데이터 거버넌스란 무엇인가? (0) | 2024.06.09 |
[객체 스토리지] Object Storage(객체 스토리지)란 무엇인가? (0) | 2024.06.04 |