RDD
- 스파크는 RDD(Resilient Distributed Datasets, 탄력적 분산 데이터셋)이라고 불리는 이뮤터블(immutable) 자바 가상 머신(JVM) 객체들의 집합으로 구성됨
- 이 객체들은 잡들이 매우 빠르게 연산할 수 있도록 메모리상에서 캐시되고 저장되고 계산됨
- 이러한 스키마는 하둡과 같은 다른 전형적인 분산 처리 시스템과 비교해 빠른 연산이 가능.
- map(), reduce(), filter()와 같은 트랜스포메이션(transformation)을 제공
- 다양한 연산을 수행하기 위해 하둡 플랫폼의 유연성과 확장성을 유지
- 병렬로 데이터에 트랜스포메이션을 적용하고 기록하는데, 이는 속도와 내구성을 향상시킴
- 트랜스포메이션별로 데이터의 흐름(data lineage)를 제공
- 이로 인해 RDD는 데이터 유실을 막을 수 있으며, RDD 일부의 파티션이 없어지더라도 추가적인 데이터 복구를 하지 않고 유실된 파티션을 재생산해낼 수 있는 충분한 데이터를 가지고 있음
- RDD에서 병렬 연산은 포인터를 새로운 RDD에 리턴하는 트랜스포메이션(transformation)과 연산 후에 값을 리턴하는 액션(action) 이렇게 두종류가 있음.
- RDD 트랜스포메이션은 연산을 즉시 하지 않는다는 점에서 게으른 연산이라 함
- 트렌스포메이션은 액션이 실행되고 결과가 드라이버에 리턴되어야 할때만 수행됨
- 실행을 지연시키려면 성능 측면에서 더욱 정교화된 쿼리를 수행할 수 있음
- 최적화는 아파치 스파크 DAG 스케줄러(스테이지를 이용해 변형하는 스테이지 기반의 스케줄러)에서 시작
- RDD는 트랜스포메이션과 액션이 분리되어 DAG 스케줄러의 경우 최적화를 쿼리상에서 수행할 수 있으며, 또한 데이터를 섞는 것 같은 상당한 리소스가 소모되는 작업을 피할 수 있음
- 테이블 조인 효율화 같은 처리를 사용자가 직접 제어 해야 했기 때문에 최적화에 어려움
// RDD 예제
val data = Array(1, 2, 3, 4, 5)
val distData = sc.parallelize(data)
distData.map(x => if(x >= 3) x else 0).reduce((x, y) => x + y)