Spark 드라이버
스파크 응용 프로그램의 수명은 스파크 드라이버로 시작하고 끝난다. 드라이버는 클라이언트가 스파크에서 응용 프로그램을 제출하는 데 사용하는 프로세스다. 드라이버는 스파크 프로그램의 실행을 계획 및 조정하고, 상태 및 결과(데이터)를 클라이언트에게 반환한다. 또한, 클러스터에 있는 클라이언트나 노드에 물리적으로 상주할 수 있다.
1. SparkSession
스파크 드라이버는 스파크세션을 생성한다. 스파크세션 객체는 스파크 클러스터에 대한 연결을 나타낸다. 스파크세션은 대화식 셸을 포함해 스파크 응용 프로그램의 시작 부분에서 인스턴스화되며, 프로그램 전체에 사용된다.
스파크 2.0 이전에는 스파크 핵심 응용 프로그램에 사용된 스파크콘텍스트(SparkContext), 스파크 SQL 응용 프로그램과 함께 사용된 SQL 콘텍스트(SQLContext)와 하이브콘텍스트(HiveContext), 스파크 스트리밍 응용 프로그램에 사용된 스트리밍콘텍스트(StreamingContext)가 스파크 응용 프로그램의 엔트리 포인트에 포함돼 있었다. 스파크 2.0의 스파크 세션 객체는 이러한 모든 객체를 단일 엔트리 포인트로 결합해 모든 스파크 응용 프로그램에 사용할 수 있다.
스파크세션 객체는 스파크콘텍스트 및 스파크콘트 자식 객체를 통해, 마스터, 응용 프로그램 이름, 실행자의 수 등 사용자가 설정한 모든 런타임 구성 속성을 포함한다.
SparkSession
스파크세션 인스턴스의 객체 이름은 임의로 정해진다. 기본적으로 스파크 대화형 셸에서 스파크세션 인스턴스는 spark라는 이름을 가지는데, 일관성을 유지하기 위해 스파크세션은 항상 spark를 인스턴스화 한다. 그러나 이름은 개발자가 원하는 대로 얼마든지 바꿀 수 있다.
- SparkSession 불러오기
from pyspark.sql import SparkSession
- SparkSession 초기화
spark = SparkSession\
.builder\
.master('spark://sparkmaster:7077')\
.appName('Python Spark SQL basic example')\
.config('spark.submit.deployMode', 'client')\
.getOrCreate()
- 사용
myRange = spark.range(1000).toDF('number')
2. 응용 프로그램 계획
드라이버의 주요 기능 중 하나는 응용 프로그램을 계획하는 것이다. 드라이버는 응용 프로그램 프로세싱 입력에 따라 프로그램을 어떻게 실행할지 계획한다. 요청된 모든 변환(Transformation) 및 액션(Action)에 따라 노드의 지시된 비순환 그래프(DAG: Directed Acyclic Graph)
지시된 비순환 그래프
지시된 비순환 그래프는 데이터 흐름과 그 종속성을 나타내기 위해 컴퓨터 과학에서 일반적으로 사용되는 수학적 구조다. DAG는 정점(vertice), 노드 및 에지(edge)로 구성된다. 데이터 흐름 콘텍스트의 정점은 프로세스 흐름의 단계다. DAG의 에지는 정점을 서로 연결하는데, 순환 참조를 가질 수 없는 방식으로 연결한다.
스파크 응용 프로그램 DAG는 작업과 단계로 구선된다. 작업은 스파크 프로그램에서 스케줄링이 가능한 일의 최소 단위이고, 단계는 함께 실행할 수 있는 일련의 작업 모음이다. 단계는 서로 의존하는, 단계 종속성이 있다.
프로세스 스케줄링에서 DAG는 스파크에만 고유하게 있는 것은 아니다. 테즈, 드릴, 프레스토와 같은 다른 빅데이터 에코시스템 프로젝트에서도 스케줄링을 위해 사용된다. DAG는 스파크의 기본 요소이므로 개념을 잘 이해해야 한다.
3. 응용 프로그램 조직화(Orchestration)
드라이버는 DAG에 정의된 단계 및 작업의 실행을 설계한다. 스케줄링 및 작업 실행과 관련된 드라이버의 주요 활동은 다음과 같다.
- 작업 실행에 사용할 수 있는 리소스 추적
- 가능한 데이터에 ‘close’를 실행하는 작업 스케줄링(데이터 지역성의 개념)
4. 기타 함수
드라이버는 스파크 프로그램의 실행을 계획하고 조정하는 것 외에도 응용 프로그램의 결과를 반환하는 책임이 딨다. 데이터를 클라이언트에 반환하도록 요청되는 액션의 경우(ex. 대화식 질의), 반환값은 리턴 코드 또는 데이터가 될 수 있다.
드라이버는 포트 4040에 응용 프로그램 UI도 제공한다. 이 UI 는 자동으로 생성되는데, 제출된 코드나 제출 방법(pyspark를 사용하는 대화식 또는 spark-submit을 사용한은 비대화식)과는 독립적이다.
후속 응용 프로그램이 동일한 호스트에서 실행되면, 응용 프로그램 UI에 연속적인 포트가 사용된다.(ex. 4041, 4042 …)
5. 스파크 작업자 및 실행자
스파크 실행자(Executor)는 스파크 DAG 작업이 실행되는 프로세스다. 실행자는 스파크 클러스터에 슬레이브 노드 또는 작업자의 CPU 및 메모리 리소스를 예약한다. 이는 특정 스파크 응용 프로그램 전용이며, 응용 프로그램이 완료되면 종료된다. 스파크 프로그램은 보통 많은 실행자로 구성되며, 종종 병렬로 작업한다.
일반적으로 실행자 프로세스를 호스팅하는 작업자(Worekers) 노드에는 유한하거나 고정된 수의 실행자가 특정 시점에 할당된다. 따라서 노드의 수를 알고 있는 클러스터에는 주어진 시간에 실행할 수 있는 실행자의 수가 한정된다. 응용 프로그램이 클러스터의 실제 용량을 초과해 실행자를 요구하면, 다른 실행자가 리소소를 완료하고 릴리스하는 것으로 시작되도록 예약한다.
스파크 실행자를 호스트하는, 실행자용 JVM 에는 객체를 저장하고 관리하는 전용 메모리 공간인 힙이 할당된다.
실행자의 JVM 힙에 커밋된 메모리 양은 sprak.executor.memory 속송 또는 pyspark, spark-shell 이나 spark-submit 명령에 대한 –executor-memory 인수로 설정된다.
실행자는 작업의 출력 데이터를 메모리 도는 디스크에 저장한다. 작업자와 실행자는 할당된 작업만 인식하지만, 드라이버는 응용 프로그램을 구성하는 전체 작업 집합과 관련된 종속성을 파악해야 한다.
6. 스파크 마스터와 클러스터 매니저
스파크 드라이버는 스파크 응용 프로그램을 실행하는 데 필요한 일련의 작업을 계획하고 조정한다. 작업은 작업자 노드에 호스트되는 실행자에서 실행된다.
마스터 및 클러스터 매니저는 실행자가 실행되는 분산 클러스터 리소스(YARN 이나 메소스의 경우, 컨테이너)를 모니터링하고 예약하고 할당하는 중앙 프로세스다. 마스터와 클러스터 매니저는 독립된 프로세스로 서로 분리될 수도 있고, 독립실행형 모드에서 스파크를 실행할 대처럼 하나의 프로세스로 결합될 수도 있다.
- 스파크 마스터
스파크 마스터는 클러스터의 리소소를 요청하고 이를 스파크 드라이버에서 사용할 수 있게 만드는 프로세스다. 모든 배포 모드에서, 마스터는 작업자 노드 또는 슬레이브 노드에 리소스나 컨테이너를 할당하고, 그 상태를 추적하고 진행 상황을 모니터링한다.
스파크를 독립실행형 모드로 실행하면, 스파크 마스터 프로세스는 마스터 호스트의 포트 8080에서 웹 UI를 제공한다.
스파크 마스터 vs 스파크 드라이버 드라이버와 마스터의 런타임 함수를 구별하는 것은 매우 중요하다. 마스터(Master)라는 명칭은 프로세스가 응용 프로그램의 실행을 통제한다는 의미로 추론할 수 있지만, 실제로는 그렇지 않다. 마스터는 단순히 리소스를 요청해서 드라이버가 사용할 수 있게 한다. 마스터는 이렇게 리소스의 위치와 상태는 모니터링하지만, 응용 프로그램의 실행 및 해당 작업과 단계의 조정에는 관여하지 않는다. 그것은 드라이버의 역할이다.
- 클러스터 매니저
크러스터 매니저는 작업자 노드를 모니터링하고, 마스터가 요청하면 이러한 노드의 리소스를 예약하는 프로세스다. 마스터는 이렇게 클러스터가 예약한 리소소를 실행자의 형태로 드라이버에 제공한다.
메소스나 YARN에서 스파크를 실행할 때, 클러스터 매니저는 마스터 프로세스와 분리된다. 독립실행형 모드로 실행되는 스파크의 경우, 마스터 프로세스는 클러스터 매니저의 함수도 수행하고, 클러스터 매니저 역할도 한다.
클러스터 매니전의 함수는 하둡 클러스터에서 실행되는 스파크 응용 프로그램용 YARN 리소스 매니저 프로세스로 적합하다. 리소스 매니저는 YARN 노드 매니저에서 실행되는 컨테이너의 상태를 예약, 할당 및 모니터링한다. 스파크 응용 프로그램은 cluster 모드에서 실행 중인 응용 프로그램의 마스터 프로세스처럼 이 컨테이너를 사용해 실행자 프로세스를 호스트한다.