gpt4 book ai didi

hadoop - 大 gz 文件上的 Mapreduce

转载 作者:可可西里 更新时间:2023-11-01 14:49:28 33 4
gpt4 key购买 nike

我有一个大约 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),但是当我在它们上运行 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)

最佳答案

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

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

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com