자습서 : Spark 애플리케이션 아키텍처 및 클러스터

전체 책 받기
Python을 사용한 Spark 데이터 분석 (Addison-Wesley 데이터 및 분석 시리즈) MSRP $ 44.99보기

이 기사는 Jeffrey Aven의 Pearson Addison-Wesley 저서 "Data Analytics with Spark Using Python"에서 발췌 한 것입니다. Pearson © 2018의 허가를 받아 여기에 재 인쇄되었습니다. 자세한 내용은 informit.com/aven/infoworld를 방문하십시오.

Apache Spark 프로그래머로서의 여정을 시작하기 전에 Spark 애플리케이션 아키텍처와 Spark 클러스터에서 애플리케이션이 실행되는 방식을 확실히 이해하고 있어야합니다. 이 기사에서는 Spark 애플리케이션의 구성 요소를 면밀히 검토하고 이러한 구성 요소가 함께 작동하는 방식을 살펴보고 Spark 애플리케이션이 독립 실행 형 및 YARN 클러스터에서 실행되는 방식을 살펴 봅니다.

Spark 애플리케이션 분석

Spark 애플리케이션에는 여러 구성 요소가 포함되어 있으며, 단일 시스템에서 Spark를 실행하든 수백 또는 수천 개의 노드 클러스터에서 실행하든 모두 존재합니다.

각 구성 요소에는 Spark 프로그램을 실행하는 데 특정 역할이 있습니다. 클라이언트 구성 요소와 같은 이러한 역할 중 일부는 실행 중에 수동적입니다. 계산 기능을 실행하는 구성 요소를 포함하여 프로그램 실행시 다른 역할이 활성화됩니다.

Spark 애플리케이션의 구성 요소는 다음과 같습니다.

  • 운전사
  • 주인
  • 클러스터 관리자
  • 집행자

이들은 모두 작업자 노드 (일명 작업자)에서 실행됩니다.

그림 1은 Spark 독립 실행 형 애플리케이션의 컨텍스트에서 모든 Spark 구성 요소를 보여줍니다.

피어슨 애디슨-웨슬리

드라이버, 마스터 및 실행기 프로세스를 포함한 모든 Spark 구성 요소는 Java 가상 머신에서 실행됩니다. JVM은 Java 바이트 코드로 컴파일 된 명령을 실행할 수있는 크로스 플랫폼 런타임 엔진입니다. Spark가 작성된 Scala는 바이트 코드로 컴파일되고 JVM에서 실행됩니다.

Spark의 런타임 애플리케이션 구성 요소와 이들이 실행되는 위치 및 노드 유형을 구별하는 것이 중요합니다. 이러한 구성 요소는 다른 배포 모드를 사용하여 다른 위치에서 실행되므로 이러한 구성 요소를 물리적 노드 또는 인스턴스 용어로 생각하지 마십시오. 예를 들어, YARN에서 Spark를 실행하는 경우 그림 1의 여러 변형이있을 수 있습니다. 그러나 그림에 나와있는 모든 구성 요소는 여전히 응용 프로그램에 관여하고 동일한 역할을합니다.

Spark 드라이버

Spark 애플리케이션의 수명은 Spark 드라이버로 시작하고 끝납니다. 드라이버는 클라이언트가 Spark에서 애플리케이션을 제출하는 데 사용하는 프로세스입니다. 또한 운전자는 Spark 프로그램의 실행을 계획하고 조정하고 상태 및 / 또는 결과 (데이터)를 클라이언트에 반환 할 책임이 있습니다. 드라이버는 나중에 볼 수 있듯이 클라이언트 또는 클러스터의 노드에 물리적으로 상주 할 수 있습니다.

SparkSession

Spark 드라이버는 SparkSession 생성을 담당합니다. SparkSession 객체는 Spark 클러스터에 대한 연결을 나타냅니다. SparkSession은 대화 형 셸을 포함하여 Spark 애플리케이션의 시작 부분에서 인스턴스화되며 프로그램 전체에 사용됩니다.

Spark 2.0 이전에는 Spark 애플리케이션의 진입 점에 Spark 핵심 애플리케이션에 사용되는 SparkContext가 포함되었습니다. Spark SQL 애플리케이션과 함께 사용되는 SQLContext 및 HiveContext 및 Spark Streaming 애플리케이션에 사용되는 StreamingContext. Spark 2.0에 도입 된 SparkSession 개체는 이러한 모든 개체를 모든 Spark 애플리케이션에 사용할 수있는 단일 진입 점으로 결합합니다.

