RDD 와 RDD 에서 호출하는 액션들에 대한 모든 의존성을 재연산하게 되는데, 호출하는 액션들에 대한 모든의존성을 재연산하게 된다.
이때 데이터를 여러번 스캔하는 반복알고리즘들에 대해서는 매우 무거운 작업일 수 있다.
여러번 반복 연산하는 것을 피하려면 스파크에 데이터 영속화(persist/persistence)를 요청할 수 있다.
RDD 영속화에 대한 요청을 하면 RDD를 계산한 노드들은 그 파티션들을 저장하고 있게 된다.
자바에서는 기본적으로 persist()가 데이터를 JVM 힙(heap) 에 직렬화되지 않는 객체 형태로 저장.
레벨 공간사용 CPU 사용시간 메모리에 저장 디스크에 저장 비고
MEMORY_ONLY 높음 낮음 예 아니오
MEMORY_ONLY_SER 낮음 높음 예 아니오
MEMORY_AND_DISK 높음 중간 일부 일부 메모리에 넣기에 데이터가 너무 많으면 디스크에 나눠 저장
MEMORY_AND_DISK_SER 낮음 높음 일부 일부 메모리에 넣기에 데이터가 너무 많으면 디스크에 나눠 저장.메모리에 직렬화된 형태로 저장
DISK_ONLY 낮음 높음 아니오 예
persist() 호출은 연산을 강제로 수행하지않는다.
메모리에 많은 데이터를 올리려고 시도하면 스파크는 LRU 캐시 정책에 따라 오래된 파티션들을 자동으로 버림.
예제 코드
import org.apache.spark.storage.StorageLevel
val result = input map(x => x*x)
result.persist(StorageLevel.DISK_ONLY)
println(result.count())
println(result.collect().mkString(","))
'BackEnd > Spark' 카테고리의 다른 글
Spark History Server 실행 오류 시 (0) | 2020.02.10 |
---|---|
SparkSession (0) | 2020.02.06 |
Spark BroadCast (0) | 2019.08.28 |
SPARK 에서의 기본 행동(action) 연산자 및 변환(transformation)연산자(2) (0) | 2018.06.18 |
SPARK 에서의 기본 행동(action) 연산자 및 변환(transformation)연산자(1) (0) | 2018.06.17 |