더북(TheBook)

5.6 텅스텐 프로젝트의 스파크 성능 향상

 

스파크 버전 1.5와 함께 공개한 텅스텐(Tungsten) 프로젝트는 스파크의 메모리 관리 방식을 완전히 개혁했으며, 정렬·집계·셔플링 연산의 성능도 대폭 개선했다. 스파크 버전 1.5부터는 텅스텐을 기본으로 활성화한다. (스파크 SQL의 spark.sql.tungsten.enabled 환경 매개변수로 활성화 여부를 설정할 수 있다. 기본 값은 true다.) 스파크 버전 2.0은 텅스텐을 DataFrame의 정형 데이터에서 Dataset의 비정형 데이터로 확대했다.

텅스텐 엔진은 객체(정수형, 문자열, 튜플 등)를 이진수로 인코딩(binary encoding)하고 메모리에서 직접 참조하는 방식으로 메모리 관리 성능을 개선했다. 텅스텐은 오프-힙 할당(off-heap allocation)과 온-힙 할당(on-heap allocation)이라는 두 가지 메모리 관리 모드를 지원한다. 온-힙 할당 모드는 이진수로 인코딩한 객체를 JVM이 관리하는 대규모 long 배열에 저장한다. 오프-힙 할당 모드sun.misc.Unsafe 클래스를 사용해 마치 C 언어처럼 메모리를 주소로 직접 할당하고 해제한다.

오프-힙 모드도 객체를 long 배열에 저장하지만, 이 배열들은 JVM이 할당하지 않으며 가비지 컬렉션 대상에서도 제외된다. 그 대신 오프-힙 모드에서는 스파크가 배열을 직접 관리한다. UnsafeRow는 스파크가 직접 관리하는 메모리에 저장되는 로우를 표현하는 내부 클래스다. 오프-힙 할당 모드는 기본으로 비활성화되어 있지만 스파크의 spark.unsafe.offHeap 환경 매개변수(스파크 SQL의 매개변수가 아니다)를 true로 설정해 활성화할 수 있다.

이진수로 인코딩된 객체는 자바 객체보다 훨씬 더 적은 메모리를 차지한다. 온-힙 모드에서는 이 객체를 Long 배열에 저장함으로써 가비지 컬렉션을 크게 줄일 수 있다. 오프-힙 모드에서는 이 배열을 스파크가 직접 할당하므로 가비지 컬렉션 자체가 필요 없다. 또 텅스텐의 이진 인코딩 방식은 CPU의 L1 및 L2 캐시를 더욱 효율적으로 활용할 수 있는 다양한 기법을 사용한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.