Spark 구조
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스크립트에 리소스 설정)