리듀서 클래스
중간 데이터를 정렬하고 재분배한 후에는 동일한 키와 관련된 모든 값이 단일 감속기(Reducer 클래스의 동일한 인스턴스)에 의해 처리됩니다, 일반적으로 감속기는 주어진 값을 최종 결과로 집계합니다. 감축 횟수는 중간 데이터의 분포에 따라 결정됩니다. 즉, 프레임워크는 각 데이터 슬라이스에서 하나의 축소 작업을 실행합니다.
<K2, listV2)>* → 감속기 → <K3, V3>*
public void run(Context context) throws IOException,
InterruptedException {
setup(context);
while (context.nextKey()) {
reduce(context.getCurrentKey(), context.getValues(), context);
}
cleanup(context);
}
기본적으로 reduce() 메서드는 입력을 출력으로 내보내며, 동일성 함수처럼 작동하므로 재정의해야 합니다. (고급 사용 사례의 경우 run()을 포함하여 이러한 메서드 중 하나를 재정의할 수 있습니다.)
감속기용 컨텍스트 객체
리듀서는 컨텍스트 객체에 액세스할 수 있으므로 리듀서가 나머지 환경과 상호 작용할 수 있습니다. 감속기 및 기타 메서드에 인수로 전달되는 컨텍스트 객체는 작업의 구성 데이터에 대한 액세스를 제공하고 감속기가 Context.write(key, value) 메서드를 사용하여 출력 쌍을 방출할 수 있도록 합니다.
Context.getConfiguration() 메서드는 실행 중인 맵/리듀스 프로그램에 대한 구성 데이터가 포함된 구성 객체를 반환합니다. 작업에서 임의의 (키, 값) 구성 데이터 쌍을 설정한 다음(예: Job.getConfiguration().set("myKey", "myVal"") 메서드를 사용하여) 감속기에서 이 데이터를 Context.getConfiguration().get("myKey"") 메서드로 검색할 수 있습니다. (이 작업은 일반적으로 감속기의 설정() 메서드에서 수행됩니다.)
Cleanup() 메서드는 주로 재정의됩니다(기본적으로 정리가 수행되지 않음). 모든 입력이 처리된 후 정리를 수행해야 하는 경우 기본값을 재정의하고 주어진 사용 사례에 맞게 설정할 수 있습니다.
작업에 대한 감속기 클래스를 정의할 필요는 없습니다. 클래스를 정의하지 않으면 매퍼의 출력 레코드가 정렬 없이 출력 테이블에 직접 저장되며 파티션 재분배 및 축소 단계가 건너뜁니다).