
# 配置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权限角色](https://support.huaweicloud.com/cmpntguide-mrs/mrs_01_1608.html)章节。
 
#### 配置HBase数据压缩格式和编码
**创建时设置data block encoding和压缩算法。**
- **方法一：使用hbase shell** 。
  1. 以客户端安装用户，登录安装客户端的节点。
  
  2. 执行以下命令切换到客户端目录。 **cd /opt/client**
     
  
  3. 执行以下命令配置环境变量。 **source bigdata_env**
     
  
  4. 如果当前集群已启用Kerberos认证，执行以下命令认证当前用户。如果当前集群未启用Kerberos认证，则无需执行此命令。 **kinit** *组件业务用户*
     例如，**kinit** **hbaseuser**。
     
  
  5. 执行以下命令登录HBase客户端： **hbase shell**
     
  
  6. 创建表。
     **create '** *t1* **', {NAME =\> '** *f1* **', COMPRESSION =\> '** *SNAPPY* **', DATA_BLOCK_ENCODING =\> '** *FAST_DIFF* **'}**
     ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
     - t1：表名。
     
     - f1：列簇名。
     
     - SNAPPY：该列簇使用的压缩算法为SNAPPY。
     
     - FAST_DIFF：使用的编码方式为FAST_DIFF。
     
     - {}内的参数为指定列簇的参数，多个列簇可以用多个{}，然后用逗号隔开。关于建表语句的更多使用说明可以在**hbase shell** 中执行**help 'create'** 进行查看。
       
   
- **方法二：使用Java API** 。
  以下代码片段仅展示如何在建表时设置列簇的编码和压缩方式，完整的建表代码以及如何通过代码建表请参考HBase开发指南的[创建HBase表](https://support.huaweicloud.com/devg3-mrs/mrs_07_080017.html)章节。
  ```
  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 shel** **l** 。
  1. 以客户端安装用户，登录安装客户端的节点。
  
  2. 执行以下命令切换到客户端目录。 **cd /opt/client**
     
  
  3. 执行以下命令配置环境变量。 **source bigdata_env**
     
  
  4. 如果当前集群已启用Kerberos认证，执行以下命令认证当前用户。如果当前集群未启用Kerberos认证，则无需执行此命令。 **kinit** *组件业务用户*
     例如，**kinit** **hbaseuser**。
     
  
  5. 执行以下命令登录HBase客户端： **hbase shell**
     
  
  6. 执行以下命令修改HBase表： **alter '** *t1* **', {NAME =\> '** *f1* **', COMPRESSION =\> '** *SNAPPY* **', DATA_BLOCK_ENCODING =\> '** *FAST_DIFF* **'}**
     
   
- **方法二：使用Java API** 。
  以下代码片段仅展示如何修改指定表的已有列簇的编码和压缩方式，完整的修改表代码以及如何通过代码修改表请参考HBase应用开发指南的[修改HBase表](https://support.huaweicloud.com/devg3-mrs/mrs_07_080019.html)章节：
  ```
  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后才会生效。
  
 