SparkContext 및 SparkConf 자식 개체를 통해 SparkSession 개체에는 마스터, 응용 프로그램 이름 및 실행기 수와 같은 구성 속성을 포함하여 사용자가 설정 한 모든 런타임 구성 속성이 포함됩니다. 그림 2는 SparkSession 개체와 pyspark셸의 일부 구성 속성을 보여줍니다 .

피어슨 애디슨-웨슬리

SparkSession 이름

SparkSession 인스턴스의 개체 이름은 임의적입니다. 기본적으로 Spark 대화 형 셸에서 SparkSession 인스턴스화의 이름은 spark. 일관성을 위해 항상 SparkSession을 다음과 같이 인스턴스화합니다 spark. 그러나 이름은 개발자의 재량에 달려 있습니다.

아래 코드는 .NET Framework를 사용하여 제출 된 프로그램과 같은 비대화 형 Spark 애플리케이션에서 SparkSession을 만드는 방법을 보여줍니다 spark-submit.

pyspark.sql에서 SparkSession 가져 오기

spark = SparkSession.builder \

  .master ( "spark : // sparkmaster : 7077") \

  .appName ( "내 Spark 애플리케이션") \

  .config ( "spark.submit.deployMode", "client") \

  .getOrCreate ()

numlines = spark.sparkContext.textFile ( "file : /// opt / spark / licenses") \

  .카운트()

print ( "총 줄 수는"+ str (numlines))

응용 프로그램 계획

운전자의 주요 기능 중 하나는 응용 프로그램을 계획하는 것입니다. 드라이버는 애플리케이션 처리 입력을 받아 프로그램 실행을 계획합니다. 드라이버는 요청 된 모든 변환 (데이터 조작 작업) 및 작업 (출력 요청 또는 프로그램 실행 프롬프트)을 취하고 각각 변환 또는 계산 단계를 나타내는 DAG (Directed Acyclic Graph)를 생성합니다.

방향성 비순환 그래프 (DAG)

DAG는 데이터 흐름과 그 종속성을 나타 내기 위해 컴퓨터 과학에서 일반적으로 사용되는 수학적 구조입니다. DAG에는 꼭지점 (또는 노드)과 가장자리가 포함됩니다. 데이터 흐름 컨텍스트의 정점은 프로세스 흐름의 단계입니다. DAG의 가장자리는 방향이 지정된 방향으로 그리고 순환 참조를 가질 수없는 방식으로 정점을 서로 연결합니다.

Spark 애플리케이션 DAG는 작업단계 로 구성됩니다 . 작업은 Spark 프로그램에서 예약 가능한 작업의 최소 단위입니다. 스테이지는 함께 실행할 수있는 작업 집합입니다. 단계는 서로 의존합니다. 즉, 스테이지 종속성이 있습니다.

프로세스 스케줄링 측면에서 DAG는 Spark에만 고유하지 않습니다. 예를 들어, Tez, Drill 및 Presto와 같은 다른 빅 데이터 에코 시스템 프로젝트에서 스케줄링에 사용됩니다. DAG는 Spark의 기본이므로 개념에 익숙해 져야합니다.

애플리케이션 오케스트레이션

또한 드라이버는 DAG에 정의 된 단계 및 작업 실행을 조정합니다. 작업 예약 및 실행과 관련된 주요 동인 활동은 다음과 같습니다.

  • 작업을 실행하기 위해 사용 가능한 리소스를 추적합니다.
  • 가능한 경우 데이터에 "가까이"실행되도록 작업을 예약합니다 (데이터 지역성 개념).

기타 기능

Spark 프로그램 실행을 계획하고 조정하는 것 외에도 드라이버는 응용 프로그램에서 결과를 반환해야합니다. 클라이언트에 데이터를 반환하도록 요청하는 작업 (예 : 대화 형 쿼리)의 경우 반환 코드 또는 데이터가 될 수 있습니다.

드라이버는 또한 그림 3과 같이 포트 4040에서 애플리케이션 UI를 제공합니다.이 UI는 자동으로 생성됩니다. 제출 된 코드 또는 제출 방법 (즉,를 사용하는 대화 pyspark 형 또는를 사용하는 비대화 형 spark-submit) 과는 무관합니다 .

피어슨 애디슨-웨슬리

후속 애플리케이션이 동일한 호스트에서 시작되는 경우 애플리케이션 UI에 연속 포트가 사용됩니다 (예 : 4041, 4042 등).

Spark 작업자 및 실행자

