2016-12-14 5 views
0

Я написал задание MapReduce, которое работает на некоторых файлах Protobuf в качестве входных данных. Из-за характера файлов (нерасщепляемый) каждый файл обрабатывается одним картографом (реализован пользовательский FileInputFormat с isSplitable, установленный на false). Приложение хорошо работает с размерами входных файлов менее ~680MB и создает результирующие файлы, однако, как только размер входного файла пересекает это ограничение, приложение завершается успешно, но создает пустой файл.Каков максимальный размер входного файла (без разделения) для Mapper в Hadoop MapReduce?

Мне интересно, удастся ли мне ограничить размер файла для Mapper? Если это имеет значение, файлы хранятся в Google Storage (GFS), а не в HDFS.

Спасибо!

ответ

0

Оказывается, я столкнулся с известной ошибкой Hadoop, обсуждавшейся here. Здесь был класс BytesWritable, который использовался для записи файлов Protobuf. В обычае RecordReader я ранее сделал

@Override 
public boolean nextKeyValue() throws IOException, InterruptedException { 
    if(!processed){ 
     byte[] contents = new byte[(int) fileSplit.getLength()]; 
     Path file = fileSplit.getPath(); 
     log.debug("Path file:" + file); 
     FileSystem fs = file.getFileSystem(conf); 
     FSDataInputStream in = null; 
     try{ 
      in = fs.open(file); 
      IOUtils.readFully(in, contents, 0, contents.length);  
      value.set(contents, 0, contents.length); 
     }catch(Exception e){ 
      log.error(e); 
     }finally{ 
      IOUtils.closeQuietly(in); 
     } 
     processed = true; 
     return true; 
    } 
    return false; 
} 

По умолчанию, ошибка устанавливает максимальный размер контента INTEGER.MAX_SIZE/3, которая составляет ~ 680MB. Чтобы обойти эту проблему, мне пришлось вручную setCapacity (my_max_size), делая

value.setCapacity(my_ideal_max_size) 

, прежде чем я сделал value.set().

Надеюсь, это поможет кому-то еще!