2012-05-14 39 views
2

我正在写给hadoop hdfs。该文件必须使用lzo进行压缩。该文件也将实时添加。如何写入hadoop hdfs使用lzo压缩无地图还原

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

我们该如何做到这一点?

在此先感谢您的帮助

回答

6

您可以直接从自定义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)

+0

谢谢..这个工程 –

+0

我想在hadoop上运行一些压缩测试。该方案很简单:使用压缩输入运行wordcount。在ubuntu上使用lzop工具创建lzo压缩文件并将其提供给wordcount后,我注意到结果文件包含一些有趣的字符..所以我想从Hadoop中压缩文件,这让我在这里。我已经跑在Eclipse中的代码,它创建的输出文件..但预期它们不会被压缩..不知道为什么 – AlexandruC

+0

你的代码的唯一修改是,我已经使用CodecFactory中 \t \t \t \t .getCodecByClassName( “org.apache.hadoop.io.compress.GzipCodec”); – AlexandruC