Spark 실행기는 Spark DAG 작업이 실행되는 프로세스입니다. 실행기는 Spark 클러스터의 슬레이브 노드 또는 작업자에 CPU 및 메모리 리소스를 예약합니다. 실행기는 특정 Spark 애플리케이션 전용이며 애플리케이션이 완료되면 종료됩니다. Spark 프로그램은 일반적으로 병렬로 작동하는 많은 실행기로 구성됩니다.

일반적으로 실행 프로그램 프로세스를 호스팅하는 작업자 노드에는 특정 시점에 할당 된 실행 프로그램 수가 한정되어 있거나 고정되어 있습니다. 따라서 알려진 수의 노드 인 클러스터에는 주어진 시간에 실행할 수있는 제한된 수의 실행기가 있습니다. 애플리케이션에 클러스터의 물리적 용량을 초과하는 실행기가 필요한 경우 다른 실행기가 리소스를 완료하고 해제 할 때 시작되도록 예약됩니다.

앞서 언급했듯이 JVM은 Spark 실행기를 호스팅합니다. 실행 기용 JVM에는 객체를 저장하고 관리하는 전용 메모리 공간 인 이 할당 됩니다.

집행자의 JVM 힙하기 위해 최선을 다하고 메모리의 양은 속성으로 설정 spark.executor.memory하거나으로 --executor-memory받는 인수 pyspark, spark-shell또는 spark-submit명령.

실행자는 작업의 출력 데이터를 메모리 또는 디스크에 저장합니다. 작업자와 실행자는 자신에게 할당 된 작업 만 인식하는 반면 드라이버는 전체 작업 집합과 응용 프로그램을 구성하는 각 종속성을 이해해야합니다.

드라이버 호스트의 포트 404 x 에서 Spark 애플리케이션 UI를 사용하면 그림 4와 같이 애플리케이션의 실행기를 검사 할 수 있습니다.

피어슨 애디슨-웨슬리

Spark 독립형 클러스터 배포의 경우 작업자 노드는 그림 5와 같이 포트 8081에서 사용자 인터페이스를 노출합니다.

피어슨 애디슨-웨슬리

Spark 마스터 및 클러스터 관리자

Spark 드라이버는 Spark 애플리케이션을 실행하는 데 필요한 작업 집합을 계획하고 조정합니다. 작업 자체는 작업자 노드에서 호스팅되는 실행기에서 실행됩니다.

마스터 및 클러스터 관리자는 실행기가 실행되는 분산 클러스터 리소스 (또는 YARN 또는 Mesos의 경우 컨테이너)를 모니터링, 예약 및 할당하는 중앙 프로세스입니다. 마스터와 클러스터 관리자는 별도의 프로세스가 될 수도 있고 독립 실행 형 모드에서 Spark를 실행할 때처럼 하나의 프로세스로 결합 될 수도 있습니다.

스파크 마스터

Spark 마스터는 클러스터의 리소스를 요청하고 Spark 드라이버에서 사용할 수 있도록하는 프로세스입니다. 모든 배포 모드에서 마스터는 작업자 노드 또는 슬레이브 노드와 리소스 또는 컨테이너를 협상하고 상태를 추적하고 진행 상황을 모니터링합니다.

독립 실행 형 모드에서 Spark를 실행할 때 Spark 마스터 프로세스는 그림 6과 같이 마스터 호스트의 포트 8080에서 웹 UI를 제공합니다.

피어슨 애디슨-웨슬리

Spark 마스터 대 Spark 드라이버

드라이버와 마스터의 런타임 기능을 구별하는 것이 중요합니다. 마스터 라는 이름 은이 프로세스가 응용 프로그램 실행을 제어하고 있음을 의미하는 것으로 추론 될 수 있지만 그렇지 않습니다. 마스터는 단순히 리소스를 요청하고 해당 리소스를 드라이버에 제공합니다. 마스터는 이러한 리소스의 상태와 상태를 모니터링하지만 응용 프로그램 실행과 작업 및 단계 조정에는 관여하지 않습니다. 그것이 운전자의 일입니다.

클러스터 관리자

클러스터 관리자는 작업자 노드를 모니터링하고 마스터의 요청에 따라 이러한 노드에서 리소스를 예약하는 프로세스입니다. 그런 다음 마스터는 이러한 클러스터 리소스를 실행기의 형태로 드라이버에 제공합니다.

앞서 언급했듯이 클러스터 관리자는 마스터 프로세스와 분리 될 수 있습니다. Mesos 또는 YARN에서 Spark를 실행하는 경우입니다. 독립 실행 형 모드로 실행되는 Spark의 경우 마스터 프로세스는 클러스터 관리자의 기능도 수행합니다. 효과적으로 자체 클러스터 관리자 역할을합니다.

