
# 提升HBase Put和Scan数据性能
#### 操作场景
HBase有很多与读写性能相关的配置参数。读写请求负载不同的情况下，配置参数需要进行相应的调整，本章节旨在指导用户通过修改RegionServer配置参数进行读写性能调优。
#### 操作步骤
登录FusionInsight Manager界面，选择"集群 \> 服务 \> HBase \> 配置"，配置以下相关参数以提升HBase数据读写性能。
- JVM GC参数 RegionServer "GC_OPTS"参数设置建议：
  - "-Xms"与"-Xmx"设置相同的值，需要根据实际情况设置，增大内存可以提高读写性能，可以参考参数"hfile.block.cache.size"（参见[表2]）和参数"hbase.regionserver.global.memstore.size"（参见[表1]）的介绍进行设置。
  
  - "-XX:NewSize"与"-XX:MaxNewSize"设置相同值，建议低负载场景下设置为"512M"，高负载场景下设置为"2048M"。
  
  - "-XX:CMSInitiatingOccupancyFraction"建议设置为"100 \* (hfile.block.cache.size + hbase.regionserver.global.memstore.size + 0.05)"，最大值不超过"90"。
  
  - "-XX:MaxDirectMemorySize"表示JVM使用的堆外内存，建议低负载情况下设置为"512M"，高负载情况下设置为"2048M"。 "GC_OPTS"参数中"-XX:MaxDirectMemorySize"默认没有配置，如需配置，用户可在"GC_OPTS"参数中自定义添加。
    
   
- Put相关参数 RegionServer处理Put请求的数据，会将数据写入MemStore和HLog：
  - 当MemStore大小达到设置的"hbase.hregion.memstore.flush.size"参数值大小时，MemStore就会刷新到HDFS生成HFile。
  
  - 当当前Region的列簇的HFile数量达到"hbase.hstore.compaction.min"参数值时会触发compaction操作。
  
  - 当当前Region的列簇HFile数达到"hbase.hstore.blockingStoreFiles"参数值时会阻塞MemStore刷新生成HFile的操作，导致Put请求阻塞。
  
  
   表1Put相关参数 
  | **参数**                                     | **描述**                                                                                                                                                               | **默认值**   |
  |:---|:---|:---|
  | hbase.wal.hsync                            | 每一条WAL是否持久化到硬盘。 参考[提升HBase连续Put数据场景性能](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1637.html)。        | true      |
  | hbase.hfile.hsync                          | HFile写数据是否立即持久化到硬盘。 参考[提升HBase连续Put数据场景性能](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1637.html)。    | true      |
  | hbase.hregion.memstore.flush.size          | 如果MemStore的大小（单位：Byte）超过指定值，MemStore将被冲洗至磁盘。该参数值将被运行每个"hbase.server.thread.wakefrequency"的线程所检验。建议设置为HDFS块大小的整数倍，在内存足够Put负载大情况下可以调整增大该值。                             | 134217728 |
  | hbase.regionserver.global.memstore.size    | 更新被锁定以及强制冲洗发生之前一个RegionServer上支持的所有MemStore的大小。建议设置为"hbase.hregion.memstore.flush.size \* 写活跃region数 / RegionServer GC -Xmx"。默认值为"0.4"，表示使用RegionServer GC -Xmx的40%。 | 0.4       |
  | hbase.hstore.flusher.count                 | MemStore的flush线程数，在Put高负载场景下可以适当调大。                                                                                                                                  | 2         |
  | hbase.regionserver.thread.compaction.small | 小压缩线程数，在Put高负载情况下可以适当调大。                                                                                                                                             | 10        |
  | hbase.hstore.blockingStoreFiles            | 如果一个Store内的HStoreFile文件数量超过指定值，则针对此HRegion的更新将被锁定直到一个压缩完成或者"base.hstore.blockingWaitTime"被超过。每冲洗一次MemStore一个StoreFile文件被写入。在Put高负载场景下可以适当调大。                         | 15        |
     
  
- Scan相关参数
   表2Scan相关参数 
  | **参数**                              | **描述**                                                                                                           | **默认值**                                                                                                                                                                                                      |
  |:---|:---|:---|
  | hbase.client.scanner.timeout.period | 客户端和RegionServer服务端参数，表示客户端执行scan的租约超时时间。建议设置为60000毫秒的整数倍，在读高负载情况下可以适当调大。单位：毫秒。                                  | 60000                                                                                                                                                                                                        |
  | hfile.block.cache.size              | 数据缓存所占的RegionServer GC -Xmx百分比，在读高负载情况下可以适当调大以增大缓存命中率以提高性能。表示分配给HFile/StoreFile所使用的块缓存的最大heap（-Xmx setting）的百分比。 | - 当offheap关闭时，默认值为"0.25"。  - 当offheap开启时，默认值为"0.1"。   |
     
  
- Handler相关参数
  表3Handler相关参数 
  | **参数**                               | **描述**                                       | **默认值** |
  |:---|:---|:---|
  | hbase.regionserver.handler.count     | RegionServer上的RPC侦听器实例数，建议设置为200\~400之间。     | 200     |
  | hbase.regionserver.metahandler.count | RegionServer中处理优先请求的程序实例的数量，建议设置为200\~400之间。 | 200     |
     
  
 
