-
Spark persist()와 cache()Data Engineering/Spark 2022. 12. 28. 18:54
Spark에서는 action 시점마다 데이터를 메모리로 로드합니다
따라서 action이 여러 번 될 때 매번 데이터를 로드하면 비효율적이므로 한번 로드한 데이터 메모리 상에 저장시킬 수 있는 cache와 persist 메소드가 존재합니다.
cache와 persist 두 메소드 모두 데이터를 저장공간에 올려두는 작업을 하는데 약간의 차이가 있습니다.
(Spark 3.3.1 기준입니다.)
- cache()
- 기본값으로 설정된 storage level만 활용 가능
- RDD를 활용할 때에는 cache()는 persist(StorageLevel.MEMORY_ONLY)로 동작
- DF 또는 Dataset를 활용할 때에는 cache()는 persist(StorageLevel.MEMORY_AND_DISK)로 동작
- persist()
- storage level을 직접 정할 수 있음
출처 : Spark 3.3.1 docs
진행하고 있는 프로젝트에서 cache, persist의 속도 차이를 비교해보았습니다.
아래 코드에서 cache() 부분만 바꿔보면서 테스트 해보았습니다.
df_pyspark.createOrReplaceTempView("item_sales") sql = "select * from item_sales" sales_part = (spark.sql(sql).repartition(spark.sparkContext.defaultParallelism, ['컬럼명'])).cache( )
결과
cache 사용하지 않았을 때 cache() 사용 persist(StorageLevel.MEMORY_ONLY) 사용 0.44832초 0.74691초 0.20407초 cache를 사용하였을 때 cache를 사용하였을 때보다 속도가 더 오래 걸렸습니다.
이유로 캐싱비용과 cache의 기본 storage level이 MEMORY_AND_DISK 기 때문에 DISK I/O 비용이 추가적으로 들었을 것이라고 생각하였습니다.
따라서 storage level을 MEMORY_ONLY로 설정하여 DISK I/O 비용을 줄여보았는데 속도가 줄어든 결과를 얻었습니다.
'Data Engineering > Spark' 카테고리의 다른 글
Parquet와 csv 차이 (0) 2022.12.28 - cache()