클러스터 관리자 기능의 좋은 예는 Hadoop 클러스터에서 실행되는 Spark 애플리케이션을위한 YARN ResourceManager 프로세스입니다. ResourceManager는 YARN NodeManager에서 실행되는 컨테이너의 상태를 예약, 할당 및 모니터링합니다. 그런 다음 Spark 애플리케이션은 이러한 컨테이너를 사용하여 실행기 프로세스와 애플리케이션이 클러스터 모드에서 실행중인 경우 마스터 프로세스를 호스팅합니다.

독립형 스케줄러를 사용하는 Spark 애플리케이션

2 장 "Spark 배포"에서 Spark의 배포 옵션으로 독립형 스케줄러를 설명했습니다. 여기서 저는 2 장의 연습 중 하나에서 완전한 기능을 갖춘 다중 노드 Spark 독립형 클러스터를 배포했습니다. 앞서 언급했듯이 독립형 모드로 실행되는 Spark 클러스터에서 Spark 마스터 프로세스는 클러스터 관리자 기능도 수행하여 서버에서 사용 가능한 리소스를 관리합니다. Spark 애플리케이션에서 사용할 수 있도록 마스터 프로세스에 클러스터를 부여합니다.

YARN에서 실행되는 Spark 애플리케이션

Hadoop은 Spark를위한 매우 인기 있고 일반적인 배포 플랫폼입니다. 일부 업계 전문가들은 Spark가 곧 Hadoop의 애플리케이션을위한 기본 처리 플랫폼으로 MapReduce를 대체 할 것이라고 믿습니다. YARN의 Spark 애플리케이션은 동일한 런타임 아키텍처를 공유하지만 구현에 약간의 차이가 있습니다.

클러스터 관리자로서의 ResourceManager

독립형 스케줄러와 달리 YARN 클러스터의 클러스터 관리자는 YARN ResourceManager입니다. ResourceManager는 클러스터의 모든 노드에서 리소스 사용량과 가용성을 모니터링합니다. 클라이언트는 YARN ResourceManager에 Spark 애플리케이션을 제출합니다. ResourceManager는 응용 프로그램에 대한 첫 번째 컨테이너 인 ApplicationMaster라는 특수 컨테이너를 할당합니다.

Spark 마스터로서의 ApplicationMaster

ApplicationMaster는 Spark 마스터 프로세스입니다. 마스터 프로세스가 다른 클러스터 배포에서 수행하는 것처럼 ApplicationMaster는 응용 프로그램 드라이버와 클러스터 관리자 (또는이 경우 ResourceManager)간에 리소스를 협상합니다. 그런 다음 드라이버에서 이러한 리소스 (컨테이너)를 사용하여 작업을 실행하고 응용 프로그램에 대한 데이터를 저장하는 실행기로 사용할 수 있습니다.

ApplicationMaster는 응용 프로그램의 수명 동안 유지됩니다.

YARN에서 실행되는 Spark 애플리케이션의 배포 모드

Spark 애플리케이션을 YARN 클러스터에 제출할 때 클라이언트 모드와 클러스터 모드의 두 가지 배포 모드를 사용할 수 있습니다. 지금 살펴 보겠습니다.

클라이언트 모드

클라이언트 모드에서 드라이버 프로세스는 응용 프로그램을 제출하는 클라이언트에서 실행됩니다. 본질적으로 관리되지 않습니다. 드라이버 호스트가 실패하면 응용 프로그램이 실패합니다. 클라이언트 모드는 대화 형 셸 세션 ( pyspark, spark-shell등) 및 비대화 형 응용 프로그램 제출 ( spark-submit) 모두에 대해 지원됩니다 . 아래 코드 pyspark는 클라이언트 배포 모드를 사용하여 세션 을 시작하는 방법을 보여줍니다 .

$ SPARK_HOME / bin / pyspark \

-마스터 원사 클라이언트 \

--num-executors 1 \

-드라이버 메모리 512m \

--executor-memory 512m \

-실행자 코어 1

# 또는

$ SPARK_HOME / bin / pyspark \

-마스터 원사 \

-배포 모드 클라이언트 \

--num-executors 1 \

-드라이버 메모리 512m \

--executor-memory 512m \

-실행자 코어 1

그림 7은 클라이언트 모드의 YARN에서 실행되는 Spark 애플리케이션의 개요를 제공합니다.

피어슨 애디슨-웨슬리

