如何在不使用 map reduce 的情况下使用 lzo 压缩写入 hadoop hdfs

Posted

技术标签:

【中文标题】如何在不使用 map reduce 的情况下使用 lzo 压缩写入 hadoop hdfs【英文标题】:How to write to hadoop hdfs using lzo compression without map reduce 【发布时间】:2012-05-14 08:29:02 【问题描述】:

我正在写信给 hadoop hdfs。该文件必须使用 lzo 压缩。该文件还将实时附加。

源文件是一个 gzip 文件,在 hadoop 中不存在。批处理这个 gzip 文件,然后进行 lzo 压缩并附加到 hadoop。这是否消除了使用 map reduce 的可能性?

我们怎样才能做到这一点?

提前感谢您的帮助

【问题讨论】:

【参考方案1】:

您可以从自定义 java 代码直接写入 HDFS:

public class HdfsWrite extends Configured implements Tool 
    public int run(String[] arg0) throws Exception 

        // create am HDFS file system
        FileSystem fs = FileSystem.get(getConf());

        // create an output stream to write to a new file in hdfs
        Path outputPath = new Path(
                "/path/to/file/in/hdfs.default");
        OutputStream outputStream = fs.create(outputPath);

        // now wrap the output stream with a Zlib compression codec
        CompressionCodecFactory codecFactory = new CompressionCodecFactory(getConf());
        CompressionCodec codec = codecFactory.getCodec(outputPath);
        CompressionOutputStream compressedOutput = codec.createOutputStream(outputStream);

        // send content to file via compressed output stream using .write methods
        // ..

        // close out stream
        compressedOutput.close();

        return 0;
        

    public static void main(String[] args) throws Exception 
        ToolRunner.run(new HdfsWrite(), args);
    

此代码适用于 zlib 压缩 - 对于 LZO 压缩,您是否已经拥有一些可以为您执行压缩的 java 库(例如 hadoop-gpl-compression 库)。如果您按照详细说明安装上述库,那么您需要做的就是将输出路径扩展名修改为“.lzo_deflate”,一切都应该正常工作。如果要使用其他压缩库,可以跳过 CompressionCodecFactory 代码块,直接包装 outputStream。

至于附加到文件 - 根据您的 hadoop 版本,这可能不受支持。您还需要考虑您的压缩库是否支持连接文件(例如 GZip,但早期版本的 Java/hadoop 在处理这些类型时存在一些问题)。如果您确实有支持附加的 hadoop 版本,并且您的压缩库支持它,则将 fs.create(outputPath) 调用修改为 fs.append(outputPath)

【讨论】:

我正在尝试在 hadoop 上运行一些压缩测试。场景很简单:使用压缩输入运行 wordcount。在 ubuntu 上使用 lzop 工具创建 lzo 压缩文件并将其提供给 wordcount 后,我​​注意到结果文件包含一些有趣的字符.. 所以我考虑从 Hadoop 中压缩文件,这让我来到了这里。我在 Eclipse 中运行了你的代码,它创建了输出文件..但它们没有按预期压缩..不知道为什么 对你代码的唯一修改是我使用了codecFactory .getCodecByClassName("org.apache.hadoop.io.compress.GzipCodec");

以上是关于如何在不使用 map reduce 的情况下使用 lzo 压缩写入 hadoop hdfs的主要内容,如果未能解决你的问题,请参考以下文章

hive如何调整map数和reduce数

如何在不插入的情况下检查 std::map 是不是包含键?

我可以在不创建新列表/数组的情况下展平数组吗? [复制]

可以在没有运行任何 Map/Reduce (/Yarn) 的情况下对 Hive 表执行 Spark SQL 吗?

如何确定 Hadoop map和reduce的个数

在不添加嵌套的情况下组合 redux reducer