Spark Standalone 클러스터의 작업자, 실행자, 코어 란 무엇입니까?


219

클러스터 모드 개요를 읽었 지만 Spark Standalone 클러스터 의 여러 프로세스 와 병렬 처리를 여전히 이해할 수 없습니다 .

작업자가 JVM 프로세스입니까? 나는을 실행하고 bin\start-slave.sh실제로 JVM 인 작업자를 생성했다는 것을 알았습니다.

위 링크에 따라 실행 프로그램은 작업을 실행하는 작업자 노드의 응용 프로그램에 대해 시작된 프로세스입니다. 집행자는 또한 JVM입니다.

이것들은 나의 질문입니다 :

  1. 집행자는 응용 프로그램마다 있습니다. 그렇다면 노동자의 역할은 무엇입니까? 실행기와 협조하여 결과를 운전자에게 다시 전달합니까? 아니면 운전자가 직접 유언 집행 인과 대화합니까? 그렇다면 근로자의 목적은 무엇입니까?

  2. 응용 프로그램의 실행 프로그램 수를 제어하는 ​​방법은 무엇입니까?

  3. 실행 프로그램 내에서 작업을 병렬로 실행할 수 있습니까? 그렇다면 실행기의 스레드 수를 구성하는 방법은 무엇입니까?

  4. 작업자, 집행자 및 집행자 코어 (--total-executor-cores)의 관계는 무엇입니까?

  5. 노드 당 더 많은 작업자가 있다는 것은 무엇을 의미합니까?

업데이트

더 잘 이해하기 위해 예를 들어 봅시다.

예 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 당 몇 개의 스레드가 있습니까? 코어는 몇 개입니까? 응용 프로그램 당 실행자 수는 어떻게 결정됩니까? 항상 노동자 수와 동일합니까?

답변:


274

여기에 이미지 설명을 입력하십시오

Spark는 마스터 / 슬레이브 아키텍처를 사용합니다. 그림에서 볼 수 있듯이 분산 된 많은 작업자 (실행자)와 통신하는 하나의 중앙 조정자 (드라이버)가 있습니다. 드라이버와 각 실행 프로그램은 자체 Java 프로세스에서 실행됩니다.

운전사

드라이버는 기본 메소드가 실행되는 프로세스입니다. 먼저 사용자 프로그램을 작업으로 변환 한 후 실행 프로그램의 작업을 예약합니다.

임원

실행자는 주어진 Spark 작업에서 개별 작업을 실행하는 작업자 노드의 프로세스입니다. Spark 응용 프로그램의 시작 부분에서 시작되며 일반적으로 응용 프로그램의 전체 수명 동안 실행됩니다. 일단 작업을 실행하면 결과를 드라이버로 보냅니다. 또한 블록 관리자를 통해 사용자 프로그램에 의해 캐시되는 RDD를위한 인 메모리 스토리지를 제공합니다.

응용 프로그램 실행 흐름

이를 염두에두고 spark-submit을 사용하여 클러스터에 응용 프로그램을 제출하면 내부적으로 발생합니다.

  1. 독립형 응용 프로그램은 인스턴스를 시작하고 인스턴스화 SparkContext합니다 (응용 프로그램을 드라이버로 호출 할 수있는 경우에만 해당).
  2. 드라이버 프로그램은 실행 프로그램을 시작하기 위해 클러스터 관리자에게 자원을 요청합니다.
  3. 클러스터 관리자가 실행 프로그램을 시작합니다.
  4. 드라이버 프로세스는 사용자 응용 프로그램을 통해 실행됩니다. RDD 작업을 통한 조치 및 변환에 따라 실행 프로그램으로 전송됩니다.
  5. 실행자는 작업을 실행하고 결과를 저장합니다.
  6. 작업자가 충돌하면 작업이 다른 실행 프로그램으로 전송되어 다시 처리됩니다. "Learning Spark : Lightning-Fast Big Data Analysis"책에서 Spark 및 Fault Tolerance에 대해 설명합니다.

Spark는 실패하거나 느린 작업을 다시 실행하여 실패하거나 느린 시스템을 자동으로 처리합니다. 예를 들어, map () 작업의 파티션을 실행하는 노드가 충돌하면 Spark는이를 다른 노드에서 다시 실행합니다. 노드가 충돌하지는 않지만 다른 노드보다 훨씬 느리더라도 Spark는 다른 노드에서 작업의 "추측 적"복사본을 미리 시작하여 완료되면 결과를 얻을 수 있습니다.

  1. 드라이버에서 SparkContext.stop ()을 사용하거나 기본 메소드가 종료 / 크래시되면 모든 실행 프로그램이 종료되고 클러스터 관리자가 클러스터 자원을 해제합니다.

당신의 질문

  1. 실행자가 시작되면 드라이버에 등록한 후 직접 통신합니다. 작업자는 클러스터 관리자에게 리소스 가용성을 알리는 일을 담당합니다.

  2. YARN 클러스터에서는 --num-executors를 사용하여이를 수행 할 수 있습니다. 독립 실행 형 클러스터에서는 spark.executor.cores로 작업하고 작업자에 둘 이상의 실행기를 보유 할 수있는 충분한 코어가없는 한 작업 자당 하나의 실행기를 얻게됩니다. (@JacekLaskowski가 지적했듯이 --num-executors는 더 이상 YARN에서 사용되지 않습니다 https://github.com/apache/spark/commit/16b6d18613e150c7038c613992d80a7828413e66 )

  3. --executor-cores를 사용하여 실행기 당 코어 수를 지정할 수 있습니다.

  4. --total-executor-cores는 애플리케이션 당 최대 실행기 코어 수입니다.

  5. Sean Owen은이 스레드 에서 다음과 같이 말했습니다 . "컴퓨터 당 두 명 이상의 작업자를 실행해야 할 이유가 없습니다." 예를 들어 하나의 시스템에 많은 JVM이 있습니다.

최신 정보

이 시나리오를 테스트 할 수 없었지만 설명서에 따르면 :

예 1 : Spark는 스케줄러가 제공하는만큼 많은 코어 및 실행기를 확보합니다. 결국 8 개의 코어를 가진 5 개의 실행기를 얻게됩니다.

예 2-5 : Spark는 단일 작업자에게 요청한만큼의 코어를 할당 할 수 없으므로 실행 프로그램이 시작되지 않습니다.


감사합니다 @Marco. 따라서 일반적으로 노드 리소스를 관리하기 때문에 작업자의 힙 메모리에 대해 걱정하지 않아도됩니까?
마니 칸탄 칸난

8
정말 좋은 답변입니다! 감사합니다 @Marco. github.com/apache/spark/commit/… --num-executors 에 따라 YARN 에서는 더 이상 사용되지 않습니다.
Jacek Laskowski

1
@Marco는 훌륭한 답변에 감사드립니다. 드라이버가 실행되는 동안 클러스터 관리자의 지속적인 역할을 확장 할 수 있습니까? ... 사용 가능한 리소스를 파악하기 위해 운전자 나 작업자 또는 사고가 발생하거나 응답하지 않는 경우를 처리해야합니다.
Iain

1
자원 배분의 드라이버 연락처를 클러스터 관리자를 @lain 또한 집행을 실행하는 클러스터 MGR을 요청
라빈 Yarram

2
좋은 대답입니다. 당신은 스파크 내부 여기에 대한 자세한 정보를 찾을 수 있습니다 github.com/JerryLead/SparkInternals/blob/master/EnglishVersion/...
아마르 Gajbhiye

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.