YARN에서 Spark 작업을 실행할 때 코어 수와 실행기 수의 관계를 이해하려고합니다.
테스트 환경은 다음과 같습니다.
- 데이터 노드 수 : 3
- 데이터 노드 머신 사양 :
- CPU : 코어 i7-4790 (코어 수 : 4, 스레드 수 : 8)
- RAM : 32GB (8GB x 4)
- HDD : 8TB (2TB x 4)
네트워크 : 1Gb
스파크 버전 : 1.0.0
하둡 버전 : 2.4.0 (Hortonworks HDP 2.1)
Spark 작업 흐름 : sc.textFile-> 필터-> 맵-> 필터-> mapToPair-> reduceByKey-> 맵-> saveAsTextFile
입력 데이터
- 유형 : 단일 텍스트 파일
- 크기 : 165GB
- 라인 수 : 454,568,833
산출
- 두 번째 필터 이후 줄 수 : 310,640,717
- 결과 파일의 라인 수 : 99,848,268
- 결과 파일 크기 : 41GB
작업은 다음 구성으로 실행되었습니다.
--master yarn-client --executor-memory 19G --executor-cores 7 --num-executors 3
(데이터 노드 당 실행기, 코어만큼 사용)--master yarn-client --executor-memory 19G --executor-cores 4 --num-executors 3
(코어 수 감소)--master yarn-client --executor-memory 4G --executor-cores 2 --num-executors 12
(핵심이 적고 집행자가 많음)
경과 시간 :
50 분 15 초
55 분 48 초
31 분 23 초
놀랍게도 (3)이 훨씬 빨랐습니다.
나는 섞을 때 집행 간 의사 소통이 적기 때문에 (1)이 더 빠를 것이라고 생각했다.
(1)의 코어 수는 (3)보다 적지 만 2)가 제대로 수행되었으므로 코어 수는 핵심 요소가 아닙니다.
(pwilmot의 답변 후에 다음이 추가되었습니다.)
정보의 성능 모니터 화면 캡처는 다음과 같습니다.
- (1)에 대한 Ganglia 데이터 노드 요약-작업은 04:37에 시작되었습니다.
- (3)에 대한 Ganglia 데이터 노드 요약-작업은 19:47에 시작되었습니다. 그 시간 전에 그래프를 무시하십시오.
그래프는 크게 두 섹션으로 나뉩니다.
- 첫째 : 시작부터 축소까지 : ByKey : CPU 집약적이며 네트워크 활동이 없음
- 둘째 : reduceByKey 후 : CPU가 낮아지면 네트워크 I / O가 수행됩니다.
그래프에서 볼 수 있듯이 (1)은 주어진만큼의 CPU 전력을 사용할 수 있습니다. 따라서 스레드 수의 문제가 아닐 수 있습니다.
이 결과를 설명하는 방법?