我正在写信给 hadoop hdfs。该文件必须使用 lzo 压缩。该文件还将实时附加。
源文件是一个 gzip 文件,在 hadoop 中不存在。批处理此 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 库(例如hadoop-gpl-compression库)。如果您按照详细说明安装上述库,那么您需要做的就是将输出路径扩展名修改为“.lzo_deflate”,一切都应该正常工作。如果要使用其他压缩库,可以跳过 CompressionCodecFactory 代码块,直接包装 outputStream。
至于附加到文件 - 根据您的 hadoop 版本,这可能不受支持。您还需要考虑您的压缩库是否支持连接文件(例如 GZip,但早期版本的 Java/hadoop 在处理这些类型时存在一些问题)。如果您确实有支持附加的 hadoop 版本,并且您的压缩库支持它,则将fs.create(outputPath)
调用修改为fs.append(outputPath)