본문 바로가기
Data/Spark

[Spark] Apache Spark와 RDD | LIM

by forestlim 2024. 2. 10.
728x90
반응형

Spark 의 등장 배경

 

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

Spark 등장 배경은 크게 가지 주요 요소에 기반한다.

 

[처리 속도]

Hadoop MapReduce 대규모 데이터 처리에 혁명을 가져왔지만, 일부 작업에서는 상대적으로 느린 처리 속도를 보였다. 특히, 반복적인 알고리즘과 실시간 데이터 처리가 필요한 작업에서 이러한 속도 문제가 더욱 도드라졌다. Spark은 이러한 문제를 해결하기 위해 메모리 내(in-memory) 데이터 처리를 통해 빠른 데이터 처리 속도를 제공한다.

 

[다양한 데이터 처리 요구 사항]

데이터 처리의 다양화로 인해 단순히 대량의 데이터를 처리하는 것뿐만 아니라, 실시간 스트리밍 처리, 머신러닝, 그래프 처리 다양한 유형의 데이터 처리가 필요하게 되었다. Spark은 이러한 다양한 데이터 처리 요구 사항을 하나의 통합된 프레임워크 내에서 지원함으로써 사용자가 여러 도구를 병행하여 사용하는 불편함을 줄여준다.

 

 

Spark 과 Hadoop 의 관계

위에서도 언급했다시피 Hadoop 의 MapReduce는 대규모 데이터 처리에 혁명을 가져왔지만 계산시 매번 중간 결과를 디스크(Disk)에 저장하기 때문에 Disk I/O 시간으로 인해 실시간 데이터 처리 환경에서는 적합하지 않을 수 있다. 

(하지만 배치 작업으로 큰 데이터를 안정적으로 다뤄야 할 때는 Hadoop 이 더 적절할 수 있다.)

 

그에 반해 Spark 의 경우 메모리 내 데이터 처리를 통해 MapReduce 보다 빠른 성능을 제공한다.

이는 Spark 핵심 데이터 구조인 RDD(Resilient Distributed Datasets) 데이터프레임을 통해 관리된다.

 

 

Spark 의 데이터 구조

Spark 의 데이터 구조는 크게

- RDD

- DataFrame

- Dataset

 

세 종류로 구분할 수 있다. 

Spark 에 도입된 시간 순서대로 나열한 것이고, 이번 글에서는 처음으로 도입된 RDD에 대해 정리해보려고 한다.

 

 

Spark 의 RDD란?

Spark는 기본적으로 RDD(Resillient Distributed Data)의 흐름에 의해 동작한다고 보면 된다.

RDD는 뜻을 보면 "회복력 있는 분산 데이터" 라는 뜻이다.

RDD는 Spark 에 도입되었던 가장 기초적인 데이터 구조다.

 

 

RDD는 Resillient 이름에서 알다시피 불변의 특성을 가진다. 즉 Read-Only 의 특성을 가지며 모든 작업 시 항상 새로운 RDD를 생성한다. 

 

따라서, RDD1이 변환을 거치면서 RDD1이 변하는 것이 아니라, 새로운 RDD2가 만들어지게 되는 것이다. 

이렇게 memory 내용을 갱신하지 않고 read-only 로 rdd 를 만듦으로써 Fault-Tolerant(작업 중 장애나 고장이 발생해도 서비스의 중단이 없게 하는 특성) 를 보장할 수 있게 된다. 

 

그럼 여기서 궁금증이 들었다.

 

🤔 매 계산마다 RDD를 만들면 메모리를 너무 많이 차지하는 거 아니야?

기본적으로 Spark 는 Lazy Evaluation 모델을 따른다. 즉, RDD 변환 작업은 작업이 실제로 필요할 때까지는 실행되지 않고, 작업의 정의만이 저장되는 것이다. 

즉, RDD에 대한 변환은 즉시 실행되지 않고, 해당 작업의 실행 계획만이 저장되는 것이다. 

실제 계산은 action 이 호출될 때까지 지연될때까지 지연되기 때문에 Tranformation 이 아무리 쌓여도 처리되지 않는다. 

 

 

Transformation vs Action 연산자

[Tranformation]

기존 RDD에서 새로운 RDD를 생성하는 동작이다. 즉, 리턴값은 새로운 RDD다.

대표적인 Transformation 연산자는 다음과 같다. 

이름 작업
map() rdd의 각 요소에 함수를 적용하고, 결과 rdd 리턴
filter() 조건에 통과한 값만 리턴
distinct() rdd의 값 중복 제거
union() 두 rdd 데이터 합침
intersection() 두 rdd에 모두 있는 데이터 반환

 

 

[Action]

Transformation 연산을 통해 생성된 RDD들의 실제 작업을 수행하는 동작

리턴값은 데이터 또는 실행 결과가 된다.

대표적인 Action 연산자는 다음과 같다. 

이름 작업
collect() rdd의 모든 데이터 리턴
count() rdd의 값 개수 리턴
top(num) 상위 num 개수만큼 리턴
takeOrdered(num) ordering 기준으로 num 개수만큼 리턴
reduce(func) RDD의 값들을 병렬로 병합 연산한다.

 

 


회사 내에서 databricks 를 이용해 파이프라인을 만들고 관리할 일이 생겨서 spark 를 공부해야 할 니즈를 느꼈고, 그간 틈틈히 공부했던 것들을 정리해보았다 🚀

 

다음엔 Spark DataFrame, Dataset 에 대해서도 학습하고 정리해보려고 한다. 

728x90
반응형

댓글