태어난 배경

RDBMS와 같은 전통적인 저장 시스템 및 어떠한 프로그래밍 수단으로도 Google이 색인을 만들고 검색할 규모의 인터넷 문서를 다루는 것은 불가능했다. 새로운 접근 방식이 필요하여 필연적으로 GFS(Google File System), 맵리듀스, 빅테이블 등이 생겨났다.

GFS : 클러스터 안에서 상용 서버에 장애 내구성이 있는 분산 파일시스템 제공
빅테이블 : GFS 기반으로 구조화된 대규모 데이터의 저장 수단 제공
맵리듀스 : 함수형 프로그래밍을 기반으로 GFS와 빅테이블 위에서 대규모 데이터 분산 처리가 가능한 병령 프로그래밍의 패러다임 제시

2006년 4월 아파치로 이관되면서 관련 모듈은 하둡 프레임워크의 일부가 되었다.
이관된 후 HDFS(Hadoop File System)에서 돌아가는 맵리듀스 프레임워크에 몇가지 단점이 있었다.

  • 번거로운 운영 복잡도로 인한 관리의 어려움
    -> Spark은 직관적인 API와 함께 다양한 언어(Python, Scala, Java, R)를 지원하며, 기존의 하둡보다 간결한 코드 작성이 가능합니다. Spark의 RDD(Resilient Distributed Dataset)는 데이터에 대한 추상화 레이어를 제공해 사용자가 복잡한 작업을 쉽게 병렬화하고 분산 처리할 수 있게 돕습니다. 특히 DataFrameDataset API는 데이터를 다루는 것을 더욱 직관적으로 만들어 관리의 복잡도를 크게 줄였습니다.
  • 일반적인 배치 처리를 위한 MR API는 많은 양의 기본 셋업 코드를 필요로 했고 장애 대응은 불안정했음.
    ->Spark의 API는 고수준의 추상화를 제공하여 복잡한 셋업 코드를 최소화합니다. Spark는 작업이 실패할 경우 자동으로 재실행하는 내장 장애 복구 메커니즘을 가지고 있으며, 이러한 안정성 덕분에 더 많은 작업을 안정적으로 처리할 수 있습니다. 특히 RDD는 데이터의 불변성(immutable)을 보장하며, 장애가 발생하면 자동으로 해당 데이터 셋의 손실된 파티션만 재연산하는 방식으로 복구를 진행합니다.
  • 방대한 배치 데이터 작업을 수행하면서 많은 MR 태스크가 필요했고 각 태스크는 이후 단계들을 위해 중간 과정의 데이터를 로컬 디스크에 써야 했음. 이는 디스크 I/O의 반복적 수행을 야기했고 거대한 MR을 처리하는 데에 많은 시간을 소비하게 됨.
    ->Spark은 메모리 중심의 처리를 지원합니다. 하둡의 맵리듀스는 각 태스크 사이에 중간 데이터를 디스크에 저장해야 하지만, Spark은 RDD를 통해 중간 데이터를 메모리에 유지할 수 있어 디스크 I/O를 최소화합니다. 이로 인해 Spark은 대용량 데이터를 처리할 때도 더 빠르게 수행될 수 있습니다. 또한, 필요할 경우에만 디스크에 데이터를 저장하기 때문에 더 적은 디스크 I/O로 고성능을 달성할 수 있습니다.
  • 하둡 MR은 머신러닝이나 스트리밍, 상호 반응하는 SQL 계통의 질의 등 다른 워크로드와 연계해서 쓰기에 한계가 있었음.
    -> Spark은 다양한 워크로드(머신러닝, 스트리밍, SQL 질의 등)를 하나의 프레임워크에서 통합적으로 처리할 수 있도록 설계되었습니다.
    Spark Streaming은 실시간 데이터 스트리밍 처리를 가능하게 하여, 실시간 데이터 흐름에 대해 반응하는 애플리케이션을 쉽게 구축할 수 있습니다.
    MLlib은 분산 머신러닝 라이브러리로, 하둡의 맵리듀스보다 머신러닝 작업을 훨씬 더 쉽게 실행할 수 있게 해줍니다.
    Spark SQL은 SQL 기반의 데이터 처리와 분석을 지원하며, 이는 맵리듀스보다 훨씬 더 상호작용적이고 빠르게 데이터를 다룰 수 있습니다.

