우노
[Spark] Spark 구조 및 실행 흐름 본문
Spark 구조
- 분산모드에서 Spark Application는 실제 일을 수행하는 역할을 담당하며
- 1개의 중앙 조정자(Driver)와 N개의 분산 작업 노드(Executor)로 구성된 마스터/슬레이브 구조입니다.
- Cluster에서 실행 된다면, 하나의 Spark application은 Cluster Manager라고 불리는 외부 서비스를 사용해 여러 개의 머신에서 실행 됩니다.
- Cluster Manager에는 standalone(단독 클러스터 매니저), YARN, Mesos 등이 있습니다.
Spark 구성 요소
Spark Application
- Spark에서 수행되는 사용자 프로그램으로
- 1개의 Driver Program과 N개의 Executor로 구성
Driver Program
프로그램의 Main() 함수가 실행되는 프로세스
주요 역할
1) 사용자 프로그램을 실제 수행 단위인 Task로 변환 해 Executor에 할당
- 1-1) 연산들의 관계에 대해 논리적인 방향성 비순환 그래프(DAG, Directed Acyclic Graph)를 생성한다.
- 입력으로부터 RDD를 만들고
- 트랜스포메이션을 사용하여 새로운 RDD를 받아오며
- 데이터를 가져오거나 저장하기 위해 액션을 사용한다.
- 1-2) Driver가 실행될 때, Driver는 논리 그래프(DAG)를 물리적인 실행 계획(Physical Plan)으로 변환한다.
- Driver는 Map/Tranformation을 사용한 여러 최적화를 통해, 물리적인 실행 계획을 여러 단계(Stage)로 바꾼다.
- 각 Stage는 순서에 따라 여러 개의 Task로 구성된다.
- 1-3) 단위 작업들은 묶여서 Cluster로 전송된다.
- Task의 묶음은 Stage이며 Stage의 묶음은 Job이다.
- 1-1) 연산들의 관계에 대해 논리적인 방향성 비순환 그래프(DAG, Directed Acyclic Graph)를 생성한다.
2) Executor에 할당 된 Task들을 적절하게 Scheduling
- 2-1) Executor들은 시작 시 드라이버에 등록됨
- 2-2) Driver는 항상 실행중인 익스큐터를 감시
- 각 Task가 데이터 위치에 기반해 적절한 위치에서 실행이 되도록 한다.
SparkContext
- Driver Program에서 Job을 Executor에 실행하기 위한 Endpoint이다.
- Cluster Manager와 연결된다.
Executor
- Application에서 Driver Program이 요청한 Task들의 연산을 실제로 수행하는 프로세스
- Executor는 Spark application 실행 시 최초 한번 실행된다.
- 대개 애플리케이션이 끝날 때까지 계속 동작하지만, 익스큐터가 오류로 죽더라도 스파크 애플리케이션은 계속 실행된다.
- Executor는 두가지 역할을 한다.
- 첫 번째로, Application을 구성하는 작업들을 실행하여 Driver Program에 그 결과를 되돌려 준다.
- 두 번째로, 각 Executor 안에 존재하는 Block Manager라는 서비스를 통해 사용자 프로그램에서 cache 하는 RDD를 저장하기 위한 메모리 저장소를 제공한다.
- RDD가 Executor 내부에 직접 캐시되므로 단위 작업들 또한 같이 실행되기에 용이하다.
Cluster Manager
- Cluster Manager는 여러 대의 서버로 구성된 클러스터 환경에서, 다수의 Application이 함께 구동될 수 있도록
- Application(Driver와 Executor) 사이의 자원을 관리해주는 역할을 담당합니다.
- 스파크와 붙이거나 뗄 수 있는(pluggable) 컴포넌트이며
- Spark가 YANR, mesos, Standalone 등 다양한 외부 매니저들 위에서도 돌아갈 수 있게 합니다.
Deploy mode : Cluster 사용 시 Driver Program의 실행 위치 지정
Client mode : Driver가 Cluster 외부에 위치할 때
- Driver는 spark-submit의 일부로 실행됨
- Driver Program 출력을 직접 확인 가능
- 애플리케이션 실행하는 동안 작업 노드 들에 계속 연결되어 있어야함
Cluster mode : Driver가 Cluster 내부에 위치할 때
- Driver가 Cluster내의 작업 노드(Worker) 중 하나에서 실행됨
- 실행 후 개입하지 않는 방식
Master Node
- Worker를 관리하는 노드
Worker node
- Cluster에서 Application 코드를 실행할 수 있는 모든 노드
Task
- 하나의 Executor에서 수행되는 최소 작업 단위
Stage
- Task의 집합
Job
- Stage의 집합
- Application에서 Spark에 요청하는 일련의 작업
Cluster에서 Spark Application 실행 흐름
- 1) 사용자는 spark-submit을 사용하여 애플리케이션을 제출한다.
- 2) spark-submit은 드라이버 프로그램을 실행하고 사용자가 정의한 main() 메소드를 호출한다.
- SparkContext도 생성 되어 Cluster Manager와 연결 됨
- 3) Driver Program은 Cluster Manager에게 Executor 실행을 위한 리소스를 요청한다.
- 4) Cluster Manager는 Driver에게 요청 받은 리소스 만큼 Executor 자원을 할당한 후 실행한다.
- Executor 실행은 Cluster Manager, Task 할당은 Driver
- 5) Driver를 통해 사용자 애플리케이션이 실행된다.
- DAG Schedling을 통해 드라이버는 작업을 Task 단위로 분할하여 Executor에게 보낸다.
- 6) Executor들은 단위 작업(Task)들을 계산해 Driver Program에게 다시 보낸다.
- 7) 드라이버의 main()이 끝나거나 SparkContext.stop()이 호출된다면 익스큐터들은 중지되고 클러스터 매니저에 사용했던 자원을 반환한다.
'Data > Spark' 카테고리의 다른 글
[Spark] spark.executor.heartbeatInterval 오류 (0) | 2020.07.27 |
---|---|
[Spark] Java, Spark, Scala 버전 변경하기 (0) | 2020.07.16 |
[Spark] yarn 구조 및 실행 순서 (0) | 2020.07.14 |
[Spark] sbt를 사용한 간단한 Jar 파일 빌드 (0) | 2020.07.14 |
[Spark] Broadcast 란? (0) | 2020.07.13 |
Comments