Spark Components
- Driver Program
- main() 함수를 실행하고 SparkContext를 생성하는 프로세스
- Cluster Manager
- Worker Node
- Executor: 실제 태스크를 수행하는 Worker Node의 프로세스
- Cache: RDD를 Cache에 저장하여 이후 데이터 처리 속도를 향상 시킴
Spark Cluster Manager
- Standalone
- 기본으로 제공되는 Master Node (Supervise)
- HA를 위해 Zookeeper를 이용할 수 있음
- Hadoop YARN
- Cluster Manager로 Hadoop의 YARN을 이용함
- ‘--master yarn’ 옵션으로 job을 제출함
- ApplicationMaster가 할당하는 컨테이너 내에서 Executor가 실행됨
- Apache Mesos
- Cluster Manager로 Apache Mesos (Marathon)를 이용함
- Coarse-Grained 모드 (기본값): 1개의 Executor 당 다수의 Task를 처리함
- 애플리케이션 통계로부터 Executor 수의 동적 Resize 지원
- 기존 Fine-Grained 모드는 deprecated
- Kubernetes (experimental)
Spark RDD
- Motivation
- MapReduce(MR)가 대량 데이터 처리를 조금은 손쉽게 해줌
- 하지만 다음의 사항들에서 2% 부족함
- 단순 Map/Reduce 외 복잡하고 Multi-Stage Job이 힘듦 (머신러닝, 그래프 처리 등)
- Interactive, Ad-hoc 쿼리 등
- 따라서 효율적인 Data Sharing 도구가 필요함
- MR이 Iteration에서 느린 이유는 각 Iteration마다 스테이지 간 공유가 HDFS를 거치기 때문이므로 이러한 스테이지 간 공유를 RAM에서 해보자!
* 스테이지: 각 처리 단계를 나누는 논리적 단위
- Problem
- Fault-tolerant : RAM에서 처리하는 것은 좋으나 Fault를 어떻게 해결하느냐가 문제
- Solution
- GFS(HDFS)는 왜 그런 혁신을 일으켰는가?
- Modify가 안되는 시스템
- 무조건 쓰고 달리는 시스템
- 단순하지만 Modify가 안되기 때문에 많은 것을 단순화 시킴
- 그럼 RAM에서도 Read-only로 구성해볼까?
- Resilient Distributed Datasets (RDD) 탄생
- Immutable(불변성의, Read-only), Partitioned collections of records
- Data -> RDD or RDD -> RDD 만 가능
- 좋은 점
- Immutable로 GFS처럼 Read-only만 가능한 단순한 구조 완성
- 부모(가장 초기 RDD)로부터 계보(Lineage)만 기록해 놓아도 Fault-tolerant 보장
- Coding
- 코딩 과정으로 직접 계산이 이뤄지는 것이 아니라 Lineage를 쌓아감
- 이를 통해 Directed acyclic graph (DAG)를 디자인함
- 다양한 Transformations 구성 끝에 Action에서 실제 Lineage에 따른 명령들이 수행됨
- Lazy-execution
- Action이 수행되기 전까지 아무런 명령을 수행하지 않음
- Lineage를 모두 작성한 후에 실행되기 때문에 Execution Plan 작성이 용이함
- 따라서 자원이 배치된, 배치될 상황을 미리 고려해서 최적의 환경으로 Job을 수행할 수 있음
- Transformation과 Action은 스파크 버전에 따라 업데이트되는 사항 확인 필요
- Dependency
- Narrow Dependency
- 하나의 노드 내에서 모두 처리할 수 있는 작업
- 네트워크를 통하지 않음
- Fault 처리 역시 해당 노드 내에서 복구 가능
- Wide Dependency
- 다중 노드에 걸쳐야 작업을 처리 가능
- 예를 들면 Shuffle이 일어나야 하는 작업
- 네트워크를 통하며, Fault 복구 비용이 비쌈
- 중요한 작업의 경우 Checkpoint도 고려 필요
Spark Stage
- Stage는 네트워크 자원이 소요되는 작업 간의 구역을 나누는 단위
- Stage 내에서 최적으로 작업이 수행될 수 있도록 DAG를 최적화함
- 일반적으로 Map, Reduce 사이에 발생하는 Shuffle 과정이 해당됨
Spark Storage Level
- 일반적으로 MEMORY_ONLY를 사용하며, Serialization을 위해서는 _SER가 붙은 Level을 이용하고, Replication을 위해서는 _2가 붙은 Level을 이용함
Level |
Space Used |
CPU Time |
In memory |
On disk |
Nodes with data |
MEMORY_ONLY |
High |
Low |
Y |
N |
1 |
MEMORY_ONLY_2 |
High |
Low |
Y |
N |
2 |
MEMORY_ONLY_SER |
Low |
High |
Y |
N |
1 |
MEMORY_ONLY_SER_2 |
Low |
High |
Y |
N |
2 |
MEMORY_AND_DISK |
High |
Medium |
Some |
Some |
1 |
MEMORY_AND_DISK_2 |
High |
Medium |
Some |
Some |
2 |
MEMORY_AND_DISK_SER |
Low |
High |
Some |
Some |
1 |
MEMORY_AND_DISK_SER_2 |
Low |
High |
Some |
Some |
2 |
DISK_ONLY |
Low |
High |
N |
Y |
1 |
DISK_ONLY_2 |
Low |
High |
N |
Y |
2 |
* MEMORY_AND_DISK: 메모리 공간에 더이상 저장할 수 없는 경우 디스크에 저장
'Development > Spark' 카테고리의 다른 글
간단하게 Spark ML Model 로딩하기 (Decision Tree) (0) | 2019.08.11 |
---|---|
Spark Streaming vs Structured Streaming 비교 체험(?) (0) | 2019.05.12 |
Spark 공부 - Spark Streaming (0) | 2019.01.24 |