2016-12-14 106 views
0

我已經編寫了一個MapReduce作業,用於處理一些Protobuf文件作爲輸入。由於文件的性質(無法解析),每個文件都由一個映射器處理(實施定製FileInputFormat,其中isSplitable設置爲false)。該應用程序適用於輸入文件大小小於~680MB並生成結果文件,但是,一旦輸入文件大小超過該限制,應用程序將成功完成,但會生成一個空文件。Hadoop MapReduce中Mapper的最大輸入文件大小(無分割)是多少?

我想知道如果我打印一個Mapper的文件大小的限制?如果重要,這些文件將存儲在Google存儲(GFS)而不是HDFS中。

謝謝!

回答

0

原來我碰到了一個衆所周知的Hadoop bug here。這裏的問題是用於編寫Protobuf文件的BytesWritable類。在自定義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。爲了解決這個問題,我做

value.setCapacity(my_ideal_max_size) 

我做value.set()之前必須手動setCapacity(my_max_size)。

希望這可以幫助別人!

相關問題