본문 바로가기
Bigdata Components/SPARK

[SPARK] spark job과 partition의 개념

by Blue____ 2024. 1. 6.

이전 글에서는 spark의 executor memory 구조와 튜닝 포인트에 대해서 살펴 보았습니다. 

이번 글에서는 Spark의 배포 방식과 partition의 구조에 대해서 살펴 볼 예정입니다.


 

Spark 배포 방식 (spark - deploy mode)

Spark의 배포 방식(deploy-mode)은 spark driver를 누가 관리하냐에 따라 client-mode와 cluster-mode로 나누어 집니다.

 

Client-mode

Client mode는 Driver가 spark job을 제출한 node에서 JVM을 띄워 할당됩니다. 즉, 해당 노드에서 Driver의 리소스를 확보해야 합니다. 예를 들어, User가 spark-app들을 제출한 노드에서 spark 프로세스들을 검색해보면 여러 driver가 띄워져 있는게 확인 가능하며, spark histroy UI 상으로는 "executor" tab에서 driver의 위치를 확인 할 수 있습니다. 

 

Cluster-mode

Cluster 모드는 Driver의 위치가 spark job을 제출한 곳이 아닌, 워커 노드들 중에 한곳에 할당됩니다. 즉, cluster manager (YARN)에게 driver 띄울 위치를 요청하고, container를 할당받아, driver 프로세스가 올라오게 됩니다. cluster-mode를 사용하는 이유는 client-node (user들이 주로 job이 제출하는 노드)에 사용자가 많으면 driver 띄우는 것부터가 어려울 수 있습니다. 또한, 큰 사이즈의 driver 리소스 할당도 어려울 확률이 높습니다.

 

따라서, driver의 리소스(cpu, memory)를 크게 할당하려면 cluster-mode로 진행하는게 일반적입니다. 

 

Partition의 개념

Partition은 이전 글에서 설명한 것과 같이, RDD의 최소단위의 논리적인 데이터 표현 방식이다. (물리적으로는 여러 객체 형태 등이 분산 노드에 위치입니다.)  spark는 partition을 통해 분산처리가 가능하며, executor의 가용 가능한 core 수에 따라 동일 노드에서 병렬로 처리될 수도 있고, 다른 노드에서 위치할 수도 있습니다. 

 

그렇다면 partition과 task의 관계는 어떻게 될까요? 

 

기본적으로 하나의 Task는 하나의 partition과 mapping되어 ([SPARK] Spark 개념 정리 및 Architecture 글 참고), 처리되며 하나의 task는 하나의 core(정확히 는 vcore - spark는 vcore를 기준으로 task수행한다.)가 연산을 담당합니다. 

즉, 1 core(Vcore) = 1 task = 1 partition 관계라고 보면 이해가 편합니다. 

 

Partition의 수는 core(Vcore)수에 매핑되며, Partition의 크기는 core(Vcore) 당 필요한 메모리의 크기가 됩니다. 즉, Partition의 수를 늘리면 partition 크기가 작이지고, 반대로 partition의 수가 줄면 partition의 크기가 커지게 됩니다. 이전 글인 [SPARK] Spark의 Execuotr memory 구조에서의 추가 튜닝 포인트와 연관되는 내용으로 partition 수와 paritition의 크기는 성능과 매우 직접적으로 연결됩니다. 

 

예를 들어, partition의 수가 많고, partition의 크기가 작다면 vcore가 한정적인 경우, 많은 partition을 mapping해 처리해야 하는 task가 늘어나게 됩니다. 그만큼 많은 vcore가 필요하며, 동시에 작은 paritition 사이즈로 인해 partition끼리 많은 데이터 이동 (shuffle)이 일어나 성능에 영향을 줄 수 있습니다. 

 

반대로 partition 수를 줄이고, partition 크기를 키운다면, 그만큼 하나의 Task에 많은 메모리가 필요하기 때문에 Spill(메모리가 부족해 disk에 중간 데이터 저장)이 일어나게 됩니다. 

 

즉, 코드 튜닝, 모니터링을 통해 적정 값을 설정해줘야 합니다. 

 

spark-shell과 spark-submit이란

spark-shell은 Spark의 인터랙티브한 셸 환경을 제공하는 도구이며, 실행과 동시에 session이 오픈되는게 특징입니다. 실제로 cli 혹은 notebook이 대표적인 spark-shell을 통한 spark의 실행 환경을 제공해줍니다. 

 

spark-submit은 Spark app을 클러스터에서 실행하기 위한 command(명령줄) 도구입니다. 일반적으로 배치 프로세싱 작업이나 긴 실행 시간을 필요로 하는 작업을 클러스터에서 실행할 때 사용됩니다. 

 

결론적으로 위의 두 가지는 동작 방식은 큰 차이가 없으며, 실행 환경과 방법에서 차이가 존재합니다.

  • spark-shell : 인터랙티브한 Spark 환경을 제공하여 코드 탐색과 테스트에 사용
  • spark-submit : 배치 프로세싱 작업과 같은 많은 리소스가 필요한 Spark app을 실행하기 위해 사용