Hadoop에서 작업 감소는 언제 시작됩니까? 매퍼의 특정 비율 (임계 값)이 완료된 후에 시작됩니까? 그렇다면이 임계 값이 고정되어 있습니까? 일반적으로 어떤 종류의 임계 값이 사용됩니까?
답변:
축소 단계에는 셔플, 정렬, 축소의 3 단계가 있습니다. Shuffle은 감속기가 각 매퍼에서 데이터를 수집하는 곳입니다. 이는 데이터 전송 일 뿐이므로 매퍼가 데이터를 생성하는 동안 발생할 수 있습니다. 반면 정렬 및 축소는 모든 매퍼가 완료된 후에 만 시작할 수 있습니다. 감속기 완료율을 보면 MapReduce가 어떤 작업을 수행하는지 알 수 있습니다. 0-33 %는 셔플을 수행하고 34-66 %는 정렬, 67 % -100 %는 감소를 의미합니다. 이것이 당신의 감속기가 때때로 33 %에서 "고정"된 것처럼 보이는 이유입니다. 매퍼가 완료되기를 기다리고 있습니다.
감속기는 완료된 매퍼 비율의 임계 값을 기반으로 셔플 링을 시작합니다. 감속기가 조만간 시작되도록 매개 변수를 변경할 수 있습니다.
감속기를 일찍 시작하는 것이 좋은 이유는 무엇입니까? 시간이 지남에 따라 매퍼에서 리듀서로 데이터 전송이 분산되기 때문에 네트워크에 병목 현상이 발생하는 경우 유용합니다.
감속기를 일찍 시작하는 것이 왜 나쁜 일입니까? 그들은 데이터를 복사하고 매퍼가 완료 될 때까지 기다리는 동안 슬롯을 줄이기 때문에 "호그 업"합니다. 실제로 축소 슬롯을 사용하는 나중에 시작되는 다른 작업은 이제이를 사용할 수 없습니다.
mapred.reduce.slowstart.completed.maps
in 의 기본값을 변경하여 감속기가 시작되는시기를 사용자 지정할 수 있습니다 mapred-site.xml
. 값은 1.00
감속기를 시작하기 전에 모든 매퍼가 완료되기를 기다립니다. 값은 0.0
감속기를 즉시 시작합니다. 값은 0.5
매퍼의 절반이 완료 될 때 감속기를 시작합니다. mapred.reduce.slowstart.completed.maps
직업별로 변경할 수도 있습니다 . 새 버전의 Hadoop (최소 2.4.1)에서는이 매개 변수가 호출됩니다mapreduce.job.reduce.slowstart.completedmaps
(yegor256 사용자에게 감사합니다).
일반적으로 시스템에 한 번에 여러 작업이 실행되는 경우 mapred.reduce.slowstart.completed.maps
위 를 유지하고 싶습니다 0.9
. 이런 식으로 작업은 데이터를 복사하는 것 외에는 아무것도하지 않을 때 감속기를 잡아 먹지 않습니다. 한 번에 하나의 작업 만 실행하는 경우 수행하는 0.1
것이 적절할 것입니다.
감소 단계는 감속기가 호출되기 오래 전에 시작할 수 있습니다. "a"매퍼가 작업을 완료하자마자 생성 된 데이터는 일부 정렬 및 셔플 링 (결합기 및 파티 셔너 호출 포함)을 거칩니다. 감속기 "단계"는 매퍼 데이터 처리 후 시작되는 순간 시작됩니다. 이러한 처리가 완료되면 감속기 비율의 진행 상황을 볼 수 있습니다. 그러나 아직 리듀서가 호출되지 않았습니다. 사용 가능한 / 사용 된 프로세서의 수, 데이터의 특성 및 예상되는 리듀서의 수에 따라 위의 @ Donald-miner에서 설명한대로 매개 변수를 변경할 수 있습니다.
내가 이해하는 한 축소 단계는지도 단계에서 시작하고지도에서 레코드를 계속 사용합니다. 그러나 맵 단계 이후에 정렬 및 셔플 단계가 있으므로 모든 출력을 정렬하여 감속기로 보내야합니다. 따라서 논리적으로 감소 단계는 맵 단계 이후에만 시작되지만 실제로 성능상의 이유로 감속기는 매퍼로 초기화됩니다.
맵 축소 작업이 어떻게 작동하는지 더 잘 이해하기 위해 WordCount 예제를 고려하십시오. 우리가 큰 파일, 예를 들어 소설을 가지고 있고 우리의 작업은 파일에서 각 단어가 발생하는 횟수를 찾는 것입니다. 파일이 크기 때문에 다른 블록으로 분할되어 다른 작업자 노드에 복제 될 수 있습니다. 단어 개수 작업은지도와 축소 작업으로 구성됩니다. 맵 태스크는 각 블록을 입력으로 받아 중간 키-값 쌍을 생성합니다. 이 예에서는 단어의 발생 횟수를 계산하므로 블록을 처리하는 동안 매퍼는 (word1, count1), (word2, count2) 등의 형식의 중간 결과를 생성합니다. 모든 매퍼의 중간 결과는 다음과 같습니다. 중간 결과를 재정렬하는 셔플 단계를 통과했습니다.
다른 매퍼의지도 출력이 다음 형식이라고 가정합니다.
맵 1 :-(is, 24) (was, 32) (and, 12)
Map2 :-(my, 12) (is, 23) (was, 30)
맵 출력은 동일한 리듀서에 동일한 키 값이 제공되는 방식으로 정렬됩니다. 여기서는에 해당하는 키가 is, was etc 동일한 감속기로 이동한다는 것을 의미합니다. 최종 출력을 생성하는 감속기입니다.이 경우에는 다음과 같습니다. ) (이전, 62)
Reducer 작업 completion
은 모든 매퍼 이후에만 시작됩니다 .
그러나 데이터 전송은 each
Map 이후에 발생합니다 . 실제로는 당기기 작업입니다.
즉, Reducer는 모든 maptask에 Map에서 검색 할 데이터가 있는지 묻고 매퍼가 작업을 완료 한 경우 Reducer는 중간 데이터를 가져옵니다.
Mapper의 중간 데이터는에 저장됩니다 disk
. Mapper에서 Reduce 로의 데이터 전송은 네트워크를 통해 이루어집니다 ( Data Locality
Reduce 단계에서는 보존되지 않음).