我有一個大小約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)