我正在写给hadoop hdfs。该文件必须使用lzo进行压缩。该文件也将实时添加。如何写入hadoop hdfs使用lzo压缩无地图还原
源文件是在hadoop中不存在的gzip文件。一批处理这个gzip文件,然后进行lzo压缩并附加到hadoop。这是否消除了使用地图缩小的可能性?
我们该如何做到这一点?
在此先感谢您的帮助
我正在写给hadoop hdfs。该文件必须使用lzo进行压缩。该文件也将实时添加。如何写入hadoop hdfs使用lzo压缩无地图还原
源文件是在hadoop中不存在的gzip文件。一批处理这个gzip文件,然后进行lzo压缩并附加到hadoop。这是否消除了使用地图缩小的可能性?
我们该如何做到这一点?
在此先感谢您的帮助
您可以直接从自定义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中的代码,它创建的输出文件..但预期它们不会被压缩..不知道为什么 – AlexandruC
你的代码的唯一修改是,我已经使用CodecFactory中 \t \t \t \t .getCodecByClassName( “org.apache.hadoop.io.compress.GzipCodec”); – AlexandruC