更新时间:2025-12-08 GMT+08:00
配置HBase数据压缩格式和编码
操作场景
HBase可以通过对HFile中的data block编码,减少Key-Value中Key的重复部分来压缩数据,从而减少空间的使用。目前对data block的编码方式有:NONE、PREFIX、DIFF、FAST_DIFF和ROW_INDEX_V1,其中NONE表示不使用编码。另外,HBase还支持使用压缩算法对HFile文件进行压缩,默认支持的压缩算法有:NONE、GZ和SNAPPY,其中NONE表示HFile不压缩。
这两种方式都是作用在HBase的列簇上,可以同时使用,也可以单独使用。
前提条件
- 已安装HBase客户端。例如,客户端安装目录为“/opt/client”。
- 如果集群开启了Kerberos认证,操作的用户还需要具备对应的操作权限。即创建表时需要具备对应的namespace或更高级别的创建(C)或者管理(A)权限,修改表时需要具备已创建的表或者更高级别的创建(C)或者管理(A)权限。具体的授权操作请参考创建HBase用户并绑定角色章节。
配置HBase数据压缩格式和编码
创建表时设置data block encoding和压缩算法。
- 方法一:使用hbase shell。
- 以客户端安装用户,登录安装客户端的节点。
- 执行以下命令切换到客户端目录。
cd /opt/client - 执行以下命令配置环境变量。
source bigdata_env
- 如果当前集群已启用Kerberos认证(安全模式),执行以下命令认证当前用户。如果当前集群未启用Kerberos认证(普通模式),则无需执行此命令。
kinit 组件业务用户
例如:
kinit hbaseuser
- 执行以下命令登录HBase客户端:
hbase shell
- 执行以下命令创建表:
create 't1', {NAME => 'f1', COMPRESSION => 'SNAPPY', DATA_BLOCK_ENCODING => 'FAST_DIFF'}
create 't1', {NAME => 'f1', COMPRESSION => 'SNAPPY', DATA_BLOCK_ENCODING => 'FAST_DIFF'}其中:
- t1:表示表名。
- f1:表示列簇名。
- SNAPPY:表示该列簇使用的压缩算法为“SNAPPY”。
- FAST_DIFF:表示使用的编码方式为“FAST_DIFF”。
- {}内的参数为指定列簇的参数,多个列簇可以用多个{}并用逗号隔开。关于建表语句的更多使用说明可以在hbase shell中执行以下命令进行查看:
help 'create'
- 方法二:使用Java API。
以下代码片段仅展示如何在建表时设置列簇的编码和压缩方式,完整的建表代码以及如何通过代码建表请参考HBase开发指南的创建HBase表章节。
TableDescriptorBuilder htd = TableDescriptorBuilder.newBuilder(TableName.valueOf("t1"));// 创建t1表的descriptor. ColumnFamilyDescriptorBuilder hcd = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("f1"));// 创建列簇f1的builder. hcd.setDataBlockEncoding(DataBlockEncoding.FAST_DIFF);// 设置列簇f1的编码方式为FAST_DIFF. hcd.setCompressionType(Compression.Algorithm.SNAPPY);// 设置列簇f1的压缩算法为SNAPPY htd.setColumnFamily(hcd.build())// 将列簇f1添加到t1表的descriptor.
对已存在的表设置或修改data block encoding和压缩算法。
- 方法一:使用hbase shell。
- 以客户端安装用户,登录安装客户端的节点。
- 执行以下命令切换到客户端目录。
cd /opt/client - 执行以下命令配置环境变量。
source bigdata_env
- 如果当前集群已启用Kerberos认证(安全模式),执行以下命令认证当前用户。如果当前集群未启用Kerberos认证(普通模式),则无需执行此命令。
kinit 组件业务用户
例如:
kinit hbaseuser
- 执行以下命令登录HBase客户端:
hbase shell
- 执行以下命令修改HBase表:
alter 't1', {NAME => 'f1', COMPRESSION => 'SNAPPY', DATA_BLOCK_ENCODING => 'FAST_DIFF'}
- 方法二:使用Java API。
以下代码片段仅展示如何修改指定表的已有列簇的编码和压缩方式,完整的修改表代码以及如何通过代码修改表请参考HBase应用开发指南的修改HBase表章节:
TableDescriptor htd = admin.getDescriptor(TableName.valueOf("t1"));// 获取表t1的descriptor ColumnFamilyDescriptor originCF = htd.getColumnFamily(Bytes.toBytes("f1"));// 获取列簇f1的descriptor builder.ColumnFamilyDescriptorBuilder hcd = ColumnFamilyDescriptorBuilder.newBuilder(originCF);// 通过已有的列簇属性构造一个builder hcd.setDataBlockEncoding(DataBlockEncoding.FAST_DIFF);// 重新设置列簇的编码方式为FAST_DIFF hcd.setCompressionType(Compression.Algorithm.SNAPPY);// 重新设置列簇的压缩算法为SNAPPY admin.modifyColumnFamily(TableName.valueOf("t1"), hcd.build());// 提交到服务端修改列簇f1的属性修改后完成后,已有的HFile的编码和压缩方式需要在下次做完compaction后才会生效。
父主题: HBase数据操作