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

如何在没有map reduce的情况下使用lzo压缩写入hadoop hdfs,hadoop,gzip,hdfs,lzo,Hadoop,Gzip,Hdfs,Lzo,我正在给hadoop hdfs写信。该文件必须使用lzo进行压缩。此外,该文件将实时追加 源文件是hadoop中不存在的gzip文件。批处理处理此gzip文件,然后执行lzo压缩并附加到hadoop。这是否排除了使用map reduce的可能性 我们如何才能做到这一点 提前感谢您的帮助您可以从自定义java代码直接写入HDFS: public class HdfsWrite extends Configured implements Tool { public int run(Strin

我正在给hadoop hdfs写信。该文件必须使用lzo进行压缩。此外,该文件将实时追加

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

我们如何才能做到这一点


提前感谢您的帮助

您可以从自定义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库可以为您执行压缩(例如库)。如果您按照详细说明安装上述库,那么您需要做的就是将输出路径扩展修改为“.lzo_deflate”,一切都应该正常工作。如果要使用另一个压缩库,可以跳过CompressionCodeFactory代码块,直接包装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.gzip”);