2014-02-18 1 views
0

Я недавно начал возиться с Hadoop и только создал свой собственный inputformat для обработки PDF-файлов.Custom RecordReader инициализируется не называется

По какой-то причине мой пользовательский класс RecordReader не имеет вызванного метода инициализации. (проверял его с помощью sysout, потому что я не настроил среду отладки)

Я бегу hadoop 2.2.0 на windows 7 32bit. Делая мои звонки с пряжей банкой, так как Hadoop банк прослушиваются под окнами ...

import ... 

public class PDFInputFormat extends FileInputFormat<Text, Text> 
{ 


     @Override 
     public RecordReader<Text, Text> getRecordReader(InputSplit arg0, 
       JobConf arg1, Reporter arg2) throws IOException 
       { 
        return new PDFRecordReader(); 
       } 

     public static class PDFRecordReader implements RecordReader<Text, Text> 
     { 

      private FSDataInputStream fileIn; 
      public String fileName=null; 
      HashSet<String> hset=new HashSet<String>(); 

      private Text key=null; 
      private Text value=null; 

      private byte[] output=null; 
      private int position = 0; 

      @Override 
      public Text createValue() { 
       int endpos = -1; 
       for (int i = position; i < output.length; i++){ 
        if (output[i] == (byte) '\n') { 
         endpos = i; 
        } 
       } 
       if (endpos == -1) { 
        return new Text(Arrays.copyOfRange(output,position,output.length)); 
       } 
       return new Text(Arrays.copyOfRange(output,position,endpos)); 
      } 

      @Override 
      public void initialize(InputSplit genericSplit, TaskAttemptContext job) throws 
      IOException, InterruptedException 
      { 
       System.out.println("initialization is called"); 
       FileSplit split=(FileSplit) genericSplit; 
       Configuration conf=job.getConfiguration(); 

       Path file=split.getPath(); 
       FileSystem fs=file.getFileSystem(conf); 
       fileIn= fs.open(split.getPath()); 

       fileName=split.getPath().getName().toString(); 

       System.out.println(fileIn.toString()); 

       PDDocument docum = PDDocument.load(fileIn); 

       ByteArrayOutputStream boss = new ByteArrayOutputStream(); 
       OutputStreamWriter ow = new OutputStreamWriter(boss); 

       PDFTextStripper stripper=new PDFTextStripper(); 
       stripper.writeText(docum, ow); 
       ow.flush(); 

       output = boss.toByteArray(); 

      } 
     } 


} 

ответ

1

Как я понял это прошлой ночью, и я мог бы помочь кому-то еще с этим:

RecordReader является устаревшим интерфейсом Hadoop (hadoop.common.mapred), и это на самом деле не содержит метод инициализации, который объясняет, почему он не вызван автоматически.

Расширение класса RecordReader в hadoop.common.mapreduce позволяет расширить метод инициализации этого класса.

0

System.out.println() не может помочь во время выполнения задания. Для того, чтобы убедиться, что ваш initialize() называется или не пытаться бросить некоторые RuntimeException там, как показано ниже:

@Override 
      public void initialize(InputSplit genericSplit, TaskAttemptContext job) throws 
      IOException, InterruptedException 
      { 
       throw new NullPointerException("inside initialize()"); 
       .... 

Это, безусловно, делать.

+0

Справедливо, хотя я использовал sysout в других методах в одном классе, поэтому я ожидал бы, что он также будет работать. – zim