본문 바로가기
Apache/Spark

[6장] 스파크 SQL과 데이터세트

by 잼있는잼니 2023. 9. 13.

이번 장은 데이터세트 구조를 고수준 API으로 수용하기 위해서 스파크가 메모리를 어떻게 관리하는지 알아보자.


스파크 데이터세트 및 데이터 프레임을 위한 메모리 관리

스파크는 인메모리 분산 빅데이터 엔진이기 때문에, 메모리를 효율적으로 사용하는 것은 중요하다. 

 

스파크 1.X에서, 인코더라고 불리는 효율적인 메커니즘을 사용해 JVM과 내부 텅스텐 포맷 사이를 직렬화하고 역직렬화한다. 오프 힙에 메모리를 직접 할당하는 건 스파크가 GC에 의해 받는 영향을 줄일 수 있다는 것을 의미한다.

 

스파크 2.X는 전체 단계 코드 생성 및 벡터화된 칼럼 기반 메모리 레이아웃을 특징으로 하는 텅스텐 엔진을 도입했으며, 빠른 병렬 데이터 액세스를 위하여 '단일 명령, 다중 데이터(SIMD)' 접근 방식의 최신 CPU 및 캐시 아케텍처를 활용했다.

 

데이터 집합 인코더

 

인코더는 오프 힙 메모리의 데이터를 스파크의 내부 텅스텐 포맷에서 JVM 자바 오브젝트로 변환하며, 원시 데이터 -> JVM 객체로 데이터세트 객체를 직렬화하고 역직렬화한다.

 

스파크 내부 형식과 자바 객체 형식 비교

 

스파크는 데이터세트 또는 데이터 프레임을 위해 JVM 기반 객체를 생성하는 대신에 오프 힙 자바 메모리를 할당, 데이터를 레이아웃하고, 인코더를 이용하여 데이터를 메모리 내 표현에서 JVM 객체로 변환한다.

 

직렬화 및 역직렬화

 

직렬화 및 역직렬화는 송신자에 의해 이진(Binary)로 인코딩(직렬화)되고, 수신자에 의해 이진(Binary)에서 데이터 형식 객체로 디코딩(역직렬화)되는 프로세스이다.

 

스파크 클러스터의 노드간 공유시, JVM 객체 -> 송신시 바이트 배열로 직렬화 -> 수신시 JVM 객체로 직렬화 

 

과한 직렬화 및 역직렬화를 완화하기 위한 전략중 첫 번째는 쿼리에서 DSL 표현을 사용하고 람다를 고차 함수에 대한 인수로 과하게 사용하는 것을 피하는 것이다.

 

두 번째는 직렬화 및 역직렬화가 최소화되도록 쿼리를 함께 연결하는 것이며, 이는 스파크에서 일반적이다.

 


 

댓글