Hadoop使用Lzo 压缩时需要注意的点

环境

  • postgres
  • cdh6.3.2
  • 从pg从导出数据写入到hdfs上. 写入时使用lzo对数据进行压缩

遇到的问题

写入可以成功.但是使用lzo的库创建索引提示Invalid LZO header . 但是在linux上lzo 命令压缩文件然后上传到hdfs是可以的.
思考是lzo是不支持流式压缩的.

解决

通过看hadoop压缩类CompressionOutputStream 发现其子类有BlockCompressorStream 注释说它与基于“基于块”的压缩算法一起工作,而不是*基于流的压缩算法。 在通过看com.hadoop.compression.lzo.LzoCodec#createOutputStream(java.io.OutputStream, org.apache.hadoop.io.compress.Compressor)

   public CompressionOutputStream createOutputStream(OutputStream out, Compressor compressor) throws IOException {
        if (!isNativeLzoLoaded(this.conf)) {
            throw new RuntimeException("native-lzo library not available");
        } else {
            CompressionStrategy strategy = getCompressionStrategy(this.conf);
            int bufferSize = getBufferSize(this.conf);
            int compressionOverhead = strategy.name().contains("LZO1") ? (bufferSize >> 4) + 64 + 3 : (bufferSize >> 3) + 128 + 3;
            return new BlockCompressorStream(out, compressor, bufferSize, compressionOverhead);
        }
    }

发现其创建的BlockCompressorStream 如果是流式写入的话是不支持的.
然后在看了com.hadoop.compression.lzo.LzopCodec

    public CompressionOutputStream createIndexedOutputStream(OutputStream out, DataOutputStream indexOut, Compressor compressor) throws IOException {
        if (!isNativeLzoLoaded(this.getConf())) {
            throw new RuntimeException("native-lzo library not available");
        } else {
            CompressionStrategy strategy = CompressionStrategy.valueOf(this.getConf().get("io.compression.codec.lzo.compressor", CompressionStrategy.LZO1X_1.name()));
            int bufferSize = this.getConf().getInt("io.compression.codec.lzo.buffersize", 262144);
            return new LzopOutputStream(out, indexOut, compressor, bufferSize, strategy);
        }
    }

是创建的LzopOutputStream支持流式压缩. 具体为

public HDFSFileApplier(Table table, SyncConfig syncConfig) {
        super(table, syncConfig.getSync().getApplier());
        this.fullName = table.getFullName();
        //初始化Configuration

        //初始化outputStream
        LzopCodec lzoCodec = new LzopCodec();
        lzoCodec.setConf(config);
        try {
            FileSystem fs = FileSystem.get(config);
            Path path = new Path("/user/xxx/" + table.getSchema() + "/" + table.getName() + ".lzo");
            FSDataOutputStream fos;
            if (fs.exists(path)) {
                fos = fs.append(path);
            } else {
                fos = fs.create(path);
            }
            CompressionOutputStream cos = lzoCodec.createOutputStream(fos);
        } catch (IOException e) {
            log.error("获取FileSystem 失败.", e);
        }
    }

此方式写入的文件是可以被index的.

参考

  • http://www.51niux.com/?id=178
  • https://wzktravel.github.io/2016/09/19/hadoop-lzo/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
安装LZS库和HadoopLZO压缩算法库可以按照以下步骤进行: 1. 下载LZS库和HadoopLZO压缩算法库。 可以从以下网址下载对应版本的LZS库和HadoopLZO压缩算法库: - LZS库:http://www.lzsupdates.com/download/lzs-1.6.tar.gz - HadoopLZO压缩算法库:https://github.com/ning/jvm-compressor-snappy/releases/download/v0.1.0-native-hadoop1.0.4.1/libhadoop-gpl-compression-0.1.0-native-1.0.4.1.jar 2. 安装LZS库。 解压下载的LZS库文件,并按照以下步骤进行安装: ```bash tar -zxvf lzs-1.6.tar.gz cd lzs-1.6 ./configure make make install ``` 安装完成后,可以使用以下命令检查是否安装成功: ```bash lzs --version ``` 3. 安装HadoopLZO压缩算法库。 将下载的`libhadoop-gpl-compression-0.1.0-native-1.0.4.1.jar`文件复制到Hadoop的`lib`目录下: ```bash cp libhadoop-gpl-compression-0.1.0-native-1.0.4.1.jar $HADOOP_HOME/lib/ ``` 然后,需要Hadoop的配置文件中添加以下配置: ``` io.compression.codecs org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.SnappyCodec,com.hadoop.compression.lzo.LzoCodec io.compression.codec.lzo com.hadoop.compression.lzo.LzoCodec ``` 配置完成后,重启Hadoop集群,以确保配置生效。 注意:如果您使用的是CDH、HDP等Hadoop发行版,则可以跳过以上步骤,因为这些发行版已经默认包含了LZO压缩算法库。 安装完成后,您就可以在Java的Spark程序中使用LZS压缩算法了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值