Data Engineering/Spark
[Spark] 스파크 RDD란? (Resilient Distributed Dataset) - 2
PTJ
2025. 5. 26. 10:41
Spark를 사용하기 앞서 RDD라는 기본적인 데이터 구조에 대해 확실히 이해하는것이 중요합니다. 지난 포스팅에서는 RDD의 개념을 간단하게 알아보았다면 이번에는 RDD가 개발 배경과 특징에 대해 자세히 알아보겠습니다.
1. RDD란?
중요한만큼 다시한번 RDD에 대해 알아봅시다.
- RDD
- RDD는 immutable한 분산된 object들의 collection이다.
- RDD의 각 데이터셋은 logical patition으로 나눠져있어 클러스터 내의 물리적으로 다른 컴퓨팅노드에서 처리될 수 있다.
- read-only의 파티션된 record의 집합이다.
- storage나 다른 RDD로 부터 deterministic operation(결정론적인 동작, Spark의 API)을 통해서 만들어질 수 있다.
- 병렬로 실행될 수 있는 Fault-tolerant collection이다.
- RDD 만드는 방법
- Driver 프로그램에 있는 collection을 parallelize 한다.
- 외부 스토리지에 있는 데이터를 참조해서 만든다.
2. MapReduce의 단점
RDD는 MapReduce의 작업을 빠르고 효과적으로 하는 것을 목표로 설계되었습니다. MapReduce에 어떤 문제점이 있는지 알아보겠습니다.
2.1 데이터 공유가 느린 MapReduce
- 맵리듀스는 하나의 클러스터에서 병렬적으로 분산된 알고리즘을 대용량의 데이터셋에 대해 적용하기위해 채택되었다.
- 맵리듀스를 통해 분산 작업이나 fault tolerance에 대한 걱정 없이 high-level operator로 편하게 분산 컴퓨팅 작업을 작성할 수 있다.
- 하지만 기존의 MapReduce 프레임워크(Hadoop의 MapReduce)는 작업 사이에 데이터를 재사용해야할 때, 외부 스토리지에 데이터를 쓰고 읽어야 하는 제약이 있다. 그 작업으로 인해 성능과 생산성에 안좋은 영향을 미친다.
- 반복적이고 대화형(상호작용이 필요한)인 어플리케이션들은 분산 처리 작업 사이에 더 빠른 데이터의 공유를 요구한다.
- 맵리듀스에서의 데이터 공유 작업은 복제, serialization, disk I/O 때문에 느려진다.
- Hadoop에서 데이터를 사용하는 경우 맵리듀스는 스토리지와의 read-write에 90%의 시간을 사용한다.
2.2 Iterative(반복 작업) on MapReduce
- 아래 그림은 기존의 맵리듀스 프레임워크가 multi-stage application에서 연산을 여러번하는 과정과 결과를 나타낸 그림이다.
- (iterative operation) 각 stage 사이마다 일어나는 data read/write 과정에서 data 복제, disk I/O, serialization으로 오버헤드가 증가한다.
2.3 Interactive Operations(대화형 작업) on 맵리듀스
- 아래 그림은 대량의 데이터에 대해 ad-hoc query를 요청하는 상황이다.
- interactive query에 대해 기존의 하둡 프레임워크(hive-MapReduce)에서 어떻게 처리하는지를 나타낸 그림이다.
- 각 쿼리는 데이터 조회를 위해 disk I/O를 stable storage에 대해 수행한다.
3. Spark RDD의 특징
위에서 살펴봤듯이 Hadoop에서 데이터를 사용하는 경우 MapReduce는 스토리지와의 read-write에 90%의 시간을 사용합니다.
Spark RDD가 이러한 문제를 어떻게 해결했는지 알아봅시다.
3.1 Spark RDD를 사용하는 데이터 공유
- Spark의 RDD모델은 기존 맵리듀스의 문제를 in-memory processing으로 해결하고자 했다.
- 메모리 상태를 object로 저장하고, 작업들 사이에서 공유하면 Disk I/O 보다 빠를 뿐만 아니라 부하도 줄어들게 된다는 아이디어다.
- 메모리 상에서의 데이터 공유는 network I/O나 disk I/O보다 10배에서 100배 빠르다.
3.2 Iterative Operations(반복 작업) on Spark RDD
- 중간 작업의 결과를 스토리지가 아닌 분산된 메모리에 저장한다. 마지막 최종 작업의 결과만 disk에 저장한다.
3.3 Interactive Operations(대화형 작업) on Spark RDD
- 여러개의 Query가 다양하게 들어오더라도 RDD데이터는 메모리에 로드되어있으므로 disk I/O보다는 빠르게 응답할 수 있다.
- 기본적으로 각 RDD는 action의 요청마다 다시 계산한다. 하지만, RDD를 persist(지속, 영구 저장)하면 RDD를 메모리에 유지할 수 있다.
- 여러 operation에서 반복적으로 사용하게 될 데이터의 snapshot에 대해서는 메모리에 persist 시키면 다음 작업에서는 인메모리에서 더 빠르게 변환된 데이터를 사용할 수 있다.
- RDD는 메모리 뿐만 아니라 disk나 분산된 노드에도 persist할 수 있다.