Spark Runtime Architecture
Spark Cluster 환경에 대해서 알아보기 전에 Spark 분산환경 Architecture 에 대해서 먼저 알아보자.
분산모드에서 Spark 는 중앙관리자와 수많은 Worker 들을 가지는 master/slave 구조를 이용한다. 중앙관리자를 driver 라고 하고 Worker 들을 executor 라고 한다.
Spark Application 은 Cluster Manager 를 통해 여러 대의 장비에서 수행이 된다. Spark 는 Standalone Cluster Manager 라는 내부 Cluster Manager 를 갖고 있다. 또한 Hadoop YARN 이나 Apache Mesos 와도 연동이 된다.
Driver
Driver 란 사용자 프로그램을 실행시키는 main() 함수를 갖고 있는 프로세스다. SparkContext 를 생성하고, RDD 를 생성하고, Transformation과 Action 을 수행하게 된다. spark-shell 을 사용할 때, Driver Program 이 생성된다.(이전 장에서도 설명했듯이 sc 라고 불리는 SparkContext 가 사전에 생성된다.)
Driver 가 실행될 때 아래 두가지가 수행된다.
- 사용자 프로그램을 Task 로 변환
Spark Driver 는 사용자 프로그램을 Task 라고 불리는 실제 수행 단위로 변환시킨다. 고차원적으로 보면, Spark 프로그램은 동일한 구조를 가진다.
: Input 으로부터 RDD 를 생성하고, 새로운 RDD 로 파생되며, Transformation 이나 Action Operation 을 수행하여, 데이터를 수집 또는 저장한다.
즉, Spark 프로그램은 논리적인 DAG(Directed Acyclic Graph) 를 생성하는데, Driver 가 실행될 때 이를 실제 실행 계획으로 변환된다.
이 실행계획은 Stage 셋으로 구성되는데, 다시 Stage 는 여러 개의 Task로 구성되며, Task 는 Spark 에서 수행되는 가장 작은 단위이다. - Task 를 Executor 에 할당
실제 실행계획을 바탕으로 Spark Driver 는 각 Task 글에게 Executor 를 할당해야 한다. 각 Executor 는 Task 들을 수행하고 RDD 를 저장하게 된다.
Spark Driver 는 Executor 의 상태를 확인하고 Data 위치를 기반으로 Task 들을 배치한다. Task 들이 실행될 때 cache 된 데이터를 저장하는데 문제가 발생할 수도 있다. 또한 Driver 는 cache된 데이터의 위치를 추적하고 추후 실행될 Task 들을 배치하는데 사용한다.
이런 Driver 정보는 Spark 에서 제공되는 web interface 에서 확인할 수 있다.(http://masterIp:4040)
Executors
Executor 는 Spark Job의 Task 들을 수행하는 역할을 한다. Executor 는 Spark Application 이 실행될 때 한 번 수행이 시작되며, Application lifetime 과 동일하게 수행된다. Executor 에서 오류가 나더라도 Spark Application 은 계속 실행된다.(대체 Executor 를 할당받음)
Executor 는 두 가지 역할을 한다.
- Task 실행 & 결과를 Driver 로 전송
- 메모리에 저장된 RDD 제공
Block Manager 라고 불리는 Service 를 통해서 제공되는데, 이는 RDD가 Executor 내부에서 cache 되기 때문이다.
Cluster Manager
driver 와 executor 가 어떻게 최초 실행이 될까? Spark 는 Cluster Manager 를 통해서 executor 와 driver(특정 상황에서) 를 실행한다. 이런 Cluster Manager 는 다른 컴포넌트로 교체가 가능한데, YARN 이나 Mesos 같은 외부 Cluster Manager 에서나 내부 standalone cluster manager 로 실행이 가능하다.
Launch a Program
어떤 Cluster Manager 를 사용하든 spark-submit 을 통해서 Spark Application 을 실행할 수 있다. 옵션들을 통해 다른 Cluster Manager 에 연결할 수 있으며, 많은 자원들을 할당 받을 수도 있다. 특정 Cluster Manager 에서는 Driver 도 Cluster 내에서 실행되게 할 수 있다.
spark-submit 을 통해 Application 배포하기(실행하기)
bin/spark-submit my_script.py
bin/spark-submit —master spark://host:7077 —executor-memory 10g my_scritp.py
Master URL | Meaning |
---|---|
local
|
하나의 Worker 에서 수행(locally), 병렬수행 없음
|
local[K]
|
여러 개의 Worker 에서 수행(locally)
|
local[*]
|
해당 장비에서 사용가능한 Worker 에서 수행
|
spark://HOST:PORT
|
Standalone Clsuter Manager 에서 수행, PORT 기본값은 7077
|
mesos://HOST:PORT
|
Cluster Manager 로 Apache Mesos 사용
|
yarn-client
|
Client 모드로 YARN 사용, Cluster 위치는 HADOOP_CONF_DIR 이나 YARN_CONF_DIR 에 설정
|
yarn-cluster
|
Cluster 모드로 YARN 사용, Cluster 위치는 HADOOP_CONF_DIR 이나 YARN_CONF_DIR 에 설정
|
* yarn-cluster 모드는 Driver 가 Cluster 내에서 실행되는 모드이다.
실행은 아래와 같은 포멧으로 할 수 있다.
./bin/spark-submit \
--class <main-class>
--master <master-url> \
--deploy-mode <deploy-mode> \
--conf <key>=<value> \
... # other options
<application-jar> \
[application-arguments]
* 성능에 영향을 주는 옵션 중 두 가지만 언급하고자 한다.
- —executor-memory
- —driver-memory
성능 최적화를 위해서는 두 옵션을 적정한 수준의 용량을 설정해야 한다. 여기에 도움이 될 만한 내용은 아래 블로그를 참고하길 바란다.(YARN 환경에 대해 설명)
Spark Application Code 를 어떻게 패키징하고 Dependency 관리를 하는지에 대해서는 책 124 ~ 129 페이지를 참고하면 되고, Cluster Manager 별 실행방법에 대해서는 책 129 ~ 138 페이지를 참고하길 바란다.(Amazon EC2 가이드도 포함하고 있다.)
어떤 Cluster Manager 를 사용해야 할까?
- 만약 새로운 Application 을 시작한다면 Standalone Cluster 를 사용하라.
Standalone Cluster 는 사용하기 가장 쉬운 방법이며, Spark 만 사용한다면, 다른 Cluster Manager 와 동일한 기능을 거의 모두 제공한다. - 만약 다른 Application 과 함께 실행되거나, 자원할당을 좀 더 풍부하게 하고 싶다면 YARN 이나 Mesos 를 사용하라.
YARN 은 Hadoop 이 설치되어 있다면, 기본적으로 설치가 되어 있다.(설정만 하면 됨) - YARN 이나 Standalone 에 비해 Mesos 의 장점은 fine-grained sharing 옵션이다.
이는 Spark-shell 같은 대화형 Application 에서도 CPU 할당 같은 것을 지원한다. 여러 사용자들이 대화형 shell(spark-shell) 을 사용할 때 유용하다. - 저장소에 빠르게 접근하기 위해서 HDFS 와 같은 장비에서 Spark 를 수행하라.
Mesos 를 HDFS 가 설치된 장비에 설치하거나, HDFS 가 설정되어 있으면 YARN 은 이미 설치가 되어 있다.
앞으로는 Cluster Manager 는 YARN 환경에서 설명하기로 한다.
예제가 YARN 환경에서 수행하는 것이 많다. 또한 Mesos 의 경우도 실행은 다르지 않다. 다만 Amazon EC2 의 경우는 별도 설정 및 실행방법을 갖고 있으니 별도로 학습해야 한다.
'BigData > Spark' 카테고리의 다른 글
Learning Spark Chapter. 9 Spark SQL (0) | 2015.07.31 |
---|---|
Learning Spark Chapter. 8 Tuning & Debugging (0) | 2015.07.23 |
Learning Spark Chapter. 6 Spark 프로그래밍 고급편 (0) | 2015.07.23 |
Spark on YARN : Where have all the memory gone? (0) | 2015.07.18 |
RDD persist() or cache() 시 주의사항 (0) | 2015.07.17 |