본문 바로가기
BigData 기술/Spark

[spark] 아파치 스파크 클러스터 종류

by 잇서니 2019. 6. 27.
반응형

1. 스파크 로컬 모드

간단한 테스트를 할 때 유용합니다. 로컬 머신에서만 스파크가 구동됩니다. 클라이언트 JVM에 driver 1개와 executor 1개씩만 생성하는 형태입니다. 그래도 executor는 스레드를 여러 개 생성하여 태스크를 병렬로 실행할 수 있습니다.

 

spark-shell이나 spark-submit 으로 로컬모드를 수행할 때는 --master 매개변수 값을 아래와 같이 설정합니다.

매개변수 값 설명
local[n] 스레드 n개를 사용하여 1개의 executor를 실행
local 스레드 1개를 사용하여 1개의 executor를 실행 (local[1])
local[*] 로컬머신의 CPU 코어개수와 동일하게 스레드를 생성하여 1개의 executor를 실행
local[,] 스레드 n개를 사용하여 1개의 executor를 실행하고, 태스크당 실패를 최대 f번까지 허용

spark-shell, spark-submit 수행 예시입니다.

spark-shell --master local[4] --packages org.apache.spark:spark-streaming-kafka-0-8_2.11:2.0.0,org.apache.kafka:kafka_2.11:0.8.2.1
spark-submit --master local[4] --jar sunnytest.jar

 

2. 스파크 로컬 클러스터 모드

로컬모드와 다른 점은 master와 worker 프로세스가 있다는 것입니다. 이 프로세스들은 로컬모드와 동일하게 로컬 머신에서만 구동됩니다. master 프로세스는 클라이언트 JVM에서 실행됩니다. 각각의 worker 프로세스는 별도의 JVM에서 실행됩니다.

 

spark-shell이나 spark-submit 으로 로컬 클러스터 모드를 수행할 때는 --master 매개변수 값을 아래와 같이 설정합니다.

매개변수 값 설명
local-cluster[<n>,<c>,<m>] 로컬 머신에서 스레드 <c>개와 <m>MB 메모리를 사용하는 executor를 <n>개 생성하여 실행

spark-shell, spark-submit 수행 예시입니다.

spark-shell --master local-cluster[4,1024,3] --packages org.apache.spark:spark-streaming-kafka-0-8_2.11:2.0.0,org.apache.kafka:kafka_2.11:0.8.2.1
spark-submit --master local-cluster[4,1024,3] --jar sunnytest.jar

 

3. 스파크 자체 클러스터 모드 (standalone)

master 프로세스와 worker 프로세스로 구성됩니다. master 프로세스가 클러스터 매니저 역할을 합니다. worker 프로세스는 driver와 executor 프로세스를 시작합니다. 스파크 로컬 클러스터 모드와는 다르게 클러스터의 모든 노드가 worker 프로세스를 수행할 수 있다는 점입니다. 이 말은 클러스터의 모든 노드에 스파크가 설치되어야 한다는 것입니다.

 

또한, driver 실행모드에 따라 driver 프로세스가 어디서 시작되는지 결정됩니다. 클러스터 배포모드인 경우,클러스터 내부에서 driver가 실행됩니다. 클라이언트 배포모드인 경우, 클라이언트 JVM에서 driver가 실행됩니다.

 

예를 들어, 1번 노드에서 spark-submit을 수행했다고 합시다. 1번 노드가 클라이언트인 것이죠. 그렇다면 클러스터 배포모드라면 클러스터의 어떤 노드에서 driver가 실행될 것입니다. 클라이언트 배포모드라면 1번 노드에서 driver가 실행됩니다.

 

4. YARN 클러스터 모드

YARN이 클러스터 매니저 역할을 하는 형태입니다. 리소스가 할당되는 과정은 다음과 같습니다. (어플리케이션 종류가 스파크일 뿐, YARN 개념이 동일하게 적용됩니다.)

 

  • (1) 클라이언트가 스파크 어플리케이션을 리소스 매니저에게 제출합니다.
  • (2) 리소스 매니저는 노드매니저 중 하나를 선정해서 어플리케이션 마스터(스파크 driver)를 실행할 컨테이너를 할당하라고 지시합니다.
  • (3) 노드매니저는 어플리케이션 마스터(스파크 driver)의 컨테이너를 시작합니다.
  • (4) 어플리케이션 마스터는 스파크 executor에 사용할 컨테이너들을 리소스 매니저에 추가로 요청합니다.
  • (5) 리소스 매니저가 리소스 할당을 ok 하면, 어플리케이션 마스터는 노드매니저에게 컨테이너를 시작하라고 합니다.
  • (6) 노드매니저는 스파크 executor에서 사용할 컨테이너를 시작합니다.
  • (7) 이제 driver와 executor는 직접 통신하면서 스파크 어플리케이션을 수행합니다.

 

5. 메소스 클러스터 모드

메소스가 클러스터 매니저 역할을 하는 형태입니다. YARN과 가장 다른 점은 어플리케이션이 클러스터에게 리소스를 요청하는 것이 아니라, 클러스터가 어플리케이션에 리소스를 제안한다는 것입니다. 메소스는 master, slave, 어플리케이션(executor, 스케쥴러)로 구성됩니다.

리소스 할당 과정은 다음과 같습니다.

  • (1) slave는 자신의 리소스를 master에 제안합니다.
  • (2) 스파크 driver가 실행하는 메소스 스케쥴러는 자신을 메소스 master에 등록합니다.
  • (3) master는 스케쥴러에게 리소스를 제안합니다.
  • (4) 스케쥴러는 master가 제안한 리소스 일부를 수용합니다. 사용할 리소스 목록과 이 리소스로 실행할 태스크 목록을 master에 전달합니다.
  • (5) master는 스케쥴러가 요청한 리소스를 사용하여 태스크를 시작하라고 slave에게 지시합니다.
  • (6) slave는 메소스 executor를 실행합니다.
  • (7) 메소스 executor는 스파크 executor를 시작합니다.
  • (8) 스파크 executor는 스파크 driver와 직접 통신하면서 스파크 태스크를 실행합니다.
반응형

댓글