ZSTD介绍
zstd是Facebook在2016年开源的新无损压缩算法,优点是压缩率和压缩/解压缩性能都很突出。
zstd 是一种快速压缩算法,提供了很高的压缩比。它还为小数据提供了一种特殊的模式,称为字典压缩。
zstd还有一个特别的功能,支持以训练方式生成字典文件,相比传统压缩方式能大大的提高小数据包的压缩率。
在过去的两年里,Linux内核、HTTP协议、以及一系列的大数据工具(包括Hadoop 3.0.0,HBase 2.0.0,Spark 2.3.0,Kafka 2.1.0)等都已经加入了对zstd的支持。
可以预见,zstd将是未来几年里会被广泛关注和应用的压缩算法
下面是官网给出的性能对比图
另外。提供–fast参数 可以提供更快的压缩和解压缩速度,以换取压缩比的一些损失
ZSTD安装
方式1
在Hadoop3中增加了Zstd压缩本地库,需要依赖facebook的Zstd库。编译Hadoop时开启Zstd本地库编译的步骤如下:
- 下载编译并安装Zstd依赖库
wget https://github.com/facebook/zstd/releases/download/v1.4.4/zstd-1.4.4.tar.gz
tar -xzf zstd-1.4.4.tar.gz
cd zstd-1.4.4
make && make install
- 编译Hadoop3时默认是不开启的,需要在maven参数中设置相关开启参数。
mvn clean package -Dzstd.lib=/usr/local/lib -Dbundle.zstd=true
方式2
- 下载rpm包
https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/l/
- install
sudo rpm -i libzstd-1.5.2-1.el7.x86_64.rpm
集成到hadoop、hbase
- 查看hadoop支持压缩算法
hadoop checknative
- 查看hbase支持压缩算法
cd $HBASE_HOME/bin
hbase --config ~/conf_hbase org.apache.hadoop.util.NativeLibraryChecker
测试zstd
更改表压缩方式
0.
disable 'TEST:FAST_DIFF_ZSTD'
1.
alter 'TEST:FAST_DIFF_ZSTD', NAME => 'i', COMPRESSION => 'ZSTD'
2.
Updating all regions with the new schema...
All regions updated.
Done.
Took 1.1960 seconds
3. desc 'TEST:FAST_DIFF_ZSTD'
DATA_BLOCK_ENCODING => 'FAST_DIFF', COMPRESSION => 'SNAPPY
4.enable 'TEST:FAST_DIFF_ZSTD'
5. major_compact 'TEST:FAST_DIFF_ZSTD'
读写测试
- 写测试:
- 读测试:
各个压缩方式对比
问题
- 可能安装上也不支持
ERROR: org.apache.hadoop.hbase.DoNotRetryIOException: Compression algorithm 'zstd' previously failed test. Set hbase.table.sanity.checks to false at conf or table descriptor if you want to bypass sanity checks
at org.apache.hadoop.hbase.util.TableDescriptorChecker.warnOrThrowExceptionForFailure(TableDescriptorChecker.java:307)
at org.apache.hadoop.hbase.util.TableDescriptorChecker.sanityCheck(TableDescriptorChecker.java:121)
at org.apache.hadoop.hbase.master.HMaster$12.run(HMaster.java:2502)
at org.apache.hadoop.hbase.master.procedure.MasterProcedureUtil.submitProcedure(MasterProcedureUtil.java:134)
at org.apache.hadoop.hbase.master.HMaster.modifyTable(HMaster.java:2496)
at org.apache.hadoop.hbase.master.HMaster.modifyTable(HMaster.java:2532)
at org.apache.hadoop.hbase.master.MasterRpcServices.modifyTable(MasterRpcServices.java:1414)
at org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos$MasterService$2.callBlockingMethod(MasterProtos.java)
at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:393)
at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:133)
at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:338)
at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:318)
Caused by: org.apache.hadoop.hbase.DoNotRetryIOException: Compression algorithm 'zstd' previously failed test.
at org.apache.hadoop.hbase.util.CompressionTest.testCompression(CompressionTest.java:92)
at org.apache.hadoop.hbase.util.TableDescriptorChecker.checkCompression(TableDescriptorChecker.java:285)
at org.apache.hadoop.hbase.util.TableDescriptorChecker.sanityCheck(TableDescriptorChecker.java:119)
... 10 more
For usage try 'help "alter"'
- 解决方案
配置hbase-site.xml参数:
<property>
<name>hbase.table.sanity.checks</name>
<value>false</value>
</property>
- 重启hbase