您可以从自定义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)
| 归档时间: | 
 | 
| 查看次数: | 4790 次 | 
| 最近记录: |