이러한 단점들이 있었기에 하둡 맵리듀스 작업에 참여했던 UC 버클리의 연구원들이 Spark 프로젝트에서 단점들을 개선한 분산 처치 프레임워크를 개발함. 지금은 훨씬 빠르지만 초기에도 특정 작업에 대해서 10~20배 빨랐음.

 

맵리듀스

맵리듀스 애플리케이션은 데이터를 맵리듀스 시스템과 연계하여 데이터의 지역성과 랙의 근접성 등을 고려해 데이터가 존재하는 곳으로 연산 코드를 보냄. 클러스터의 워커 노드들은 중간 연산을 통해 집계하고, 결과를 합쳐 리듀스 함수에서 최종 결과를 생산해서 이를 애플리케이션이 접근 가능한 분산 저장소에 기록한다. 이러한 접근 방식은 네트워크 트래픽을 크게 감소시키면서 네트워크로 데이터를 분산시키는 것을 지양하고, 로컬 디스크에 대한 IO를 극대화한다.

맵리듀스 과정

 

Spark 특성

  • 속도
    - 하드웨어의 발전으로 가격 및 CPU, 메모리의 성능이 향상되어 Spark 내부 구현이 용이해짐.
    - 질의 연산을 방향성 비순환 그래프(DAG)로 구성. 스케줄러와 질의 최적화 모듈은 효율적인 연산 그래프를 만들어서 각각의 태스크로 분해하여 클러스터의 워커 노드 위에서 병렬 수행될 수 있도록 해줌.
    - 물리적 실행 엔진인 텅스텐은 전체적 코드 생성이라는 기법을 사용하여 실행을 위한 간결한 코드를 생성해냄.
    - 모든 중간 결과는 메모리에 유지되며, 디스크 I/O를 제한적으로 사용하므로 성능이 크게 향상됨
  • 사용 편리성
    데이터 프레임이나 데이터세트 같은 고수준 데이터 추상화 계층 아래에 유연한 분산 데이터세트(RDD)라 불리는 핵심적이면서도 단순한 논리 자료구조를 구축하여 단순성을 실현. 연산의 한 종류로서 트랜스포메이션, 액션의 집합과 단순한 프로그래밍 모델을 제공함으로써 사용자들이 각자 편한 언어로 빅데이터 애플리케이션 구현 가능.
  • 모듈성
    스파크 연산은 다양한 타입의 워크로드에 적용 가능하며, 지원하는 프로그래밍 언어로 표현할 수 있다.(스칼라, 자바, 파이썬, SQL, R)
    문서화가 잘된 API들로 이루어진 통합 라이브러리를 제공하며 컴포넌트 들은 다 같이 하나의 엔진 안에서 연동된 상태로 사용할 수 있다. 하나의 스파크 애플리케이션을 작성함으로써 전혀 다른 작업을 위해 별도의 엔진을 돌릴 필요도, 별도의 API를 배울 필요도 없게 됨.
  • 확장성
    저장보다는 빠른 병렬 연산 엔진에 초점이 맞추어져 있다. 저장과 연산을 분리하면서 수많은 데이터 소스에서 데이터를 읽어 들여 메모리에서 처리 가능하다는 의미.

'Data Engineering > Spark' 카테고리의 다른 글

Spark Start(2)  (3) 2024.10.31
Spark Start(1)  (1) 2024.10.30
Spark Components  (0) 2024.10.25
Spark 용어 정리  (0) 2024.06.21

+ Recent posts