본문 바로가기

Spark

스파크 완벽 가이드 CHAPTER 15~17

CHAPTER 15

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

이장에서 알아볼 주제

  • 스파크 애플리케이션의 아키텍처와 컴포넌트
  • 스파크 내/외부에서 실행되는 스파크 애플리케이션의 생애주기
  • 파이프라이닝과 같은 중요한 저수준 실행 속성
  • 스파크 애플리케이션을 실행하는 데 필요한 사항

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

스파크 드라이버

  • 스파크드라이버는 스파크 애플리케이션의 운전자 역할 을 하는 프로세서이다.
  • 스파크 드라이버는 Apache Spark 애플리케이션의 핵심적인 컨트롤러로서, 클러스터 매니저와 통신하여 작업을 분배하고 관리.
  • 이 드라이버는 사용자 프로그램과 상호 작용하여 사용자 코드를 실행하고 결과를 반환.
  • 클러스터 내에서 중앙 집중식으로 동작하여 스파크 애플리케이션의 실행 흐름을 제어하고 관리.

스파크 익스큐터

  • 스파크 익스큐터는 스파크 드라이버가 할당한 Task를 수행하는 프로세스.
  • 드라이버가 할당한 Task를 받아 실행하고 Task의 상태와 겨과(성공 또는 실패)를 드라이버에 보고한다.
  • 모든 Spark 애플리케이션은 개별 익스큐터 프로세스를 사용한다.

클러스터 매니저

  • 클러스터 매니저는 스파크 애플리케이션을 실행할 클러스터 머신을 유지한다.
  • 클러스터 매니저는 드라이버워커 라는 개념을 가지고 있다.
  • 가장큰 차이점은 프로세스가 아닌 물리적인 머신에 연결되는 개념이다.

스파크 앱을 실제로 실행할 때가 되면 클러스터 매니저에 자원 할당을 요청한다. 사용자 애플리케이션의 설정에 따라 스파크 드라이버를 실행할 자원을 포함해 요청하거나 스파크 앱 실행을 위한 익스큐터 자원을 요청할 수도 있다.

스파크가 지원하는 클러스터 매니저

  • 스탠드얼론 클러스터 매니저
  • Apache 메소스
  • Hadoop YARN

15.1.1 실행 모드

실행 모드는 애플리케이션을 실행할 때 요청한 자원의 물리적인 위치를 결정한다. 선택할 수 있는 실행 모드는 다음과 같다.

  • 클러스터 모드
  • 클라이언트 모드
  • 로컬 모드

클러스터 모드

  • 가장 흔하게 사용되는 모드
  • 클러스터 모드를 사용하려면 컴파일된 Jar 파일이나 파이썬 스크립트 또는 R 스크립트를 클러스터 매니저에 전달해야 한다.
  • 클러스터 매니저는 모든 Spark 애플리케이션과 관련된 프로세스를 유지하는 역할을 한다.

클라이언트 모드

  • 애플리케이션을 제출한 클라이언트 머신에 스파크 드라이버가 위치한다는 것을 제외하면 클러스터 모드와 비슷하다.

로컬 모드

  • 로컬 모드로 설정된 경우 모든 Spark 애플리케이션은 단일 머신에서 실행된다.
  • 병렬 처리를 위해 단일 머신의 Thread 를 활용한다.
  • Saprk 를 학습하거나 애플리케이션 테스트 그리고 개발중인 앱을 반복적으로 실험하는 용도로 주로 사용

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

애플리케이션을 실행하는 예제를 그림과 함께 설명한다. 하나의 드라이버 노드와 세 개의 워커 노드로 구성된 총 네 대 규모의 클러스터가 이미 실행된다고 가정하고 이 시점에서 클러스터 매니저는 중요하지 않다. 초기화부터 종료까지 생애주기를 단계별로 알아보자.

15.2.1 클라이언트 요청

  1. 스파크 애플리케이션을 제출한다. (JAR 파일이나 라이브러리)
  • 제출하는 시점에 로컬 머신에서 코드가 실행되어 클러스터 드라이버 노드에 요청한다.
  • 이 과정에서 _스파크 드라이버 프로세스_의 자원을 함께 요청한다.
  • 클러스터 매니저가 요청을 받아들이고 클러스터 노드 중 하나에 드라이버 프로세스를 실행한다.
  • Spark JOB 을 제출한 클라이언트 프로세스는 종료되고 애플리케이션은 클러스터에서 실행된다.

15.2.2 시작

  • 드라이버 프로세스가 클러스터에 배치되었으므로 사용자 코드를 실행할 차례이다.
  • 사용자 코드에는 반드시 스파크 클러스터를 초기화하는 SparkSession이 포함되어야 한다.
  • SaprkSession은 클러스터 매니저와 통신해 스파크 익스큐터 프로세스의 실행을 요청 한다.
  • spark-submit을 실행할때 사용하는 명령행 인수로 익스큐터 수와 설정값을 지정할 수 있다.

15.2.3 실행

  • 드라이버와 워커는 코드를 실행하고 데이터를 이동하는 과정에서 서로 통신한다.
  • 드라이버는 각 워커에 태스크를 할당한다.
  • 태스크를 할당받은 워커는 태스크 상태와 성공/실패 여부를 드라이버에 전송한다.

