Apache Spark

Apache Spark는 대규모 데이터 처리를 위한 빠르고 범용적인 통합 분석 엔진입니다. 하둡(Hadoop) 생태계의 핵심 기술인 맵리듀스(MapReduce)가 가진 디스크 I/O 병목 현상과 처리 속도의 한계를 극복하기 위해 등장했으며, 현대 빅데이터 아키텍처의 표준으로 자리 잡았습니다. 핵심적인 특징부터 연산 방식, 그리고 맵리듀스와의 차이점까지 체계적으로 정리해 드리겠습니다.

1. Apache Spark의 핵심 특징

Spark의 아키텍처와 성능을 이해하기 위해서는 다음의 4가지 핵심 개념을 파악해야 합니다.

  • 인메모리 컴퓨팅 (In-Memory Computing) :
  • 데이터 처리 중간 결과를 디스크에 저장하지 않고 메인 메모리(RAM)에 유지합니다. 디스크 I/O를 최소화하여 반복적인 데이터 처리나 머신러닝 알고리즘 수행 시 압도적인 속도 향상을 보여줍니다.
  • RDD (Resilient Distributed Datasets) 기반의 추상화 :
  • 분산된 메모리에 저장된 읽기 전용 데이터 객체의 모음입니다. 장애가 발생하더라도 리니지(Lineage)라는 데이터 연산 기록을 통해 손실된 데이터를 메모리 상에서 신속하게 재연산하여 복구(Fault Tolerance)할 수 있습니다.
  • DAG (Directed Acyclic Graph) 실행 엔진 :
  • 작업을 수행할 때 단순한 2단계(Map-Reduce)가 아니라, 여러 연산의 흐름을 방향성 비순환 그래프(DAG)로 구성합니다. 이를 통해 전체 작업 프로세스를 최적화하고 불필요한 단계를 줄여 실행 효율을 극대화합니다.
  • 지연 평가 (Lazy Evaluation) :
  • 데이터에 대한 변환 명령이 내려져도 즉시 실행하지 않고, 결과를 실제로 반환해야 하는 시점(Action)이 올 때까지 연산을 미룹니다. 이 과정에서 연산 순서를 재배치하거나 최적화할 수 있는 기회를 얻게 됩니다.

2. Spark의 데이터 연산 방법

Spark의 연산은 크게 트랜스포메이션(Transformation)액션(Action) 두 가지로 나뉩니다.

① 트랜스포메이션 (Transformation: 변환)

기존의 RDD(또는 DataFrame/Dataset)를 가공하여 새로운 RDD를 생성하는 연산입니다. 앞서 언급한 '지연 평가'가 적용되어, 액션이 호출되기 전까지는 실제 데이터 처리가 일어나지 않고 연산의 파이프라인(Lineage)만 기록합니다.

  • 주요 함수:
    • map(): 각 요소에 함수를 적용하여 새로운 요소 생성.
    • filter(): 조건에 맞는 요소만 추출.
    • join(): 두 RDD의 키를 기준으로 결합. (데이터베이스의 조인과 유사하며, 분산 환경에서는 데이터 이동인 Shuffle이 발생하므로 최적화가 중요합니다.)

② 액션 (Action: 실행 및 결과 반환)

트랜스포메이션으로 구성된 DAG를 실제 실행하도록 트리거하는 연산입니다. 연산 결과를 드라이버(Driver) 프로그램으로 반환하거나, 외부 스토리지(HDFS, S3 등)에 저장합니다.

  • 주요 함수:
    • count(): RDD의 전체 요소 개수 반환.
    • collect(): RDD의 모든 데이터를 로컬 메모리로 가져옴.
    • saveAsTextFile(): 결과를 디스크나 분산 파일 시스템에 저장.

3. Spark vs Hadoop MapReduce 비교

가장 큰 차이점은 데이터를 어디에 두고 연산하느냐작업의 파이프라인을 어떻게 구성하느냐에 있습니다.

구분 Hadoop MapReduce Apache Spark
데이터 저장/처리 디스크 기반
(각 단계마다 디스크 Read/Write 발생)
인메모리 기반
(메모리에서 연속 처리, 필요시 디스크 사용)
작업 흐름 (Model) Map 단계 -> Reduce 단계의 고정된 2-Stage DAG 기반의 유연한 Multi-Stage
실행 방식 즉시 실행 및 디스크 저장 지연 평가(Lazy Evaluation)를 통한 실행 최적화
장애 복구
(Fault Tolerance)
데이터를 여러 노드에 복제(Replication)하여 대비 RDD Lineage 기록을 바탕으로 데이터 재연산
적합한 작업 대규모 1회성 배치 처리 (ETL) 대화형 데이터 분석, 반복 연산(머신러닝),
실시간 스트리밍
처리 속도 상대적으로 느림 맵리듀스 대비 메모리에서 최대 100배,
디스크에서 10배 빠름

Spark는 단순한 RDD를 넘어 스키마 정보를 포함하여 SQL 쿼리 최적화를 지원하는 DataFrame/Dataset API로 진화했으며, 내부적으로 쿼리 실행 계획을 최적화하는 카탈리스트 옵티마이저(Catalyst Optimizer)를 사용하여 성능을 더욱 높이고 있습니다.

데이터베이스 이론에서 살펴보셨던 다양한 조인 연산(Hash Join, Sort Merge Join 등)이 Spark의 분산 환경에서는 데이터를 노드 간에 재분배하는 셔플링(Shuffling) 비용과 맞물려 어떻게 최적화되는지(예: Broadcast Hash Join) 살펴보시면 데이터 처리 아키텍처에 대한 이해도를 한층 더 높이실 수 있을 것입니다.