Spark 의 Global Temporary View

데이터 사이즈 불균형으로 인한 쏠림을 해결하는 방법 중 하나

많은 업체들이 Spark 를 이용해 데이터를 처리하고 있고 내가 다니는 회사인 밸런스히어로도 Spark 를 이용해 배치 작업 및 Ad-hoc 작업을 처리하고 있다.

그러다 보면 큰 데이터 또는 파티셔닝 된 데이터와 아주 작은 크기의 메타 정보가 담긴 데이터와 같이 연산을 해야 하는 경우가 발생한다.

그러한 데이터 사이즈의 불균형으로 인해서 클러스터 상의 특정 장비에만 작업이 쏠리고 클러스터의 성능을 많이 발휘 못하는 상황이 발생한다. (그만큼 느려진다)

그래서 메타 정보를 Spark Global Temporary View 에 등록하고 쿼리를 수정했다.

Global Temporary View

spark.read.parquet("...").createOrReplaceGlobalTempView('temp_view')
# ...
spark.sql("SELECT * FROM global_temp.temp_view")
# ...
spark.catalog.dropGlobalTempView('temp_view')

위의 예시는 Python 코드로 Spark 2.1.0 에서 처음 소개 되었고 선언하고 나면 일종의 임시 테이블로 접근할 수 있다.

모든 장비에 최초에 한번 등록하고 나면 이후에 해당 데이터로 인한 셔틀링 없이 데이터의 불균형이 해결되어서 성능이 개선되었다.

주의 해야할 점은 일단 등록시 IO로 인해서 초기 로딩 속도가 느려지고, 만약 아주 큰 크기의 View 가 등록되었으면 장비가 내려갈 수도 있다. 이와 같은 이유로 Global Temporary View 를 신중히 검토하고 사용해야 한다.

참고한 링크들

TECH | 22 May 2018 by ungikim