Spark에 대해 알아보자

1. Spark 는 왜 생겨났을까?

이전 하둡에서 공부한 것을 떠올려보자. 하둡은 HDFS를 통해 데이터를 분산 저장하고 맵리듀스를 통해 데이터를 병렬 처리하며 동작한다.

하둡의 HDFS는 디스크 I/O로 동작하기 때문에 실시간 데이터를 처리하기에는 속도 측면에서 부적합하다. 하지만 실시간 데이터 처리에 대한 니즈가 발생하면서 생겨난 것이 바로 Apache Spark 이다.

Spark는 인메모리 연산을 지원하기 때문에 하둡보다 최소 1000배 이상 빠르다고 한다.(실제로 그러한지에 대해서는 나중에 직접 테스트를 해보고자 한다.) 그럼 지금부터 Spark에 대해 더 자세히 알아보자.

2. Spark

Spark는 대규모 데이터 처리와 분석을 위한 오픈 소스 분산 컴퓨팅 시스템이다.

분산 컴퓨팅 시스템

분산 컴퓨팅 시스템은 여러 대의 컴퓨터가 협력하여 하나의 큰 작업을 수행하는 시스템을 의미한다. 이 시스템은 작업을 병렬로 나누어 수행함으로써 성능을 향상시키고, 대규모 데이터 처리 및 복잡한 계산을 보다 효율적으로 할 수 있게 한다.

인메모리 연산

Spark의 가장 큰 특징은 인메모리 연산이다. 디스크가 아닌 메모리 내에서 연산을 지원하기 때문에 빠른 속도를 제공한다. 이러한 인메모리 연산을 사용하여 하둡 생태계를 보완하는 기술로 자리잡게 되었다.

RDD (Resilient Distributed Datasets)

RDD란, Spark의 핵심 데이터 구조로 대규모 데이터 처리를 위한 추상화 계층이다. RDD는 Spark의 분산 데이터 처리를 효율적으로 수행할 수 있도록 설계되어 있다.

RDD는 다음과 같은 특징을 갖는다.

  • 불변성: RDD는 한번 생성되면 변경할 수 없다. 데이터를 변환하면 새로운 RDD를 생성한다. 이는 병렬 처리를 안전하게 만들고, 데이터의 일관성을 보장한다.
  • 분산성: RDD는 클러스터의 여러 노드에 걸쳐 분산 저장된다. 이를 통해 대규모 데이터를 효율적으로 처리할 수 있다.

스트리밍 데이터 처리

Spark Streaming을 통해 실시간 데이터 스트리밍 처리를 할 수 있다.

3. Spark 구성 요소

구성 요소에 대해 알아보기 전, 구성 요소를 공부하면 자주 나오는 개념들에 대해 먼저 간단히 알아보고 가자.

  • 클러스터(Cluster): 여러 대의 노드(서버)로 구성된 환경
  • 애플리케이션(Application): [사용자 코드] Spark에서 실행될 작업(job)과 그 작업을 구성하는 여러 단계(stage)를 포함
  • SparkContext: 클러스터와 통신을 담당하는 객체
  • 작업(Job): 데이터를 처리하는 단위

image

드라이버 프로그램 (Driver Program)

드라이버 프로그램은 사용자가 작성한 애플리케이션 코드를 실행하는 프로세스이다. 다음과 같은 역할을 한다.

  • 애플리케이션 실행
  • SparkContext 생성
  • 작업 스케줄링: 작업을 다양한 단계로 나눈다.
  • 결과 수집: 각 단계의 실행 결과를 수집하고 최종 결과를 사용자에게 반환한다.

클러스터 매니저 (Cluster Manager)

클러스터 매니저는 클러스터의 자원을 관리한다. 다음과 같은 역할을 한다.

  • 클러스터 내 모든 노드 관리 (노드 = 클러스터를 구성하는 개별 컴퓨터)
  • 각 노드의 CPU, 메모리 등의 자원을 관리하고, 드라이버 프로그램과 실행기에 필요한 자원을 할당
  • 드라이버 프로그램이 제출한 작업을 스케줄링하고, 적절하게 실행기에 할당

