SparkML

Cache & Persist

터칭 데이터 2024. 2. 5. 14:25

 

Spark 고급과 Spark ML


Shuffling시 Skew 처리방식과 Spark ML에 대해 배워보자

 

 

 

 

 

 

 

 

Contents


1. 기타 기능/개념 살펴보기
2. Driver와 Executor 해부
3. 메모리 이슈 정리
4. JVM과 Python 간의 통신
5. Caching과 Persist
6. Dynamic Partition Pruning

 

 

 

 

 

 

Caching과 Persist

 

어느 데이터시스템이건 반복되어서 사용되는 데이터가 있다면 메모리에 두는 것이 좋은데

Spark에서 사용법에 대해 알아보자

 

 

 

 

 

 

Caching

 

 

1. Caching이란 무엇이며 왜 caching이 필요한가?
2. 어떻게 DataFrame을 caching하는가?
3. 언제 caching하고 언제 하지 말아야 하는가?
4. Caching을 취소하는 방법은?
5. Caching 포맷은?
6. Caching을 메모리에 할까? 디스크에 할까?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Caching이란 무엇이며 왜 caching이 필요한가?

 

자주 사용되는 데이터프레임을 메모리에 유지하여 처리속도 증가

● 단 그 데이터프레임이 정말 메모리에 있는지 확인 필요
● 어떤 경우에는 다시 계산하는 것이 빠를 수도 있음

 

단 메모리 소비를 늘리므로 불필요하게 모든 걸 캐싱할 필요는 없음

 

 

 

 

 

 

 

 

 

 

 

 

 

어떻게 DataFrame을 caching하는가? (1)

 

두 가지 방법이 존재

● cache()
● persist()

 

둘다 데이터프레임을 메모리/디스크/오프힙에 보존

● 모두 lazy execution - 필요해지기 전까지 캐싱하지 않음
● caching은 항상 파티션 단위로 메모리에 보존
    ▪ 하나의 파티션이 부분적으로 caching되지 않음

 

 

 

 

 

 

 

 

 

 

어떻게 DataFrame을 caching하는가? (2)

 

persist는 인자를 통해 세부 제어 가능

● useDisk = True
● useMemory = True
● useOffHeap = False
    ▪ off Heap 설정이 필요
● deserialized = False
    ▪ 메모리를 줄일지 아니면 CPU 계산을 줄일지? 후자++
    ▪ deserialized = True는 메모리에서만 가능
● replication = 1
    ▪ 몇 개의 복사본을 서로 다른 executor에 저장할지 결정

 

 

 

 

 

 

 

 

 

 

 

 

 

어떻게 DataFrame을 caching하는가? (3)

persist의 인자로 자주 사용되는 조합은 하나의 상수로 지정 가능

● DISK_ONLY
● MEMORY_ONLY
● MEMORY_AND_DISK
● MEMORY_ONLY_SER
● MEMORY_AND_DISK_SER
● OFF_HEAP
● MEMORY_ONLY_2
● MEMORY_ONLY_3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

어떻게 DataFrame을 caching하는가? (4)

 

persist는 기본적으로 caching되는 데이터프레임을 메모리와 디스크에 보관하고 복제도 수행함

 

cache는 persist의 다음 버전

● disk=False
● memory=True
● offHeap=False
● deserialized=True
● replication=1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Spark SQL을 사용한 Caching

 

spark.sql("cache table table_name")

 

spark.sql("cache lazy table table_name")

 

spark.sql("uncache table table_name")

 

 

 

 

 

 

 

 

 

 

 

 

 

Caching을 취소하는 방법은?

 

DataFrame.unpersist (LRU - Least Recently Used)

 

spark.sql("uncache table table_name")

 

spark.catalog.isCached("table_name")

 

spark.catalog.clearCache()

 

 

 

 

 

 

 

 

 

 

 

Caching 실습

Caching 여부 확인

● Spark Web UI의 Storage 탭 확인

 

 

 

 

 

 

 

 

 

 

 

 

 

Caching 관련 Best Practices

 

캐싱된 데이터 프레임이 재사용되는 것을 분명하게 하기

● cachedDF = df.cache()
● cachedDF.select(…)

 

컬럼이 많다면 정말 필요한 컬럼만 캐싱

● cachedDF = df.select(col1, col2, col3, col4).cache()

 

불필요할 때 uncache

 

때로는 매번 새로 데이터프레임을 계산하는 것이 캐싱보다 빠를 수 있음

● 이는 큰 데이터셋이 Parquet와 같은 포맷으로 존재하는 경우
● 캐싱결과가 

❖ 소수의 너무 커서데이터프레임만 메모리에만 있을 수캐싱없는 경우
❖ 큰 데이터프레임의 캐싱은 하지 말것
❖ 캐싱을 너무 믿지 말것

 

 

 

 

 

 

'SparkML' 카테고리의 다른 글

Driver Executor OOM  (0) 2024.02.05
Driver Executor Memory  (0) 2024.02.05
Spark Scheduler  (0) 2024.02.05
Resource Dynamic Allocation  (0) 2024.02.05
Speculative Execution  (0) 2024.02.05