hadoop - 大 gz 文件上的 Mapreduce

标签 hadoop mapreduce hdfs bzip2 gzip

我有一个大约 120GB 的大 gz 文件。我想对其运行 mapreduce,但由于 gz 文件不可分割,因此只有一个映射器能够同时处理该文件。该文件存在于 hdfs 和本地。 我正在考虑的可能选择:

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),但是当我在它们上运行映射器时,我收到错误

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)

最佳答案

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

关于hadoop - 大 gz 文件上的 Mapreduce,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29823754/

相关文章:

hadoop - Hadoop MapReduce:具有固定数量的输入文件?

python - Pandas HDFStore : Omitting Duplicates

python - HDFS IO 故障 "path is not a file"

java - hadoop运行程序出错?

java - 运行 map 缩减程序时出现错误 java.lang.RuntimeException : java. lang.ClassNotFoundException : wordcount_classes. WordCount$Map

apache - hbase中有自动提交的概念吗?

java - Hadoop Mapreduce CSV作为关键字:word

mysql - 无法使用MySQL设置Ambari服务器

hadoop - HDFS 复制因子 - 最小化数据丢失风险

Hadoop 作业一直在运行,没有分配容器