복붙노트

[HADOOP] 하둡 + 쓰기 가능한 인터페이스 + readFields의 감속기는 예외를 발생

HADOOP

하둡 + 쓰기 가능한 인터페이스 + readFields의 감속기는 예외를 발생

나는 다음과 같이 내지도 및 프리미티브를 줄일 수있는 간단한지도-감소 프로그램이

지도 (K, V) = (텍스트, OutputAggregator) 감소 (텍스트, OutputAggregator) = (텍스트, 텍스트)

중요한 점은 내지도 기능에서 I는 쓰기 가능한 인터페이스를 구현하는 내 자신의 클래스 형 OutputAggregator의 객체를 방출한다는 것이다. 그러나, 감소의 나 다음과 같은 예외와 함께 실패합니다. 구체적으로는, readFieds () 함수는 예외를 발생한다. 어떤 단서 이유는 무엇입니까? 나는 하둡 0.18.3를 사용

10/09/19 04:04:59 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
10/09/19 04:04:59 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
10/09/19 04:04:59 INFO mapred.FileInputFormat: Total input paths to process : 1
10/09/19 04:04:59 INFO mapred.FileInputFormat: Total input paths to process : 1
10/09/19 04:04:59 INFO mapred.FileInputFormat: Total input paths to process : 1
10/09/19 04:04:59 INFO mapred.FileInputFormat: Total input paths to process : 1
10/09/19 04:04:59 INFO mapred.JobClient: Running job: job_local_0001
10/09/19 04:04:59 INFO mapred.MapTask: numReduceTasks: 1
10/09/19 04:04:59 INFO mapred.MapTask: io.sort.mb = 100
10/09/19 04:04:59 INFO mapred.MapTask: data buffer = 79691776/99614720
10/09/19 04:04:59 INFO mapred.MapTask: record buffer = 262144/327680
Length = 10
10
10/09/19 04:04:59 INFO mapred.MapTask: Starting flush of map output
10/09/19 04:04:59 INFO mapred.MapTask: bufstart = 0; bufend = 231; bufvoid = 99614720
10/09/19 04:04:59 INFO mapred.MapTask: kvstart = 0; kvend = 10; length = 327680
gl_books
10/09/19 04:04:59 WARN mapred.LocalJobRunner: job_local_0001
java.lang.NullPointerException
 at org.myorg.OutputAggregator.readFields(OutputAggregator.java:46)
 at org.apache.hadoop.io.serializer.WritableSerialization$WritableDeserializer.deserialize(WritableSerialization.java:67)
 at org.apache.hadoop.io.serializer.WritableSerialization$WritableDeserializer.deserialize(WritableSerialization.java:40)
 at org.apache.hadoop.mapred.Task$ValuesIterator.readNextValue(Task.java:751)
 at org.apache.hadoop.mapred.Task$ValuesIterator.next(Task.java:691)
 at org.apache.hadoop.mapred.Task$CombineValuesIterator.next(Task.java:770)
 at org.myorg.xxxParallelizer$Reduce.reduce(xxxParallelizer.java:117)
 at org.myorg.xxxParallelizer$Reduce.reduce(xxxParallelizer.java:1)
 at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.combineAndSpill(MapTask.java:904)
 at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.sortAndSpill(MapTask.java:785)
 at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.flush(MapTask.java:698)
 at org.apache.hadoop.mapred.MapTask.run(MapTask.java:228)
 at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:157)
java.io.IOException: Job failed!
 at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1113)
 at org.myorg.xxxParallelizer.main(xxxParallelizer.java:145)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at org.apache.hadoop.util.RunJar.main(RunJar.java:155)
 at org.apache.hadoop.mapred.JobShell.run(JobShell.java:54)
 at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
 at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79)
 at org.apache.hadoop.mapred.JobShell.main(JobShell.java:68)

해결법

  1. ==============================

    1.사용자 지정 코드에 대한 질문을 게시하는 경우 : 코드의 관련 부분을 게시합니다. 그래서 라인 (46)의 내용과 전에 몇 줄 & 정말 도움이 후 ... :)

    사용자 지정 코드에 대한 질문을 게시하는 경우 : 코드의 관련 부분을 게시합니다. 그래서 라인 (46)의 내용과 전에 몇 줄 & 정말 도움이 후 ... :)

    그러나이 도움이 될 수 있습니다 :

    자신의 쓰기 가능한 클래스를 작성하는 함정은 하둡은 또 다시 클래스의 실제 인스턴스를 재사용한다는 사실이다. readFields의 호출 사이에 당신은 빛나는 새로운 인스턴스를하지 않습니다.

    그래서 readFields의 방법의 시작에 당신은 당신이 "쓰레기"로 가득에있는 개체를 가정해야 계속하기 전에 삭제해야합니다.

    당신에게 나의 제안은 완전히 현재 인스턴스를 버리고 그것을 만들고 생성자가 완료 후에 순간에있을 것입니다 상태로 재설정는 "분명 ()"방법을 구현하는 것입니다. 그리고 물론 당신은 키와 값 모두에 대한 귀하의 readFields의에 제일 먼저 같은 메소드를 호출합니다.

    HTH

  2. ==============================

    2.닐스 Basjes 답변에 추가 : 그냥, 예컨대을 (그렇지 않으면 하둡은 개체를 초기화하기 수 없습니다, 당신이 제공해야) 빈 생성자 내에서 멤버 변수를 초기화 :

    닐스 Basjes 답변에 추가 : 그냥, 예컨대을 (그렇지 않으면 하둡은 개체를 초기화하기 수 없습니다, 당신이 제공해야) 빈 생성자 내에서 멤버 변수를 초기화 :

    public OutputAggregator() {
        this.member = new IntWritable();
        ...
    }
    

    그 this.member 가정하면 IntWritable 형이다.

  3. from https://stackoverflow.com/questions/3746581/hadoop-writable-interface-readfields-throws-an-exception-in-reducer by cc-by-sa and MIT license