在使用 HBase 的时候,为了节省数据的空间占用,通常我们会为 HBase 设置压缩属性。与其他的表级别属性一样,压缩设置也是针对具体列族进行设置的。
HBase 创建表时默认压缩为 NONE ,即没有压缩,除非指定。目前 HBase 主要支持 4 种压缩方式:GZ(GZIP),SNAPPY,LZO,LZ4。
应该选择哪一种压缩方式?首先应该了解不同压缩方式之间的区别。
GZ(GZIP)
用于冷数据存储,要求数据访问不频繁,与 Snappy 和 LZO 相比,GZIP 的压缩率更高,但是更消耗 CPU,解压/压缩速度更慢。
Snappy 和 LZO
用于热数据存储,数据访问频繁时使用,占用 CPU 少,解压/压缩速度比 GZ 快,但是压缩率不如 GZ 高。
大部分场景下,开启 Snappy 或者 LZO 压缩会是比较好的选择,其中 Snappy 整体性能优于 LZO,主要表现在解压/压缩速度更快,是使用较多的一种压缩方式。
LZ4
这是一种追求极致解压/压缩速度的压缩方式,HBase 官网上介绍不多。根据 HBase 社区的测试结果来看,在不同业务类型数据下,LZ4 的压缩率与 LZO 相当或者略小于 LZO,但是解压速度却明显高于 LZO,部分场景下可以达到 LZO 的两倍以上。
创建表时设置压缩方式,以及修改表的压缩方式,操作演示如下:
hbase(main):001:0> create 'event_info_2019', {NAME=>'f', COMPRESSION=>'Snappy'}0 row(s) in 2.7010 seconds=> Hbase::Table - event_info_2019hbase(main):002:0> desc 'event_info_2019'Table event_info_2019 is ENABLED event_info_2019 COLUMN FAMILIES DESCRIPTION {NAME => 'f', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS => 'FALSE', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'} 1 row(s) in 0.1990 secondshbase(main):003:0> alter 'event_info_2019', {NAME=>'f', COMPRESSION=>'GZ'}Updating all regions with the new schema...0/1 regions updated.1/1 regions updated.Done.0 row(s) in 3.5520 secondshbase(main):004:0> desc 'event_info_2019'Table event_info_2019 is ENABLED event_info_2019 COLUMN FAMILIES DESCRIPTION {NAME => 'f', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'GZ', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS => 'FALSE', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'} 1 row(s) in 0.0330 seconds0> create 'event_info_2019', {NAME=>'f', COMPRESSION=>'Snappy'}
0 row(s) in 2.7010 seconds
=> Hbase::Table - event_info_2019
hbase(main):002:0> desc 'event_info_2019'
Table event_info_2019 is ENABLED
event_info_2019
COLUMN FAMILIES DESCRIPTION
{NAME => 'f', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_C
ELLS => 'FALSE', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}
1 row(s) in 0.1990 seconds
hbase(main):003:0> alter 'event_info_2019', {NAME=>'f', COMPRESSION=>'GZ'}
Updating all regions with the new schema...
0/1 regions updated.
1/1 regions updated.
Done.
0 row(s) in 3.5520 seconds
hbase(main):004:0> desc 'event_info_2019'
Table event_info_2019 is ENABLED
event_info_2019
COLUMN FAMILIES DESCRIPTION
{NAME => 'f', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'GZ', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS
=> 'FALSE', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}
1 row(s) in 0.0330 seconds
在给未设置压缩的表增加压缩方式,或者修改完压缩后,须要执行 major_compact 才能使历史数据按照我们设置的压缩方式进行压缩。
1、HBase最佳实践 | 聊聊HBase核心配置参数
2、Apache Hudi:剑指数据湖的增量处理框架
3、Hadoop社区比 Ozone 更重要的事情
4、MapReduce Shuffle 和 Spark Shuffle 结业篇