Spark

Spark 구조

개발 일기92 2024. 5. 14. 14:35

1. Spark application - 실제 작업을 수행하는 역할

  • Dirver - 한 개의 노드에서 실행, 스파크 전체의 main 함수 실행, 어플리케이션 정보의 유지 관리, 익스큐터의 실행 및 실행 분석,배포. 사용자 프로그램(JOB)을 task 단위로 Executor로 전달.
  • Executer - 다수의 worker 노드에서 실행되는 프로세스, Driver가 할당한 task를 수행한다. 블록 매니저를 통해 cahe하는 RDD저장.

1개의 Spark application에는 1개의 Driver와 N개의 Executor가 존재한다.

Executor는 Cluster Manager에 의하여 해당 어플리케이션에 할당된다.

** 서로 다른 스파크 어플리케이션 간의 직접적인 데이터 공유 불가 (별도의 JVM프로세스에서 동작하므로)

 

2. Cluster Manager - 스파크 어플리케이션 사이에 자원을 중계하는 역할

컴포넌트라 붙이거나 제외 할 수 있는데, Spark StandAlonem, Yarn, Mesos, Kubernetes등을 클러스터 매니저로 사용할 수 있다. (이전 프로젝트에서 Yarn으로 관리하였다. yarn application -list/-kill 등의 명령어로 작업 관리)

스파크가 익스큐터에 task를 할당하고 관리하기 위하여 필요.

스파크는 클러스터 매니저의 상세 동작을 알지 못한다.

스파크 <-> 클러스터 매니저간의 통신을 하며 할당 가능한 Executor를 전달받는다.

 

Spark Application Flow

 

1. Spark-submit을 통해 application 제출

2. Dirver가 application의 main함수 실행.-> SparkContext생성

3. SparkContext가 Cluster Manager와 연결.

4. Dirver가 Cluster Manager로 부터 Executor 실행을 위한 리소스 요청

5. Spark Context는 작업 내용을 task 단위로 분할하여 Excutor에 전달.

6. 각 Executor는 작업 수행 후 결과 저장.

(이전 프로젝트에선 Scala로 소스 작성 후 sbt를 사용해 jar로 빌드.

jar파일을 실행할 sh스크립트 안에 spark-submit을 사용.

sh스크립트에 리소스 설정)