Mapduce在big gz文件上

时间:2015-04-23 12:39:33

标签: hadoop mapreduce hdfs bzip2 gz

我有一个大小约为120GB的大gz文件。我想在其上运行mapreduce,但由于gz文件不可拆分,因此只有一个映射器能够一次处理该文件。该文件存在于hdfs和local都存在。 可能的选择我在想:

1)解压缩该gz文件并将其存储在hdfs中:首先,解压缩文件并将解压缩数据放入hdfs需要花费太多时间。另外我无法直接在hdfs中解压缩文件,因为hdfs没有zcat或gunzip命令。所以我必须做zcat a.gz | hdfs dfs put - /path/in/hdfs。 这也将占用hdfs中的大量空间(大约是gz的4倍)

2)将文件分成小文件(每个大约1GB)并对它们进行处理:最佳选择,但遗憾的是无法正常工作。我正在使用split命令将大文件拆分成小文件(也试过cat a.gz | head -n),但是当我在它们上运行mapper时我收到错误

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)

1 个答案:

答案 0 :(得分:2)

我认为你可以使用选项3.压缩Bzip2中的文件可以直接在mapreduce作业中使用它。由于Bzip2是可拆分的,你不需要手动将其拆分为1GB文件(如在你的选项2中)并对它们进行处理,hadoop无论如何都必须将它们存储到指定大小的块中并对配置的输入拆分进行处理。因此,进行将文件压缩为Bzip2的预处理应该可以正常工作。