복붙노트

[HADOOP] Apache Spark - spark의 내부 작업 스케줄러는 사용자 란 무엇이며 풀은 무엇인지 정의합니다

HADOOP

Apache Spark - spark의 내부 작업 스케줄러는 사용자 란 무엇이며 풀은 무엇인지 정의합니다

여기에 약간의 장군님이 된 것에 대해 유감스럽게 생각합니다. 그러나 저는 작업 스케쥴이 내부적으로 어떻게 작동하는지에 대해 약간 혼란 스럽습니다. 이 문서에서 Hadoop Fair Scheduler 구현의 일종이라는 것을 알게되었습니다.

나는 누가 리눅스 사용자, hadoop 사용자, 스파크 클라이언트인가 정확히 누가 여기에 있는지 이해하기 위해 돌아올 수 없다. 또한 여기에 정의 된 풀이 어떻게되는지 이해할 수 없습니다. 예를 들어, 내 hadoop 클러스터에서 두 개의 다른 풀에 자원 할당을했습니다 (팀 1과 팀 2라고 부름). 그러나 스파크 클러스터에서는 다른 풀과 사용자가 자신의 스파크 컨텍스트를 인스턴스화하지 않을까요? 다시 spark.scheduler.pool에 속성을 설정할 때 어떤 매개 변수가 전달되는지 질문하는 것입니다.

드라이버가 스파크 컨텍스트를 인스턴스화 한 다음 작업 및 작업으로 나누는 방법에 대한 기본적인 이해가 있습니다. 5 월에 완전히 그 지점을 놓치고 있을지 모르지만 Spark의 내부 스케줄러가 작업, 작업 및 작업의 맥락에서 어떻게 작동하는지 이해하고 싶습니다.

