2013-07-16 4 views
0

HDFS에 쓰는 대신 감속기 결과를 일반 파일 (예 : .csv 또는 .log 파일)에 쓰고 싶습니다. 그래서 감속기 클래스에 다음 코드를 사용Hadoop에서 일반 파일로 출력 출력

@Override 
public void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException { 

    // Standard algorithm for finding the max value 
    long sum = 0; 
    for (LongWritable value : values) { 
     sum++; 
    } 

    context.write(key, new LongWritable(sum)); 
    System.out.println(key + " : " + sum); 
    Main.map.put(key.toString(), sum); 
} 

그리고 메인 클래스의 csv 파일로지도의 내용을 인쇄 할 수 있습니다. 그러나 감속기를 마친 후에는 파일이 비어 있습니다. 감속기 클래스에서지도에 아무것도 넣지 않았기 때문에지도가 비어있는 것을 알았습니다. 또한 콘솔의 감속기에서 System.out.println (key + ":"+ sum)을 볼 수 없습니다.

어떻게 될 수 있습니까? 감속기 등급으로 가공되지 않았습니까?

+0

정확하게이 작업을 수행하려고합니까? – climbage

+0

예 : 단어 수, hadoop jar word count.jar 입력 출력을 실행합니다. 출력을 HDFS에 쓰는 것을 제외하고 result.log와 같은 로그 파일에 결과를 쓰고 싶습니다.이 result.log는 정확히 같은 것입니다. 출력 파일을 HDFS – user2552010

답변

1

여기에서 문제의 근본 원인을 찾으십시오. 각 맵 또는 축소 작업은 고유 JVM (Java Virtual Machine)에서 실행됩니다. 이러한 JVM은 서로 메모리를 공유하지 않습니다.

당신이 설정 한 다음 한 말할 수 있습니다 :

  • JVM-1 : 감속기 작업 (이것은 JVM입니다 : JobClient는
  • JVM-2 (이 메인 드라이버 클래스입니다) 당신의 감속기는

이 일어나는 것이다)에서 실행되는 :

  1. JVM-1 6,지도가//
  2. JVM-2Main.map<K,V>
  3. 지도에서 항목을두고 작업을 줄이는 작업이 완료 줄이기 시작합니다.
  4. JVM-1 시도는 Main.map<K,V>에서 읽을 수 있지만 JVM-2JVM-1가 표시되지 않습니다 자체 메모리에지도를 작성하기 때문에 아무것도 없다.

비슷한 일이 발생합니다. System.out. 실제로는 stdout 스트림에 연결되어 있지 않을 수 있습니다. 다중 노드 설정이있는 경우 네트워크의 다른 컴퓨터로 출력됩니다.

+0

ok ... 이렇게하면 어떻게해야합니까? 어떻게 감속기 결과를 파일로 인쇄 할 수 있습니까? – user2552010