15.2.4 완료

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

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

  • 스파크 애플이케이션은 하나 이상의 스파크 잡으로 구성된다.
  • 스레드를 사용해 여러 액션을 병렬로 수행하는 경우가 아니라면 애플리케이션의 스파크 잡은 차례대로 실행된다.

15.3.1 SparkSession

모든 스파크 애플리케이션은 가장 먼저 SparkSession을 생성한다.
여러 대화형 모든에서는 자동으로 생성되지만, 애플리케이션을 만드는 경우라면 직접 생성하야한다.

SaprkContext

SparkContext는 Apache Spark에서 애플리케이션을 실행하기 위한 핵심 요소이다. 단순히 말하자면, 이것은 Spark 애플리케이션을 시작하고 관리하는데 사용된다.

  • SparkContext를 이용해 RDD같은 저수준 API를 사용할 수 있다.
  • 대부분 경우 SaprkSession으로 SparkContext를 접근할수 있으므로 명시적으로 SparkContext를 초기화할 필요는 없다.
  • 직접 초기화하는 가장 일반적인 방법은 getOrCreate 메서드를 사용하는 것이다.

15.3.2 논리적 명령

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

15.3.3 스파크 잡

보통 액션 하나당 하나의 스파크 잡이 생성되며 액션은 항상 결과를 반환한다.
스파크 잡은 일련의 스테이지로 나뉘며 스테이지 수는 셔플 작업이 얼마나 많이 발생하는지에 따라 달라진다.

CHAPTER 16

스파크 애플리케이션 개발하기

16.1 스파크 애플리케이션 작성하기

스파크 애플리케이션은 스파크 클러스터와 사용자 코드 두 가지 조합으로 구성된다. 이번 예제에서는 클러스터 모드를 로컬 모드로 설정하고 사전에 정의된 애플리케이션을 사용자 코드로 사용한다. 스파크가 지원하는 다양한 언어로 스파크 애플리케이션을 개발해보자.

16.1.1 간단한 스칼라 기반 앱

스칼라는 스파크의 '기본'언어리기 때문에 애플리케이션을 개발하는 가정 적합한 방법으로 볼 수 있다.

16.2 스파크 애플리케이션 테스트

16.2.1 전략적 원칙

입력 데이터에 대한 유연성

데이터 파이프라인은 다양한 유형의 입력 데이터에 유연하게 대처할 수 있어야한다.
비즈니스 요구사항이 변하면 데이터도 변한다. 따라서 스파크 애플리케이션과 파이프라인은 입력 데이터 중 일부가 변하더라도 유연하게 대처할 수 있어야 한다.

비즈니스 로직 변경에 대한 유연성

  • 입력 데이터뿐만 아니라 파이프라인 내부의 비즈니스 로직이 바뀔 수도 있다.
  • 원하는 결과를 얻을수 있도록 실제와 유사한 데이터를 사용해 테스트 해야한다.
  • 이 유형의 테스트에서 스파크 기능을 테스트하는 '스파크 단위 테스트'를 작성하지 않도록 조심해야 한다.
  • 대신 비즈니스 로직을 테스트해 복잡한 비즈니스 파이프라인이 의도대로 동작하는지 확인해야 한다.

결과의 유연성과 원자성

16.2.2 테스트 코드 작성 시 고려사항

  • 비스니스 로직이 정상적으로 동작하는지 확인해야 한다.
  • 단위 테스트를 하면 스키마가 변경되는 상황에 쉽게 대응할 수 있다.
  • 단위 테스트의 구성 방법은 비즈니스 도메인과 도메인 경험에 따라 다양할 수 있으므로 개발자의 역량에 달려 있다.

SaprkSession 관리하기

스파크 로컬 모드 덕분에 JUnit이나 ScalaTest같은 단위 테스트용 프레임워크로 비교적 쉽게 스파크 코드를 테스트 할 수 있다.

테스트 코드용 스파크 API 선정하기

스파크는 다양한 API를 제공한다. 각 API는 사용자 애플리케이션의 유지 보수성과 테스트 용이성 측면에서 서로 다른 영향을 미칠 수 있다. 적합한 API는 사용자가 속한 팀과 팀에서 무엇을 필요로 하는지에 따라 달리질 수 있다.

16.2.3 단위 테스트 프레임워크에 연결하기

코드를 단위 테스트하려면 각 언어의 포준 프레임워크를 사용하고 테스트 하네스에서 테스트마자 SparkSession을 생성하고 제거하도록 설정하는 것이 좋다.

16.2.4 데이터소스 연결하기

가능하면 테스트 코드에서는 운영 환경의 데이터소스에 접속하지 말아야 한다.

16.3 개발 프로세스

16.4 애플리케이션 시작하기

대부분의 스파크 애플리케이션은 spark-submit 명령으로 실행한다.

spark-submit도움말

spark-submit도움말2

배포 환경 설정

##16.4.1 애플리케이션 시작 예제

16.5.1 SparkConf

16.5.2 애플리케이션 속성

애플리케이션속성2

CHAPTER 17

스파크 배포 환경