그림 7에 표시된 단계는 다음과 같습니다.

  1. 클라이언트는 Spark 애플리케이션을 클러스터 관리자 (YARN ResourceManager)에 제출합니다. 드라이버 프로세스, SparkSession 및 SparkContext가 생성되고 클라이언트에서 실행됩니다.
  2. ResourceManager는 애플리케이션에 대해 ApplicationMaster (Spark 마스터)를 할당합니다.
  3. ApplicationMaster는 ResourceManager에서 실행기에 사용할 컨테이너를 요청합니다. 컨테이너가 할당되면 실행기가 생성됩니다.
  4. 클라이언트에있는 드라이버는 실행자와 통신하여 Spark 프로그램의 작업 및 단계 처리를 마샬링합니다. 드라이버는 진행 상황, 결과 및 상태를 클라이언트에 반환합니다.

클라이언트 배포 모드는 사용하기 가장 간단한 모드입니다. 그러나 대부분의 프로덕션 애플리케이션에 필요한 복원력이 부족합니다.

클러스터 모드

클라이언트 배포 모드와 달리 YARN 클러스터 모드에서 실행되는 Spark 애플리케이션에서는 드라이버 자체가 ApplicationMaster의 하위 프로세스로 클러스터에서 실행됩니다. 이는 복원력을 제공합니다. 드라이버를 호스팅하는 ApplicationMaster 프로세스가 실패하면 클러스터의 다른 노드에서 다시 인스턴스화 할 수 있습니다.

아래 코드는 spark-submit및 YARN 클러스터 배포 모드를 사용하여 애플리케이션을 제출하는 방법을 보여줍니다 . 드라이버는 클러스터에서 실행되는 비동기 프로세스이므로 대화 형 셸 응용 프로그램 ( pysparkspark-shell)에 대해 클러스터 모드가 지원되지 않습니다 .

$ SPARK_HOME / bin / spark-submit \

-마스터 원사 클러스터 \

--num-executors 1 \

-드라이버 메모리 512m \

--executor-memory 512m \

-실행자 코어 1

$ SPARK_HOME / examples / src / main / python / pi.py 10000

# 또는

-마스터 원사 \

-배포 모드 클러스터 \

--num-executors 1 \

-드라이버 메모리 512m \

--executor-memory 512m \

-실행자 코어 1

$ SPARK_HOME / examples / src / main / python / pi.py 10000

그림 8은 클러스터 모드의 YARN에서 실행되는 Spark 애플리케이션의 개요를 제공합니다.

피어슨 애디슨-웨슬리

그림 8에 표시된 단계는 다음과 같습니다.

  1. 를 호출하는 사용자 프로세스 인 클라이언트 spark-submit는 Spark 애플리케이션을 클러스터 관리자 (YARN ResourceManager)에 제출합니다.
  2. ResourceManager는 애플리케이션에 대해 ApplicationMaster (Spark 마스터)를 할당합니다. 드라이버 프로세스는 동일한 클러스터 노드에 생성됩니다.
  3. ApplicationMaster는 ResourceManager에서 실행기에 대한 컨테이너를 요청합니다. 실행기는 ResourceManager에 의해 ApplicationMaster에 할당 된 컨테이너에서 생성됩니다. 그런 다음 드라이버는 실행 프로그램과 통신하여 Spark 프로그램의 작업 및 단계 처리를 마샬링합니다.
  4. 클러스터의 노드에서 실행되는 드라이버는 진행률, 결과 및 상태를 클라이언트에 반환합니다.

이전에 표시된 Spark 애플리케이션 웹 UI는 클러스터의 ApplicationMaster 호스트에서 사용할 수 있습니다. 이 사용자 인터페이스에 대한 링크는 YARN ResourceManager UI에서 사용할 수 있습니다.

로컬 모드 재검토

로컬 모드에서 드라이버, 마스터 및 실행기는 모두 단일 JVM에서 실행됩니다. 이 장의 앞부분에서 언급했듯이 이것은 개발, 단위 테스트 및 디버깅에 유용하지만 배포되지 않고 확장되지 않기 때문에 프로덕션 응용 프로그램을 실행하는 데 제한적으로 사용됩니다. 또한 로컬 모드에서 실행되는 Spark 애플리케이션에서 실패한 작업은 기본적으로 다시 실행되지 않습니다. 그러나이 동작을 재정의 할 수 있습니다.

로컬 모드에서 Spark를 실행할 때 애플리케이션 UI는 // localhost : 4040에서 사용할 수 있습니다. 마스터 및 작업자 UI는 로컬 모드에서 실행할 때 사용할 수 없습니다.