아파치 스파크의 분산 실행
스파크는 분산 데이터 처리 엔진
스파크의 설계 철학은 다음과 같다.
•
속도
◦
CPU와 메모리 성능의 향상에 따른 내부 구현 발전
▪
효과적인 멀티 스레딩과 병렬 처리를 지원하는 유닉스 기반 OS가 포함
◦
질의 연산 방향을 DAG 형식으로 수행
▪
DAG의 스케쥴러와 최적화 모듈은 효율적인 연산 그래프를 만들어서 각각의 태스크로 분해하여 클러스터의 워커 노드 위에서 병렬 수행될 수 있도록 함
◦
물리적 실행 엔진
▪
텅스텐 은 전체적 코드 생성이라는 기법을 써서 실행을 위한 간결한 코드를 생성
▪
스파크 2.x와 3.0에서의 성능 향상은 SQL을 위한 카탈리스트 Catalyst 옵티마이저 최적화 컴포넌트와 콤팩트한 코드 생성을 해 주는 텅스텐의 효과
◦
인메모리 처리
▪
모든 중간 결과는 메모리에 유지, 디스크 IO을 제한적 사용 ⇒ 속도 상승
•
사용 편리성
◦
RDD라 불리는 유연한 분산 데이터 세트라는 단순, 핵심적 논리 자료구조 구축 → 단순성 실현
◦
연산의 종류 : Transformation, Action
•
모듈성
◦
다양한 프로그래밍 언어 지원
◦
Spark SQL, Spark 정형화 스트리밍, 스파크 MLlib, GraphX 들을 하나의 엔진 안에서 연동된 상태로 사용 가능
•
확장성
◦
빠른 병렬 연산 엔진에 초점
◦
하둡과의 차이점 (하둡은 저장과 연산을 모두 포함)
◦
수많은 데이터 소스들에게서 데이터를 읽어 메모리에서 처리 가능(논리적 데이터 추상화 레벨에서 처리 가능 및 확장 가능)
컴포넌트들이 머신들 위에서 협업해 동작한다는 사실을 알고 있어야 한다.
하나의 스파크 애플리케이션은 스파크 클러스터의 병렬 작업들을 조율하는 하나의 드라이버 프로그램으로 이루어진다.
드라이버는 SparkSession 객체를 통해 클러스터의 분산 컴포넌트들에 접근한다
•
Spark Executor, Cluster manager
Spark Driver
SparkSession 객체를 초기화하는 책임을 가진 스파크 애플리케이션의 일부로써 스파크 드라이버는 여러가지 역활을 함
•
클러스터 매니저와의 통신
•
스파크 이그제큐터들을 위해 필요한 자원을 요청
•
모든 스파크 작업을 DAG 연산 형태로 변환, 스케쥴링
•
각 실행 단위를 태스크로 나누어 스파크 이그제큐터들에게 분배
•
자원 할당 → 드라이버는 이그제큐터와 직접 통신
SparkSession
스파크 2.0에 이르러 SparkSession은 모든 스파크 연산과 데이터에 대한 통합 연결 채널 역활을 하게 됨
•
Spark Context, SQL Context, Hive Context, SparkConf, StreamingContext 등을 합쳐놓음
•
일원화된 연결 채널을 통해 JVM 실행 파라미터들을 생성, 이후 데이터 프레임이나 데이터 세트를 정의, 데이터 소스에서 데이터를 읽고, 메타 데이터에 접근하고 스파크 SQL을 질의를 실행 가능
클러스터 매니저
스파크 애플리케이션이 실행되는 클러스터에서 자원을 관리 및 할당하는 책임
4종류의 클러스터 매니저 지원
•
Standalone cluster manager, Apache Hadoop YARN, Apache Mesos, Kubernetes
스파크 이그제큐터
클러스터의 각 워커 노드에서 동작
드라이버 프로그램과 통신, 태스크를 실행하는 역활
노드당 하나의 이그제큐터만이 실행
배포 모드
스파크가 여러 다른 환경에서 다른 설정으로 돌아갈 수 있도록 다양한 배포 모드를 지원
클러스터 매니저는 어디서 실행되는지에 대한 자세한 정보 없이도(스파크의 이그제큐터를 관리 가능하고 자원 요청이 잘 수행되는 환경이라면) 돌아갈 수 있도록 추상화
⇒ 스파크는 아파치 하둡 얀이나 쿠버네티스 같은 대부분의 인기 있는 환경에 배포 가능하며 서로 다른 모드들에서 동작
•
스파크 3.0에서는 단독 얀 쿠버네티스 배포 모드에서 GPU 자원 수집을
지원하는 기능을 소개했다. 이는 딥러닝 기술을 요구하는 업무를 담당하는 개발자들도 스파크를 사용할 수 있다는 의미다
분산 데이터와 파티션
실제 물리적인 데이터는 HDFS나 클라우드 저장소에 존재하는 파티션이 되어 저장소 전체에 분산된다.
스파크는 각 파티션을 고수준에서 논리적인 데이터 추상화, 즉 메모리의 데이터 프레임 객체로 바라본다.
스파크 이그제큐터는 가급적이면 데이터 지역성을 고려하여 네트워크에서 가장 가까운 파티션을 읽어 들이도록 태스크를 할당