RDD의 persistence, Caching에 대해서 정리
Persistence와 Cache가 무엇인가가?
RDD 를 영구적으로 저장하는 기술로 결과를 즉시 저장해두었다가 이후에 필요하면 다시 불러와서 사용이 가능하다. 이것으로 컴퓨팅오버헤드를 줄일 수 있다.
이럴때 RDD를 저장하는 방법은 cache() 와 persist() 메서드가 있다.
cache() 메서드는 모든 메모리의 모든 RDD를 저장할 수 있다. 그리고 RDD를 메모리에 유지하고 병렬작업에서 효율적으로 사용 할 수 있다.
Cache()와 Persist()의 메서드의 차이는 ?
cache()와 persist()의 차이점 : cache()를 사용하면 기본 저장 장소가 MEMORY_ONRY 이고 persist를 하면 다양한 저장소에 수준을 저장할 수 있다.
RDD의 파티션이 손실되면 원래 생성한 변환작업을 통해 다시 복구한다.
Spark 에서 Persist가 필요한 이유
RDD 와 RDD 에서 호출하는 액션들에 대한 모든 의존성을 재연산하게 되는데, 호출하는 액션들에 대한 모든의존성을 재연산하게 된다.
이때 데이터를 여러번 스캔하는 반복알고리즘들에 대해서는 매우 무거운 작업일 수 있다.
persist 함으로서 반복적인 알고리즘과 메모리의 소비를 줄 일 수 있다.
여러번 반복 연산하는 것을 피하려면 스파크에 데이터 영속화(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(","))
Dataset<Row> 또한 데이터가 아니라 변환작업들을 저장하고 있어 불러올 때 마다 값이 달라질 수도있는데, 이것을 persist 하면 cached 된 데이터를 사용하기 때문에 다시 계산할 필요없다.
https://data-flair.training/blogs/apache-spark-rdd-persistence-caching/
'BackEnd > Spark' 카테고리의 다른 글
cleaned accumulator [number] (0) | 2020.03.09 |
---|---|
SparkUI 에러 InjectionManagerFactory not found (0) | 2020.03.06 |
스파크 SQL 사용하여 파일로 보내기 (0) | 2020.03.02 |
java.io.InvalidClassException: org.apache.spark.rdd.RDD (0) | 2020.02.18 |
Spark History Server 실행 오류 시 (0) | 2020.02.10 |