Spark 맛보기 - 1. Spark란?

1. Spark가 무엇일까?

Apache Spark는 대규모 분산 데이터 처리를 하기 위해 설계된 통합형 엔진이다. Spark는 중간 연상을 위해 메모리 저장소를 지원하며 디스크를 사용하는 MapReduce보다 훨씬 빠르게 동작한다.

핵심 라이브러리는 MLlib, Spark SQL, Spark Streaming, GraphX가 있다. 모든 것에 대해 설명할 자신은 없어서 이번에는 Spark와 Spark SQL에 대해 공부한 내용을 정리하려고 한다. 나중에 Spark Core에 대해 더 많이 알게 되면 그 부분은 따로 글을 작성하려고 한다. Streaming은 나..중에..

스파크 설계 철학의 핵심 특성은 속도, 사용 편의성, 모듈성, 확장성이다. 이 철학들은 MapReduce에서 겪은 단점들을 개선하려는 과정에서 나온 특성들이다.

A. 속도

  1. 하드웨어의 발전으로 인해 가격 및 CPU와 메모리의 성능이 향상
  2. 스파크는 질의 연산을 DAG로 구성
  3. 물리적 실행 엔진인 Tungsten은 whole-stage code generation 기법을 써서 실행을 위한 간결한 코드를 생성해 낸다.
  4. 모든 중간 결과는 메모리에 유지되며, 디스크 I/O를 제한적으로 사용한다.

B. 사용 편리성

  • 고수준 데이터 추상화 계층(DataFrame, DataSet) 아래에 유연한 분산 데이터 세트(Resilient Distributed Dataset, RDD)라 불리는 논리 자료구조를 구축하여 단순성을 실현하였다.
  • Operation의 종류로서 Transformation과 Action의 집합과 단순한 프로그래밍 모델을 제공함으로써 각자 편한 언어로 빅데이터 애플리케이션을 만들 수 있다.

C. 모듈성

스파크 연산은 다양한 타입의 워크로드에 적용 가능.

하나의 Spark Application을 작성함으로써 모든 것이 실행 가능해진다.

Spark를 쓴다면 자신의 워크로드를 처리하기 위한 하나의 통합된 처리 엔진을 갖게 된다.

D. 확장성

Spark는 저장보다는 빠른 병렬 연산 엔진에 초점이 맞추어져 있다.

Spark가 수 많은 데이터 소스(Hadoop, Cassandra ...)에서 데이터를 읽어들여 메모리에서 처리 가능하다.

2. 통합된 분석

빅데이터 처리를 위한 통합 엔진

  • Apache Spark: A Unified Engine For Big Data Processing

A. 단일화된 스택으로의 아파치 컴포넌트

컴포넌트(Spark SQL, MLlib, Spark Streaming, GraphX)는 스파크의 중심 장애 대응 엔진과는 별도로 존재한다. API를 써서 스파크 애플리케이션을 만들면 스파크 코어 엔진이 적절한 DAG로 변환해 실행하게 된다. 어떤 언어로 스파크 코드를 작성해 정형화 API를 사용하더라도 실제 코드는 고도로 경량화된 바이트코드로 변환되어 클러스터 전체에 나뉘어 워커 노드의 JVM에서 실행된다.

B. 아파치 스파크의 분산 실행

스파크의 분산 아키텍쳐 위에서 모든 컴포넌트들이 같이 동작하면서 서로 통신하는지, 어떤 식으로 배포가 가능한지 알아둘 필요가 있다.

스파크 아키텍쳐를 넓은 범위에서 보면, 하나의 스파크 애플리케이션은 스파크 클러스터의 병렬 작업들을 조율하는 하나의 드라이버 프로그램으로 이루어진다. 드라이버는 SparkSession 객체를 통해 클러스터의 분산 컴포넌트(spark executor, cluster manager)들에 접근한다.

a. 스파크 드라이버

SparkSession 객체를 초기화하는 책임을 가진 스파크 애플리케이션의 일부

