2015-04-23 101 views
2

我有一個大小約120GB的gz文件。我想運行mapreduce,但由於gz文件不可拆分,只有一個映射器能夠一次處理該文件。該文件存在於hdfs和本地文件中。 可能的選擇我在想:Mapreduce上大gz文件

1)解壓縮gz文件並將其存儲在hdfs中:首先,需要太多時間來解壓縮文件並將解壓縮數據放入hdfs中。此外,我不能直接在hdfs中解壓文件,因爲hdfs沒有zcat或gunzip命令。所以我必須做zcat a.gz | hdfs dfs put - /path/in/hdfs。 也需要這麼多的空間在hdfs(約4倍於gz)

2)將文件分成小文件(每個大約1GB)並對它們進行處理:最好的選擇,但不幸的是不工作。我分裂的大文件到採用分體式命令小檔案(也試過貓a.gz |頭-N),但是當我在其上運行映射器我得到錯誤

Error: java.io.EOFException: Unexpected end of input stream 
    at org.apache.hadoop.io.compress.DecompressorStream.decompress(DecompressorStream.java:145) 
    at org.apache.hadoop.io.compress.DecompressorStream.read(DecompressorStream.java:85) 
    at java.io.InputStream.read(InputStream.java:101) 
    at org.apache.hadoop.util.LineReader.fillBuffer(LineReader.java:180) 
    at org.apache.hadoop.util.LineReader.readDefaultLine(LineReader.java:216) 
    at org.apache.hadoop.util.LineReader.readLine(LineReader.java:174) 
    at org.apache.hadoop.mapreduce.lib.input.LineRecordReader.nextKeyValue(LineRecordReader.java:185) 
    at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:553) 
    at org.apache.hadoop.mapreduce.task.MapContextImpl.nextKeyValue(MapContextImpl.java:80) 
    at org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.nextKeyValue(WrappedMapper.java:91) 
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144) 
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:784) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) 
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:415) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1642) 
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:163) 

3)解壓縮文件並然後再壓縮到bzip2中:這也需要很長時間。

請給我建議任何其他的想法來實現這一目標或修改任何上述三種方法來獲得成功(我更喜歡第二個方法:P)

回答

2

我認爲你可以選擇3去壓縮文件在Bzip2中給出了直接在mapreduce作業中使用它的優點。由於Bzip2是可拆分的,您不需要手動將其拆分爲1GB文件(如您的選項2)並對其進行處理,hadoop無論如何都必須將它們存儲到指定大小的塊中,並在所配置的輸入拆分處理。因此,將文件壓縮到Bzip2的預處理應該可以正常工作。