클러스터 매니저에는 다양한 종류가 있다.

  • Standalone Cluster Manager: 기본 클러스터 매니저로, 독립적인 Spark 클러스터를 설정할 때 사용된다.
  • Apache Mesos: 복잡한 클러스터 환경에서 자원 관리를 위해 사용된다.
  • Hadoop YARN: Hadoop 생태계와 통합된 클러스터 매니저로, Hadoop 클러스터에서 Spark를 실행할 때 사용된다.
  • Kubernetes: 컨테이너화된 환경에서 클러스터 자원을 관리할 때 사용된다.

실행기(Executor)

실행기는 각 노드에서 실행되는 프로세스로, 실제로 작업을 수행한다. 실행기는 다음과 같은 역할을 한다.

  • 작업 실행: 드라이버 프로그램에서 할당된 작업을 실행한다.
  • 데이터 저장: 메모리 또는 디스크에 데이터를 저장한다.
  • 작업 결과 반환: 작업 결과를 드라이버 프로그램에 반환하다.

RDD(Resilient Distributed Dataset)

RDD는 분산된 데이터 세트를 표현한다. RDD는 한 번 생성되면 변경할 수 없고 여러 노드에 분산되어 저장된다. 장애가 발생하면 RDD는 자동으로 복구할 수 있다는 특징을 가진다.

4. Spark 동작 방식

실제로, 어플리케이션 코드가 실행됐을 때 Spark 가 어떻게 동작하는지에 대해 더 자세히 살펴보자.

[1] 드라이버 프로그램: SparkContext 생성

드라이버 프로그램은 SparkContext를 생성하고, 이로 인해 클러스터 매니저와 연결된다.

[2] 드라이버 프로그램: DAG 생성 및 스테이지 분할

image

드라이버 프로그램은 사용자가 작성한 트랜스포메이션(ex. map, filter, flatMap)을 바탕으로 DAG를 생성하고 이를 여러 스테이지로 분할한다. 이때 DAG는 각 스테이지가 실행되어야 하는 순서를 정의한다.

[3] 드라이버 프로그램: 테스크 생성

드라이버 프로그램은 스테이지를 다시 테스크로 분할하고, 클러스터 매니저에게 해당 테스크를 실행할 실행기를 요청한다.

[4] 클러스터 매니저: 테스크 실행

클러스터 매니저는 리소스를 할당하여 테스크를 실행시킨다.

[5] 실행기: 결과 저장 및 전송

각 실행기는 테스크의 실행 결과를 메모리에 저장하고, 결과를 직렬화하여 드라이버 프로그램에게 전송한다.

[6] 드라이버 프로그램: 결과 반환

드라이버 프로그램은 직렬화된 결과 데이터를 역직렬화하여 원래 데이터 형태로 변환한다. 드라이버 프로그램은 각 실행기로부터 받은 부분 결과를 수집하여 하나의 최종 결과로 수집하여 사용자에게 반환한다.

5. Hadoop 내 에서의 Spark

Spark는 Hadoop과 통합되어, Hadoop EcoSystem 내에서 강력한 데이터 처리 기능을 제공한다. 특히, HDFS와 YARN 과의 통합이 대표적인데 이에 대해 알아보자.

Spark와 HDFS의 통합

Spark는 HDFS에 저장된 데이터를 직접 읽고 쓸 수 있다. 이를 통해 대규모 데이터를 분산 처리할 수 있다.

YARN 클러스터 모드에서 Spark 실행

Spark는 YARN 클러스터 매니저를 통해 자원을 할당받아 작업을 실행할 수 있다. 이를 통해 하둡 클러스터의 자원을 효율적으로 사용할 수 있다.

Spark Streaming

Spark Streaming을 사용하면 실시간 데이터 스트림을 처리할 수 있다.