클러스터 매니저와 통신하며 spark executor들을 위해 필요한 자원(cpu, memory)을 요청하고 모든 스파크 작업을 DAG 연산 형태로 변환하고 스케줄링하며 각 실행 단위를 태스크로 나누어 spark executor들에게 분배해준다.

자원이 할당되면 driver는 executor와 직접 통신한다.

b. SparkSession

SparkSession은 모든 스파크 연산과 데이터에 대한 통합 연결 채널이 되었다.

c. Cluster manager

자원을 관리 및 할당하는 책임을 지닌다.

  • standalone Cluster Manager
  • YARN
  • Mesos
  • Kubernetes
d. Spark Executor

클러스터의 각 워커 노드에서 동작한다. 드라이버 프로그램과 통신하며 워커에서 태스크를 실행하는 역할을 한다.

대부분의 배포 모드에서 노드당 하나의 executor만 실행된다.

e. 배포 모드

스파크는 여러 다른 환경에서 다른 설정으로 돌아갈 수 있도록 다양한 배포 모드를 지원한다.

f. 분산 데이터와 파티션

물리 데이터는 파티션이 되어 저장소 전체에 분산된다.

스파크는 각 파티션을 고수준에서 논리적인 데이터 추상화, 즉 메모리의 데이터 프레임 객체로 바라본다. Spark Executor는 가능하면 데이터 지역성을 고려하여 네트워크에서 가장 가까운 파티션을 읽어 들이도록 태스크를 할당한다.

파티셔닝은 효과적인 병렬 처리를 가능하게 해 준다. 각 executor가 쓰는 CPU 코어는 작업해야 하는 데이터의 파티션에 할당되어 네트워크 사용을 최소화할 수 있다.

# .txt 파일을 DataFrame으로 읽고 8개의 파티션으로 나눈다.
# 각 executor는 하나 이상의 파티션을 메모리로 읽어 들이게 된다.
log_df = spark.read.text('/Users/mildsalmon/requirements.txt').repartition(8)
print(log_df.rdd.getNumPartitions())

# 8

99. 위 내용 중에 추가 설명이 필요한 부분 (알쓸신잡)

A. MapReduce란?

MapReduce는 구글의 MapReduce: Simplified Data Processing on Large Clusters 논문을 바탕으로 만들어진 분산 컴퓨팅 프레임워크이다.

특징을 정리하면 아래와 같다.

  1. 데이터를 여러 노드에 분산하여 병렬로 처리하는 분산 컴퓨팅 모델을 사용
  2. map, reduce 함수를 개발자가 작성
  3. map과 reduce 중간 결과를 디스크에 작성한다는 특징이 있다.

시대가 발전됨에 따라 위 특징 중 일부는 자연스럽게 단점이 되었다. 메모리 양이 증가되어서 느리고 비용이 많이 드는 디스크 io를 대체할 수 있게 되었다. map과 reduce 함수를 작성해야한다는 것도 개발 복잡성을 늘린다는 단점으로 작용했다.

Spark는 MapReduce의 비효율적인 부분을 개선해야겠다는 생각으로 만들어졌다.

B. 대규모 분산 데이터 처리란?

대용량의 데이터를 여러대의 컴퓨터에 나눠서 처리하는 것을 말한다.

굳이 여러대의 컴퓨터까지 갈 필요 없이 1개의 프로세스에 데이터를 올려두고 멀티 스레딩으로 처리할 수도 있지 않느냐고 반문할 수도 있다. 그런데 1개의 프로세스, 1대의 컴퓨터에 다 올라가지 못하는 데이터인 경우에도 해당 방법이 유효할지 생각해봐야 한다.

999. 참고자료

줄스 담지, 브룩 웨닉, 타타가타 다스, 데니 리 저/박종영, "러닝 스파크", 제이펍(2022)

이 글이 도움이 되었나요?

신고하기
0분 전
작성된 댓글이 없습니다. 첫 댓글을 달아보세요!
    댓글을 작성하려면 로그인이 필요합니다.