매퍼 또는 감속기를 정의하지 않는 기본지도 축소 작업을 분석하려고했습니다. 난 그냥 내 정체성 감속기 쓴 IdentityMapper & IdentityReducer 를 사용 즉 하나는 자신을 명확하게하기 위해출력 수집기의 작동 방식은 무엇입니까?
public static class MyIdentityReducer extends MapReduceBase implements Reducer<Text,Text,Text,Text> {
@Override
public void reduce(Text key, Iterator<Text> values,
OutputCollector<Text, Text> output, Reporter reporter)
throws IOException {
while(values.hasNext()) {
Text value = values.next();
output.collect(key, value);
}
}
}
내 입력 파일이었다 : 나는 집계가 수행되기 때문에 그 의견
$ hadoop fs -cat NameAddress.txt
Dravid Banglore
Sachin Mumbai
Dhoni Ranchi
Dravid Jaipur
Dhoni Chennai
Sehwag Delhi
Gambhir Delhi
Gambhir Calcutta
I was expecting
Dravid Jaipur
Dhoni Chennai
Gambhir Calcutta
Sachin Mumbai
Sehwag Delhi
I got
$ hadoop fs -cat NameAddress/part-00000
Dhoni Ranchi
Dhoni Chennai
Dravid Banglore
Dravid Jaipur
Gambhir Delhi
Gambhir Calcutta
Sachin Mumbai
Sehwag Delhi
했다 감속기의 while 루프에서 프로그래머가 출력 콜렉터에 기록됩니다. 필자는 감축기의 키가 outputcollector에 전달 된 것은 고유 한 값인 &이므로 여기에 집계하지 않으면 마지막 키의 값이 이전 값보다 우선합니다. 분명히 그 사건이 아닙니다. 누군가가 outputcollector에 대해 더 잘 이해할 수 있었는지, 작동 방식 및 모든 키를 처리하는 방법을 알려주세요. hadoop src 코드에서 outputcollector에 대한 많은 구현을 볼 수 있습니다. 내가 기대하는 것을 할 수있는 내 자신의 outputcollector를 쓸 수 있습니까?
ID 매퍼와 신원 축소기로 기본 입력 형식 (TextInputFormat)을 사용한다고 가정 할 때 TextInputFormat이' '쌍을 출력하므로 위의 축소 기가 실패해야합니다. –
@ Chris-White 네, 이걸 MyJob job.set ("key.value.separator. MyJob")에 추가했습니다. 입력 한 순서와 동일한 순서로 결과를 볼 수 있습니다. 물론 신원 매퍼, 축소 기 및 TextInputFormat을 사용한다고 가정합니다. in.input.line "," "); \t \t \t job.setInputFormat (KeyValueTextInputFormat.class); \t \t \t job.setOutputFormat (TextOutputFormat.class); \t \t \t job.setOutputKeyClass (Text.class); \t \t \t job.setOutputValueClass (Text.class); –
reduce의 출력에는 제한이 없으므로 고유 키가있는 레코드를 생성 할 필요가 없습니다. 따라서 outputcollector는 키를 확인하지 않아도 System.out.println 버전으로 생각할 수 있습니다. – rystsov