2012-10-06 3 views
0

매퍼 또는 감속기를 정의하지 않는 기본지도 축소 작업을 분석하려고했습니다. 난 그냥 내 정체성 감속기 쓴 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를 쓸 수 있습니까?

+0

ID 매퍼와 신원 축소기로 기본 입력 형식 (TextInputFormat)을 사용한다고 가정 할 때 TextInputFormat이' '쌍을 출력하므로 위의 축소 기가 실패해야합니다. –

+0

@ 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); –

+0

reduce의 출력에는 제한이 없으므로 고유 키가있는 레코드를 생성 할 필요가 없습니다. 따라서 outputcollector는 키를 확인하지 않아도 System.out.println 버전으로 생각할 수 있습니다. – rystsov

답변

1

키는 감속기에 대해 고유하며 감속기에 대한 각 호출에는 고유 한 키 값과 해당 키와 관련된 모든 값의 반복 가능이 있습니다. 당신이하는 일은 각각 전달 된 모든 값을 반복하고 각 값을 쓰는 것입니다.

따라서 귀하의 경우 데이터보다 전화 수가 적을 수도 있습니다. 당신은 여전히 ​​결국 모든 가치를 쓰게됩니다.

+0

제 질문을 수정했습니다. 감속기 키는 항상 고유하며 값 목록을 포함합니다. 이 모든 것들이 키, 값으로 outputcollector에 쓰여지는 것을 알고 싶다면 outputcollector가 유일성을 검사하지 않습니까? 그것을 확인하는 outputcollector가 있습니까? 그리고 내 mapreduce 작업에 대한 특정 outputcollector를 선택하는 방법 –

+0

고유성을 원하면 구현자가 필요로하는 first/last/min/max 등 원하는지를 감속기에 구현해야합니다. –

관련 문제