Archive

[Spark] Spark ( Architecture / Deploy Mode / Partition ) 본문

------- DE -------/Spark

[Spark] Spark ( Architecture / Deploy Mode / Partition )

enent 2022. 8. 9. 19:16
반응형

1. Spark Application 구조 소개

1) Spark Driver 

Spark Driver는 Spark Session 객체를 초기화, Cluster Manager와 통신하며 Executor들을 위해 필요한 자원 ( CPU, Mem 등)을 요청, Spark 작업을 DAG형태로 Transform 및 Scheduling 하는 역할을 한다. 즉, Spark 내 필요한 자원을 받아오고 Executor과 통신하는 일종의 Spark Job의 Managing 역할을 하게 된다.

Spark Session 객체를 생성하고, 이 객체를 통해 Executor와 Cluster Manager과 통신한다.

 

2) Spark Session

Spark Session은 Cluster Manager와 연결되는 객체로, Spark 연산과 데이터에 대한 통합 연결 채널이다. JVM 실행 파라미터들 생성, DataFrame / DataSet 정의, Data Source로부터 Data 읽기, Metadata 접근 및 Spark SQL 질의를 실행하는 역할을 한다.

하나의 Application은 하나의 Spark Session을 생성하며, 모든 Spark의 기능을 한 군데에서 접근할 수 있는 시작점이라고 볼 수 있다. 

 

3) Cluster Manager

Spark Application 이 실행되는 클러스터에서 자원을 관리 및 할당. Stnadalone / YARN / Kubernetes /  Mesos 가 있다.

 

4) Spark Executor 

Worker Node 에서 동작하며 Driver Program과 통신하며 Worker에서 실제 Task 들을 실행하는 역할을 한다. 

1개의 Worker Node에 1개 이상의 Executor 프로세스를 실행시킬 수 있으나 일반적으로 노드당 1개의 Executor를 사용한다.

별 다른 옵션 설정 없이 일반적으로는 Executor의 Core 당 Task 1개 , 1개의 Task에서 1개의 Partition을 처리한다. 즉, Core 수 = Task 수 = Partition 수 가 된다.

 

 

 

2. 실행 순서 

① Spark Application 실행 : Driver Program이 실행되고 Spark Context 객체가 생성되며, 생성된 객체는 Cluster Manager와 연결된다.

Driver 가 Cluster manager 리소스 요청 : Executor 실행을 위한 리소스를 요청

③ Executor 자원 할당 : Cluster Manager는 Driver에서 요청한 Resource만큼의 Executor 자원을 할당하고 Executor를 실행시킨다.

④ Job 실행 : Driver는 요청받은 Job을 Task 단위로 분할하여 Executor로 전송

⑤ Job 수행 : Executor들은 Task를 수행하고, 수행된 결과 값을 Driver에 전송

⑥ Application 종료 : Spark context.stop()이 호출되면 Executor들은 중지되고 Cluster manager한테 사용한 Resource들을 반납함 = 일찍 Task가 끝난 Executor들도 stop()이 호출될 때 같이 해제됨.

 

 

 

3. Deploy Mode

크게 Spark-Local, Spark-Standalone, Yarn-Client, Yarn-Cluster로 나누어 볼 수 있다.

 

1) Spark - Local

한 개의 단일 서버 내에서 실행되는 모드이다. Spark Driver와 Executor는 동일한 단일 Client JVM 위에서 1개씩 실행되며 Cluster Manager 역시 동일한 서버가 해당 역할을 수행한다. 

 

2) Spark - Standalone

Driver는 Client 내 Node에서 랜덤 하게 실행되며, Executor는 Cluster 내 각 Node에서 자체적은 JVM을 실행시킨다. Cluster Manager 역할도 Cluster 내 Node 중에서 랜덤 하게 맡는다.

 

 

3) Yarn - Client

Driver는 Cluster 외부의 Client에서 동작하며, Executor는 Yarn의 Nodemanager 내의 Container에서 실행된다.

Cluster Manager는 곧 Resource Manager로, Yarn의 Application Master을 통해  Node manager에 Executor들을 위한 Container 들을 할당한다.

 

 

4) Yarn - Cluster

Driver는 Yarn의 Application Master에서 동작하며  Executor는 Yarn의 Nodemanager 내의 Container에서 실행된다.

Cluster Manager는 Resource Manager로, Yarn의 Application Master을 통해  Node manager에 Executor들을 위한 Container 들을 할당한다. Yarn Client 모드와 다른 점은 Driver가 실행되는 위치이다.

 

 

 

4. Partition

실제 데이터들은 Partitioning 되어 HDFS, S3에 물리적으로 분산되어 저장되어 있고, Spark에서는 이 Partition들을 논리적으로 추상화하여 Data Frame 객체로 다루게 된다. 이때 Executor 들은 Data Locality를 고려하여 가급적 가까운 Parition 들을 읽을 수 있도록 Task를 할당한다.

앞서 말했듯 별다른 옵션 없다 가정시, Executor의 Core 당 Task 1개 , 1개의 Task에서 1개의 Partition을 처리하므로 Core 수 = Task 수 = Partition 수이다. 이때 Partition 수에 따라 각 Partition의 크기가 결정되는데, Partition의 수 = Core 수 라면, Partition의 크기 = Memory 크기이다. 즉, Partition의 크기가 Core당 필요한 메모리의 크기를 나타낸다. Partition의 수 만큼 병렬 처리를 할 수 있으므로,  

Parition의 수가 적다면, 각 Partition의 크기는 클 것이고, Partition의 수가 많다면, 각 Partition의 크기는 작을 것이다. 즉 Partition 수가 많을수록 한 개의 Task 당 필요한 메모리를 줄일 수 있다. 효과적인 병렬 처리를 위해 Partition의 크기와 개수를 잘 설정해야 한다.

 

 

 

 

Reference
https://medium.com/@goyalsaurabh66/running-spark-jobs-on-yarn-809163fc57e2
Learning Spark (2nd) - 1. Introduction to Apache Spark: A Uni€ed Analytics Engine

 

반응형
Comments