해결법

  1. ==============================

    1.기본적으로 Spark은 작업이 FIFO 방식으로 실행되는 FIFO 스케줄러와 함께 작동합니다.

    기본적으로 Spark은 작업이 FIFO 방식으로 실행되는 FIFO 스케줄러와 함께 작동합니다.

    그러나 YARN에 클러스터가 있다면 YARN은 Pluggable Scheduler가 있습니다. YARN에서는 원하는 스케줄러를 사용할 수 있습니다. CDH에 의해 배포 된 YARN을 사용하고 있다면 deafult를 사용하여 FAIR 스케줄러를 갖지만 Capacity Scheduler를 사용할 수도 있습니다.

    HDP로 배포되는 YARN을 사용하는 경우 기본적으로 용량 스케줄러가 필요하며 필요한 경우 공정으로 이동할 수 있습니다.

    스케줄러가 스파크와 어떻게 작동합니까?

    나는 당신이 원숭이에 당신의 스파크 클러스터를 가지고 있다고 가정하고 있습니다.

    spark에서 작업을 제출하면 리소스 관리자를 먼저 친다. 이제 자원 관리자가 모든 스케줄링 및 자원 할당을 담당합니다. 그래서 Hadoop에서 일자리를 제출하는 것과 기본적으로 동일합니다.

    스케줄러는 어떻게 작동합니까?

    공정한 일정 관리는 모든 작업이 시간이 지남에 따라 평균적으로 동등한 리소스를 얻도록 작업에 리소스를 할당하는 방법입니다. 실행중인 단일 작업이 있으면 해당 작업은 전체 클러스터를 사용합니다. 다른 작업이 제출되면 사용 가능한 작업 슬롯이 새 작업에 할당되므로 각 작업의 CPU 사용 시간이 대략 같아집니다 (선점 작업을 통해 사용 된 모든 작업이 종료 됨). 작업 대기열을 형성하는 기본 Hadoop 스케줄러 (FIFO)와는 달리, 이것은 짧은 작업을 합리적인 시간 내에 마칠 수 있고 긴 작업을 굶어 죽게하지는 않습니다. 또한 여러 사용자간에 클러스터를 공유하는 것도 합리적입니다. 마지막으로, 공정한 공유는 작업 우선 순위와 함께 작동 할 수도 있습니다. 우선 순위는 가중치로 사용되어 각 작업에 필요한 전체 계산 시간의 비율을 결정합니다.

    CapacityScheduler는 각 조직에 최소 용량 보장을 제공하면서 대규모 클러스터를 공유 할 수 있도록 설계되었습니다. 중앙 아이디어는 Hadoop Map-Reduce 클러스터의 사용 가능한 리소스가 컴퓨팅 요구에 따라 클러스터에 집합 적으로 자금을 공급하는 여러 조직으로 분할된다는 것입니다. 조직이 다른 사람이 사용하지 않는 초과 용량에 액세스 할 수 있다는 부가적인 이점이 있습니다. 이는 비용 효과적인 방식으로 조직에 탄력성을 제공합니다.

  2. ==============================

    2.Spark는 내부적으로 FIFO / FCFS 작업 스케줄러를 사용합니다. 그러나 작업에 대해 이야기 할 때 라운드 로빈 방식으로 작동합니다. 우리가 아래의 예에 집중한다면 그것은 분명 할 것입니다 :

    Spark는 내부적으로 FIFO / FCFS 작업 스케줄러를 사용합니다. 그러나 작업에 대해 이야기 할 때 라운드 로빈 방식으로 작동합니다. 우리가 아래의 예에 집중한다면 그것은 분명 할 것입니다 :

    Spark 자체 대기열에서 첫 번째 작업이 클러스터의 모든 리소스를 활용할 필요는 없다고 가정합니다. 그래서 즉시 대기열의 두 번째 작업이 실행되기 시작합니다. 이제는 두 작업이 동시에 실행됩니다. 각 작업에는 전체 작업을 실행하기 위해 실행할 작업이 거의 없습니다. 첫 번째 작업은 10 개의 작업을 할당하고 두 번째 작업은 8을 할당한다고 가정합니다. 그러면이 18 개의 작업은 전체 클러스터의 CPU주기를 선점 방식으로 공유합니다. 추가 드릴 다운을 원할 경우 집행자와 함께 시작하십시오.

    클러스터에 집행 인은 거의 없습니다. 따라서 숫자가 6이라고 가정합니다. 따라서 이상적인 조건에서 각 실행자에게는 3 개의 작업이 할당되고 3 개의 작업에는 실행 프로그램 (별도의 JVM)의 동일한 CPU 시간이 부여됩니다.

    이것은 스파크가 내부적으로 작업을 예약하는 방법입니다.

  3. ==============================

    3.나는 공식 문서를 아주 철저하게 찾고 모든 질문을 다루고있다. 그러나 처음부터 소화하기가 어려울 수도 있습니다.

    나는 공식 문서를 아주 철저하게 찾고 모든 질문을 다루고있다. 그러나 처음부터 소화하기가 어려울 수도 있습니다.

    우리가 세부 사항을 탐구하기 전에 몇 가지 정의와 거친 아날로그를 넣자. 응용 프로그램은 SparkContext sc를 생성하며 spark-submit을 사용하여 배포하는 것으로 참조 될 수 있습니다. 일은 변신과 행동을 정의하는 행동으로 카운트, 수집 등을 의미합니다.

    어떤 두 가지 주제가 있는데, 두 가지 주제가 있습니다 : 응용 프로그램 간 스케줄링 및 응용 프로그램 내에서의 스케줄링. 전자는 Spark Standalone FIFO only 모드와 정적 및 동적 할당의 개념을 포함하여 Resource Manager에 더 많은 관련이 있습니다.

    나중에, Spark within Scheduling 어플리케이션은 당신의 의견에서 알 수 있듯이 질문의 문제입니다. 어떤 추상화 수준에서 어떤 일이 일어나는지 설명하려고 노력하겠습니다.

    애플리케이션을 제출했고 두 가지 작업이 있다고 가정 해 보겠습니다.

    sc.textFile("..").count()   //job1
    sc.textFile("..").collect() //job2
    

    이 코드가 동일한 스레드에서 실행되면 여기서 흥미로운 점이 전혀 없으며 job2와 모든 작업은 job1이 완료된 후에 만 ​​자원을 얻습니다.

    이제 다음과 같이 말합니다.

    thread1 { job1 }
    thread2 { job2 } 
    

    이것은 흥미 로워지고있다. 기본적으로 응용 프로그램 스케줄러에서 스케줄러에게 첫 번째로 나타나는 작업의 모든 작업에 자원을 할당하기 위해 FIFO를 사용합니다. 다른 작업에 대한 작업은 여분의 코어가 있고 우선 순위가 더 높은 첫 번째 작업의 보류중인 작업이없는 경우에만 자원을 얻습니다.

    이제 응용 프로그램에 대해 spark.scheduler.mode = FAIR을 설정했다고 가정합니다. 지금부터는 각 직무에 속한 풀의 개념이 있습니다. 아무것도하지 않으면 모든 작업 풀 레이블이 "기본값"입니다. 작업 레이블을 설정하려면 다음을 수행하십시오.

    sc.setLocalProperty("spark.scheduler.pool", "pool1").textFile("").count() // job1
    sc.setLocalProperty("spark.scheduler.pool", "pool2").textFile("").collect() // job2
    

    한 가지 중요한 점은 setLocalProperty는 스레드 당뿐만 아니라 모든 생성 된 스레드에도 유효하다는 것입니다. 우리에게 어떤 의미입니까? 만약 당신이 같은 스레드 안에 있으면 작업이 하나씩 차례로 실행될 때 아무런 의미가 없습니다. 그러나 일단 다음과 같이하면

    thread1 { job1 } // pool1
    thread2 { job2 } // pool2
    

    job1과 job2는 자원 할당과 관련이 없습니다. 일반적으로, minshare> 0으로 fairscheduler 파일에서 각 풀을 올바르게 구성하면 다른 풀의 작업에 진행할 리소스가 있음을 확신 할 수 있습니다.

    그러나 더 멀리 갈 수 있습니다. 기본적으로 각 풀 작업은 FIFO 방식으로 큐에 대기하며이 상황은 기본적으로 FIFO 모드와 다른 스레드의 작업이있는 시나리오와 같습니다. 그것을 변경하려면 FAIR 를 갖도록 xml 파일의 풀을 변경해야합니다.

    이 점을 감안할 때 spark.scheduler.mode = FAIR을 설정하고 모든 작업을 동일한 "기본"풀로 분류하면 기본 spark.scheduler.mode = FIFO를 사용하는 경우와 거의 같고 작업이 다른 스레드에서 시작됩니다. 만약 당신이 여전히 단지 "기본"공정한 풀을 원한다면 그것을 반영하기 위해 xml 파일의 "기본"풀에 대한 설정을 변경하십시오.

    풀의 메커니즘을 이용하려면 "spark.scheduler.pool"을 적절한 스레드에서 적절한 값으로 설정하는 것과 같은 사용자 개념을 정의해야합니다. 예를 들어 응용 프로그램이 JMS를 청취하는 경우 메시지 프로세서는 내용에 따라 각 메시지 처리 작업의 풀 레이블을 설정할 수 있습니다.

    결국 단어의 수가 공식적인 의사보다 작 으면 좋겠지 만 잘하면 도움이 될 것입니다. :)

  4. from https://stackoverflow.com/questions/29831630/apache-spark-how-does-internal-job-scheduler-in-spark-define-what-are-users-an by cc-by-sa and MIT license