2017-11-22 11 views
0

mappers가 데이터를 셔플 링하기 전에 노드 로컬 디스크에 출력을 기록한다는 것을 알고 있습니다. 그런데 왜 데이터를 직접 해당하는 감속기 (즉석에서 뒤섞음)에 보내고 감속기가 일종의 나머지 작업을 수행하도록 할 수는 없습니다.mapreduce에서 매퍼가 출력 키 값을 네트워크를 통해 축소기에 직접 보내지 않는 이유는 무엇입니까?

나는 지역 상점에서 좋은 점을 생각 해왔다. 첫 번째 데이터는 디스크에 유지되지만 한 매퍼가 실패하더라도 이미 보존 된 중간 키 - 값이 지워지고 다른 매퍼가 처음부터 시작됩니다. 두 번째로는 대역폭 고려 사항이지만 데이터는 최종적으로 감속기로 전송됩니다. 우리는 블록 단위로 네트워크 오버 헤드를 줄이기 위해 보낼 수 있습니다.

아마도 핵심 이유는 병합 정렬 프로세스에 있습니다. 데이터가 감속기로 전송되기 전에 정렬되지 않으면 병목 현상이 발생할 수 있습니다.

+0

당신은 최적화를 만드는 것을 가리키며 그것은 내 친구를 화나게했다 : D – KrazyGautam

답변

2

왜 데이터를 직접 해당 감속기로 보내고 (즉석에서 셔플 할 수 있습니까?) 감속기가 정렬 및 휴식을하도록 허용 할 수없는 이유는 무엇입니까?

키 - 값 쌍이 감소기에 도착하면 셔플 및 정렬은 의미가 없습니다. 축소 기가 입력을 받기 전에 셔플 링 및 정렬이 수행됩니다. 대기 시간을 절약하기 위해 감속 기가 시작되기 전에 시작됩니다. 저장된 키 - 값 쌍은이 단계의 초기 시작 결과입니다. 매퍼가 완료되면 그룹화 작업이 감속기 작업 할당량을 채울 때 감속기를 시작하기 위해 즉시 전달됩니다. 그리고 다른 감속기에 도착하는 동일한 키를 피하기 위해 정렬은 전역 적입니다.

나는 지역 상점에서 좋은 점을 생각해 왔습니다.

로컬 저장소의 의미를 확실하지 않습니다. 그러나 기본적으로 HDFS은 (1) 디스크 오류의 위험을 허용하고 (2) 매퍼의 첫 번째 레이어를보다 유연하게 할당 할 수 있도록 여러 노드의 데이터를 복제합니다. 읽기는 항상 매퍼의 레이어입니다.

첫 번째 데이터는 디스크에 유지되지만 한 매퍼가 실패해도 이미 보존 된 중간 키 - 값이 지워지고 다른 매퍼가 처음부터 시작됩니다.

매퍼 프로세스는 포인터를 자신의 출력에 보관하지 않습니다. 10 줄의 입력을 처리 한 후, 매퍼는 키 - 값 쌍 중 97 줄을 작성했다고 가정 해 봅시다. 그런 다음 매퍼는 3 번째 추가 키 - 값 쌍을 작성한 후 11 번째 입력 줄을 처리하는 동안 충돌합니다. 매퍼는 11 번째 줄의 구문 분석이 시작되기 전에 97 줄을 썼음을 모릅니다. 그것은 되돌릴 수 없습니다.

참고 : 일부 설정으로이 역 추적이 가능할 수 있습니다. 나는 잘 모르겠다.

두 번째로 대역폭 고려 사항이 있지만 데이터가 결국에는 감속기로 전송됩니다. 우리는 블록 단위로 네트워크 오버 헤드를 줄이기 위해 보낼 수 있습니다. 당신이 들어오는 키 - 값 쌍은 일찍 보내려는 블록에 속하지 않는 확인 할 수 없기 때문에

다시 말하지만, 당신은 모든 매퍼 완료하기 전에 데이터를 보낼 수 없습니다.

+0

고마워요. 매우 정교하고 유용합니다. 모든 매퍼가 완료되기 전에 감속기를 시작하여 데이터를 보낼 감속기가 없어야합니다. – user1206899