Apache Spark Spill
Apache Spark에서 spill은 메모리 용량을 초과할 때 발생하는 작업을 의미함.
Spark는 큰 데이터 세트를 처리할 때 필요한 메모리를 모두 확보할 수 없는 경우, 임시적으로 디스크에 데이터를 저장함.
이 과정을 spill to disk라고 하며, 이를 통해 메모리 부족 문제를 회피하고 작업의 계속을 가능하게 함.
Apache Spark Spill 발생 원인
Spark에서 다양한 상황에서 spill이 발생할 수 있음.
1. Shuffle 작업 중
여러 노드 간에 데이터를 재분배할 때, 각 노드에서 처리해야 할 데이터가 메모리에 들어갈 수 없는 경우.
2. Aggregations 및 Joins
큰 키에 대한 데이터 집계나 조인을 수행할 때, 관련 데이터를 메모리에 모두 유지할 수 없는 경우
Apache Spark Spill 처리 과정
1. 메모리 사용 체크
Spark는 연산을 수행하면서 지속적으로 사용 중인 메모리 양을 체크함.
2. 메모리 초과 시 디스크 쓰기
사용 가능한 메모리가 부족하면, Spark는 처리 중인 데이터의 일부를 디스크에 쓰기 시작함.
3. 데이터 재읽기
디스크에 저장된 데이터는 필요할 때 다시 읽혀져서 메모리에 로드되며, 연산이 계속됨.
Apache Spark Spill 발생의 영향
1. 성능 저하
디스크 I/O는 메모리 연산보다 훨씬 느리기 때문에, spill이 발생하면 전체 작업의 처리 시간이 길어짐.
2. 디스크 사용량 증가
자주 발생하는 spill은 디스크 공간을 상당량 사용할 수 있으며, 디스크의 수명에도 영향을 미칠 수 있음.
Apache Spark Spill 최소화 전략
1. 메모리 확장
클러스터의 메모리 용량을 늘려서 데이터가 가능한 한 메모리에 머무를 수 있도록 하자.
2. Partition 조절
적절한 파티션 수를 설정하여 각 노드에서 처리해야 할 데이터 양을 조절하자.
3. Persistence 수준 조절
Spark에서는 RDD의 persistence(지속성) 수준을 설정할 수 있음.
필요에 따라 메모리만 사용하거나, 메모리와 디스크를 함께 사용하는 등의 선택이 가능함.
4. 데이터 직렬화
데이터를 효율적으로 직렬화하여 메모리 사용량을 최소화하자.
Apache Spark Spill 요약
Spark에서는 spill을 피할 수 없는 경우도 많음.
하지만 위와 같은 전략을 통해 spill의 발생 빈도와 영향을 줄일 수 있음.
이는 전체적인 성능 향상으로 이어질 수 있음.
Apache Spark 직렬화 메커니즘
Spark에서 데이터 직렬화는 클러스터 간에 데이터를 효율적으로 전송하고 저장하기 위해 매우 중요한 역할을 함.
데이터 직렬화는 객체를 네트워크를 통해 전송하거나 디스크에 저장할 수 있는 바이트 스트림으로 변환하는 과정을 말함.
Spark는 이 과정을 통해 작업 노드 간에 객체를 효율적으로 교환하고, 필요할 때 디스크에 데이터를 캐시하거나 퍼시스턴스를 관리함.
Apache Spark 직렬화 메커니즘 종류
Spark는 두 가지 기본 직렬화 라이브러리를 지원함.
1. Java 직렬화
자바의 내장 직렬화를 사용하며, 모든 Serializable 객체를 직렬화할 수 있음.
이 방식은 구현이 간단하지만 성능과 직렬화 후 생성되는 데이터 크기 측면에서 비효율적일 수 있음.
2. Kryo 직렬화
Kryo는 성능을 최적화한 직렬화 프레임워크로, Spark에서 권장하는 방식임.
Kryo는 직렬화 속도가 빠르고 직렬화된 데이터의 크기도 상대적으로 작음.
그러나 모든 클래스가 기본적으로 Kryo에 의해 직렬화될 수 있는 것은 아니며, 때로는 클래스를 Kryo 직렬화에 맞게 등록해야 할 수도 있음.
Apache Spark 직렬화 메커니즘 설정과 사용
Spark에서는 spark.serializer 속성을 통해 직렬화 방식을 설정할 수 있음.
기본적으로 Java 직렬화가 설정되어 있지만, 대부분의 경우 성능 향상을 위해 Kryo 직렬화로 변경하는 것이 좋음.
val conf = new SparkConf()
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
또한, 특정 클래스를 Kryo에 등록함으로써 직렬화 프로세스를 최적화할 수 있음.
conf.registerKryoClasses(Array(classOf[MyClass1], classOf[MyClass2]))
Apache Spark 직렬화 메커니즘의 중요성
직렬화는 Spark의 성능에 큰 영향을 미침.
특히 다음과 같은 경우 직렬화가 중요함.
1. 대규모 데이터 처리
대용량 데이터를 다룰 때 직렬화/역직렬화 과정에서 발생하는 지연 시간과 네트워크 대역폭 사용량이 성능에 큰 영향을 미칠 수 있음.
2. 분산 처리
Spark는 데이터를 여러 노드에 분산시켜 처리하기 때문에, 객체를 네트워크를 통해 효율적으로 전송하는 것이 중요함.
3. 메모리 사용 최적화
효율적인 직렬화는 메모리 사용량을 줄이고, 따라서 자주 발생하는 메모리 스플릴(spill)을 방지할 수 있음.
Apache Spark 직렬화 메커니즘 정리
직렬화는 Spark의 내부적인 성능 최적화뿐만 아니라 사용자 경험과 직접적으로 관련이 있음.
특히 대규모 데이터를 처리할 때 적절한 직렬화 설정은 필수적임.
따라서 Spark 애플리케이션을 설계할 때는 직렬화 방식을 신중하게 선택하고 필요에 따라 직렬화방식을 최적화 하는 것이 중요함.
'Data Engineering > Spark' 카테고리의 다른 글
[Spark] 에러 - You can set "spark.sql.legacy.timeParserPolicy" to "LEGACY" to restore the behavior before Spark 3.0, or set to "CORRECTED" and treat it as an invalid datetime string. (0) | 2024.05.27 |
---|---|
[Spark] Partition, Parquet 파일 크기 (0) | 2024.05.08 |
[Spark] Spark Executor 란 무엇일까 (2) | 2023.12.30 |
[Spark] 스파크란 무엇인가? (0) | 2023.04.21 |
[Spark] conda로 pyspark 환경 구축하기 (0) | 2023.01.14 |