클러스터 모드 개요를 읽었 지만 Spark Standalone 클러스터 의 여러 프로세스 와 병렬 처리를 여전히 이해할 수 없습니다 .
작업자가 JVM 프로세스입니까? 나는을 실행하고 bin\start-slave.sh
실제로 JVM 인 작업자를 생성했다는 것을 알았습니다.
위 링크에 따라 실행 프로그램은 작업을 실행하는 작업자 노드의 응용 프로그램에 대해 시작된 프로세스입니다. 집행자는 또한 JVM입니다.
이것들은 나의 질문입니다 :
-
집행자는 응용 프로그램마다 있습니다. 그렇다면 노동자의 역할은 무엇입니까? 실행기와 협조하여 결과를 운전자에게 다시 전달합니까? 아니면 운전자가 직접 유언 집행 인과 대화합니까? 그렇다면 근로자의 목적은 무엇입니까?
-
응용 프로그램의 실행 프로그램 수를 제어하는 방법은 무엇입니까?
-
실행 프로그램 내에서 작업을 병렬로 실행할 수 있습니까? 그렇다면 실행기의 스레드 수를 구성하는 방법은 무엇입니까?
-
작업자, 집행자 및 집행자 코어 (–total-executor-cores)의 관계는 무엇입니까?
-
노드 당 더 많은 작업자가 있다는 것은 무엇을 의미합니까?
업데이트
더 잘 이해하기 위해 예를 들어 봅시다.
예 1 :
기본 설정으로 응용 프로그램을 시작할 때 작업자 노드가 5 개인 독립형 클러스터 (각 노드에 코어가 8 개임)
예 2 예 1과
동일한 클러스터 구성이지만 다음 설정 –executor-cores 10 –total-executor-cores 10으로 응용 프로그램을 실행합니다.
예 3
예 1과 동일한 클러스터 구성이지만 다음 설정 –executor-cores 10 –total-executor-cores 50으로 응용 프로그램을 실행합니다.
예 4
예 1과 동일한 클러스터 구성이지만 다음 설정 –executor-cores 50 –total-executor-cores 50으로 응용 프로그램을 실행합니다.
예제 5
예제 1과 동일한 클러스터 구성이지만 다음 설정 –executor-cores 50 –total-executor-cores 10으로 애플리케이션을 실행합니다.
이러한 각 예에서 얼마나 많은 유언 집행 인이 있습니까? executor 당 몇 개의 스레드가 있습니까? 코어는 몇 개입니까? 응용 프로그램 당 실행자 수는 어떻게 결정됩니까? 항상 노동자 수와 동일합니까?
답변
Spark는 마스터 / 슬레이브 아키텍처를 사용합니다. 그림에서 볼 수 있듯이 분산 된 많은 작업자 (실행자)와 통신하는 하나의 중앙 조정자 (드라이버)가 있습니다. 드라이버와 각 실행 프로그램은 자체 Java 프로세스에서 실행됩니다.
운전사
드라이버는 기본 메소드가 실행되는 프로세스입니다. 먼저 사용자 프로그램을 작업으로 변환 한 후 실행 프로그램의 작업을 예약합니다.
임원
실행자는 주어진 Spark 작업에서 개별 작업을 실행하는 작업자 노드의 프로세스입니다. Spark 응용 프로그램의 시작 부분에서 시작되며 일반적으로 응용 프로그램의 전체 수명 동안 실행됩니다. 일단 작업을 실행하면 결과를 드라이버로 보냅니다. 또한 블록 관리자를 통해 사용자 프로그램에 의해 캐시되는 RDD를위한 인 메모리 스토리지를 제공합니다.
응용 프로그램 실행 흐름
이를 염두에두고 spark-submit을 사용하여 클러스터에 응용 프로그램을 제출하면 내부적으로 발생합니다.
- 독립형 응용 프로그램은 인스턴스를 시작하고 인스턴스화
SparkContext
합니다 (응용 프로그램을 드라이버로 호출 할 수있는 경우에만 해당). - 드라이버 프로그램은 실행 프로그램을 시작하기 위해 클러스터 관리자에게 자원을 요청합니다.
- 클러스터 관리자가 실행 프로그램을 시작합니다.
- 드라이버 프로세스는 사용자 응용 프로그램을 통해 실행됩니다. RDD 작업을 통한 조치 및 변환에 따라 실행 프로그램으로 전송됩니다.
- 실행자는 작업을 실행하고 결과를 저장합니다.
- 작업자가 충돌하면 작업이 다른 실행 프로그램으로 전송되어 다시 처리됩니다. “Learning Spark : Lightning-Fast Big Data Analysis”책에서 Spark 및 Fault Tolerance에 대해 설명합니다.
Spark는 실패하거나 느린 작업을 다시 실행하여 실패하거나 느린 시스템을 자동으로 처리합니다. 예를 들어, map () 작업의 파티션을 실행하는 노드가 충돌하면 Spark는이를 다른 노드에서 다시 실행합니다. 노드가 충돌하지는 않지만 다른 노드보다 훨씬 느리더라도 Spark는 다른 노드에서 작업의 “추측 적”복사본을 미리 시작하여 완료되면 결과를 얻을 수 있습니다.
- 드라이버에서 SparkContext.stop ()을 사용하거나 기본 메소드가 종료 / 크래시되면 모든 실행 프로그램이 종료되고 클러스터 관리자가 클러스터 자원을 해제합니다.
당신의 질문
-
실행자가 시작되면 드라이버에 등록한 후 직접 통신합니다. 작업자는 클러스터 관리자에게 리소스 가용성을 알리는 일을 담당합니다.
-
YARN 클러스터에서는 –num-executors를 사용하여이를 수행 할 수 있습니다. 독립 실행 형 클러스터에서는 spark.executor.cores로 작업하고 작업자에 둘 이상의 실행기를 보유 할 수있는 충분한 코어가없는 한 작업 자당 하나의 실행기를 얻게됩니다. (@JacekLaskowski가 지적했듯이 –num-executors는 더 이상 YARN에서 사용되지 않습니다 https://github.com/apache/spark/commit/16b6d18613e150c7038c613992d80a7828413e66 )
-
–executor-cores를 사용하여 실행기 당 코어 수를 지정할 수 있습니다.
-
–total-executor-cores는 애플리케이션 당 최대 실행기 코어 수입니다.
-
Sean Owen은이 스레드 에서 다음과 같이 말했습니다 . “컴퓨터 당 두 명 이상의 작업자를 실행해야 할 이유가 없습니다.” 예를 들어 하나의 시스템에 많은 JVM이 있습니다.
최신 정보
이 시나리오를 테스트 할 수 없었지만 설명서에 따르면 :
예 1 : Spark는 스케줄러가 제공하는만큼 많은 코어 및 실행기를 확보합니다. 결국 8 개의 코어를 가진 5 개의 실행기를 얻게됩니다.
예 2-5 : Spark는 단일 작업자에게 요청한만큼의 코어를 할당 할 수 없으므로 실행 프로그램이 시작되지 않습니다.