[스터디] 스파크 완벽 가이드 15일차

Kristopher·2022년 2월 4일
0

Spark 스터디

목록 보기
15/16

Chapter 15 클러스터에서 스파크 실행하기

스파크 애플리케이션의 아키텍쳐

스파크 드라이버 : 스파크 애플리케이션의 실행을 제어하고 스파크 클러스터의 모든 상태 정보를 유지한다. 물리적 컴퓨팅 자원 확보와 익스큐터 실행을 위한 클러스터 매니저와 통신할 수 있어야 한다.
스파크 익스큐터 : 드라이버가 할당한 태스크를 받아 실행하기 태스크의 상태와 결과를 드라이버에 보고한다.
클러스터 매니저 : 스파크 애플리케이션을 실행할 클러스터 머신을 유지한다. (ex. 스탠드얼론 클러스터 매니저, 아파치 메소스, 하둡 YARN)

실행모드 - 클러스터 모드/클라이언트 모드/로컬 모드

클러스터 모드

클러스터 모드를 사용하기 위해서 JAR파일이나 파이썬/R 스크립트를 클러스터 매니저에 전달해야 한다. 클러스터 매니저는 파일을 받은 다음 워커 노드에 드라이버와 익스큐터에 전달해야 한다.

클라이언트 모드

애플리케이션을 제출한 클라이언트 머신에 스파크 드라이버가 위치한다는 것만 제외하면 클러스터 모드와 비슷하다. 클라이언트 머신은 스파크 드라이버 프로세스를 유지하며 클러스터 매니저는 익스큐터 프로세스를 유지한다. 이 때, 스파크 애플리케이션은 클러스터와 무관한 머신에서 동작하는데 이를 게이트웨이 머신 또는 에지 노드라고 부른다.

로컬 모드

로컬 모드의 경우 애플리케이션이 단일 머신에서 실행된다. 그렇기에 병렬처리를 위해 단일 머신의 스레드를 활용한다.

스파크 애플리케이션의 생애주기(스파크 외부)

클라이언트 요청

스파크 애플리케이션을 제출하고, 제출하는 시점에 로컬 머신에서 코드가 실행되어 클러스터 드라이버 노드에 요청한다. 이 과정에서 스파크 드라이버 프로세스의 자원을 함께 요청한다. 스파크 잡을 제출한 클라이언트 스로세스는 종료되고 애플리케이션은 클러스터에서 실행된다.

시작

다음으로 사용자 코드를 실행한다. 사용자 코드에는 스파크 클러스터를 초기화하는 SparkSession이 포함되어야 한다. 사용자는 spark-submit을 실행할 때 사용하는 명령행 인수로 익스큐터 수와 설정값을 지정할 수 있다.

실행

스파크 클러스터 생성 후 코드가 실행된다. 드라이버와 워커에서 코드가 실행되고 데이터가 이동하는 과정에서 서로 통신한다. 태스크를 할당받은 워커는 태스크의 상태와 성공/실패 여부를 드라이버에 전송한다.

완료

실행이 완료되면 드라이버 프로세스가 성공/실패 중 하나의 상태로 종료된다. 이후 클러스터 매니저는 드라이버가 속한 스파크 클러스터의 모든 익스큐터를 종료시킨다.

스파크 애플리케이션의 생애주기(스파크 내부)

SparkSession

스파크 애플리케이션은 가장 먼저 SparkSession을 생성한다. 애플리케이션의 경우 직접 생성해야 한다. SparkSession의 빌더 메서드를 사용해 생성하면 SparkContext 패턴을 사용하는 것보다 안전하게 생성할 수 있다.

논리적 명령

스파크 코드는 트랜스포메이션과 액션으로 구성된다. 사용자는 SQL, 저수준 RDD 처리, 머신러닝 알고리즘 등을 사용해 트랜스포메이션과 액션을 마음대로 지정할 수 있다. 그렇기에 선언적 명령을 사용하는 방법과 논리적 명령이 물리적 실행 계획으로 어떻게 변환되는지 이해하는 것이 중요하다.

스테이지

스파크의 스테이지는 다수의 머신에서 동일한 연산을 수행하는 태스크의 그룹을 나타낸다. 스파크는 가능한 많은 태스크를 동일한 스테이지로 묶으려고 노력한다.

태스크

스파크의 스테이지는 태스크로 구성된다. 각 태스크는 단일 익스큐터에서 실행할 데이터의 블록과 다수의 트랜스포메이션 조합으로 볼 수 있다. 태스크는 파티션에 적용되는 연산 단위이기에 파티션 수를 늘리면 더 높은 병렬성을 얻을 수 있다.

세부 실행 과정

스파크는 map 연산 후 다른 map 연산이 이어진다면 함께 실행할 수 있도록 스테이지와 태스크를 자동으로 연결한다. 또한 모든 셔플을 작업할 때 데이터를 안정적인 저장소에 저장하므로 여러 잡에서 재사용할 수 있다.

파이프라이닝

파이프라이닝 기법은 노드 간의 데이터 이동 없이 각 노드가 데이터를 직접 공급할 수 있는 연산만 모아 태스크의 단일 스테이지로 만든다. 그렇기에 파이프라인으로 구성된 연산 작업은 단계별로 메모리나 디스크에 중간 결과를 기록하는 방식보다 처리속도가 빠르다.

셔플 결과 저장

노드 간 복제를 유발하는 연산 실행시 파이프라이닝을 수행하지 못해 네트워크 셔플이 발생한다. 노드 간 복제를 유발하는 연산은 각 키에 대한 입력 데이터를 여러 노드로부터 복사하는데, 이는 데이터 전송이 필요한 소스 태스크를 먼저 수행하기 때문이다. 소스 태스크의 스테이지가 실행되는 동안 셔플 파일을 로컬 디스크에 기록한다. 이후 그룹화나 리듀스를 수행하는 스테이지가 실행되는데, 셔플 파일에서 레코드를 읽어 들인 다음 연산을 수행한다.

Reference

스파크 완벽 가이드
아파치 스파크

profile
개발자 지망생입니다.

0개의 댓글