【问题标题】:Use gzip input codec on files without .gz extension in hadoop在 hadoop 中对没有 .gz 扩展名的文件使用 gzip 输入编解码器
【发布时间】:2015-10-27 18:30:09
【问题描述】:

我正在对一堆 gzip 输入文件运行 Hadoop 作业。 Hadoop 应该可以轻松处理这个问题...mapreduce in java - gzip input files

不幸的是,就我而言,输入文件没有.gz 扩展名。我正在使用CombineTextInputFormatClass,如果我将它指向非 gzip 压缩文件,它可以正常工作,但如果我将它指向 gzip 压缩文件,我基本上只会得到一堆垃圾。

我已经尝试搜索了很长一段时间,但我唯一出现的是其​​他人问我同样的问题,但没有答案...How to force Hadoop to unzip inputs regadless of their extension?

有人收到了吗?

【问题讨论】:

标签: java hadoop mapreduce emr elastic-map-reduce


【解决方案1】:

去挖掘源代码并为此构建了一个解决方案......

您需要修改LineRecordReader 类的源代码以修改它选择压缩编解码器的方式。默认版本创建一个 Hadoop CompressionCodecFactory 并调用 getCodec 解析其扩展的文件路径。您可以改为使用getCodecByClassName 来获取您想要的任何编解码器。

然后您需要覆盖您的输入格式类以使其使用您的新记录阅读器。详情在这里:http://daynebatten.com/2015/11/override-hadoop-compression-codec-file-extension/

【讨论】:

    【解决方案2】:

    第一个 gzip 文件不可拆分。所以结果是你的 map reduce 在拆分时不会使用块大小。

    Map reduce 在看到文件扩展名时不会执行拆分。可悲的是,在您的情况下,您是说扩展名不是 .gz。所以恐怕 Map reduce 无法理解如何拆分数据。

    因此,即使可以选择了解扩展名,您也不​​会获得良好的性能。所以可能是为什么不解压缩然后将数据提供给 map reduce,而不是强制 map reduce 使用性能降低的压缩格式。

    【讨论】:

    • 是的,我知道这一点。这些文件很小,所以我的输入格式实际上是合并它们而不是拆分它们。所以,这不会是一个问题。
    • 所以你正在合并没有扩展名的文件。这似乎是另一个概念,因为我们需要确认 CombineTextInputFormatClass 如何处理没有扩展名的文件。您可以尝试不使用它并使用常规 TextInputFormat 并检查。这将对性能产生影响。但无论如何,即使使用 .gz,我们也没有获得任何性能,因为它不可拆分。您可以尝试使用普通的文本输入格式。甚至我都在浏览如何减少地图,知道使用哪些技术,当我们不提供扩展时
    • 是的,我已经尝试过使用标准 TextInputFormat 并且没有骰子。经过大量挖掘,看起来LineRecordReader 使用CodecFactory 根据文件扩展名分配编解码器。看起来我将不得不扩展LineRecordReader 类,覆盖initialize 方法,然后还扩展所有输入格式类以使用我的自定义LineRecordReader。我希望有更好的方法,但似乎没有。完成后我会发布代码以供他人启迪。
    • 感谢您的信息。即使是我也会等你的帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多