典型业务场景下的CloudTable性能调优方法
不同的业务场景下,往往需要针对具体业务场景对系统进行性能调优,以获得最佳性能。CloudTable提供了丰富的可配置参数接口,可以方便用户根据自身的业务特征来进行性能优化。
以下针对随机读密集型、顺序读密集型、写密集型三种典型的业务场景,给出优化思路和方法。
思路:对于随机读密集型的工作负载,可以主要从如下2点思考进行优化:(1)高效利用缓存(2)更好地索引
配置参数 | 介绍 | 建议 |
hfile.block.cache.size | 块缓存是读缓存(LRU)。该属性定义块缓存可以使用的堆的最大百分比 | 对于随机读密集型负载,增加缓存使用的堆的百分比 |
hbase.regionserver.global.memstore.lowerLimit hbase.regionserver.global.memstore.upperLimit | 这两个参数可以限定MemStore可以使用的堆的最大百分比 | 对于随机读密集型负载,想通过增加块缓存占用堆的百分比(hfile.block.cache.size)来提升读性能时,需要同步使用这2个参数来减少MemStore占用的百分比 |
HFile数据块大小 | HFile数据块大小可以在创建表的时候,通过BLOCKSIZE属性来指定。 | 默认情况下,HFile Block size是64KB,通常来说,该值较为合理。但在随机读密集型负载下,可以尝试将该值减小,通过减少IO交互来提升随机读性能。 |
布隆过滤器 | 布隆过滤器可以通过在创建表的时候,通过BLOOMFILTER属性来指定。 | 打开布隆过滤器可以减少为查找指定行的Key Value对象而读取的HFile数量。当值支持多种类型的布隆过滤器 |
激进缓存 | 可以在创建表的时候,通过IN_MEMORy属性来指定。该参数可以在列族层次设置,以便该列族比其他列族更加激进的进行缓存。 | 该设置可以尽可能多的缓存数据,以此来提升读性能。合理的选择开启激进缓存的列族是性能调优的关键。 |
关闭其他表和列族的缓存 | 可以在列族层次设置,在读的时候不在BlockCache中进行缓存。通过创表中的BLOCKCACHE属性设置 | 如果有一些列族被用于随机读而其他的列族没有被用到,没有被用到的列族可能会污染缓存。关闭它们的缓存会提升你的缓存命中率 |
2.顺序读密集型
思路:对于顺序读密集型的工作负责,读缓存不会带来太多好处,甚至有可能使用缓存比不使用缓存需要更频繁的访问硬盘。
针对顺序度密集型的负载,可以考虑通过增加每次访问硬盘时的预读数据量来提高性能。
配置参数 | 介绍 | 建议 |
HFile数据块大小 | HFile数据块大小可以在创建表的时候,通过BLOCKSIZE属性来指定。 | 数据块越大,每次访问硬盘可以获取的数据就越多,在顺序读场景下,可以有效提升性能 |
hbase.client.scanner.caching | 该参数定义了扫描器上调用next方法时取回的行的数量。 | 该数值越高,扫描操作时客户端需要向RegionServer发起的RPC调用越少,性能也就越高。代价是,该数字越高,客户端使用的内存越多。 |
通过Scan.setCacheBlocks()API关闭数据块的缓存 | 该参数定义被扫描的数据块是否应该放进块缓存 | 扫描通常带来顺序读,在顺序读场景下,缓存不仅起不到正面作用,反而会因为连续的换入换出影响性能。因此对于大规模扫描操作,通过将该参数置为false来将数据块的cache关闭是一个好选择。 |
关闭表缓存 | 可以在设置列族时指定 | 同上 |
3.写密集型
思路:因为在flush、Compaction、split过程中,会带来大量的读写IO,影响性能。所以,在写密集型业务下,可以通过避免频繁的flush,compaction,split来提升性能。
配置参数 | 介绍 | 建议 |
hbase.hregion.max.filesize | 该参数定义了region对应的存储文件的最大大小。如果列族的存储文件超过这个大小,那么该region被拆分。 | region越大意味着在写入时拆分越少。在写密集场景下,可以尝试调高该参数来提升性能。 |
为表提前做的预分区 | 在创建表时,可以指定为表做提前预分区 | 通过提前做预分区,来避免写入过程中region分裂来影响性能。 |
hbase.hregion.memstore.flush.size | 该参数定义了memstore的大小,当memstore超过这个值时,则会被flush到硬盘中。一个周期性运行的线程会检查memstore的大小 | 通过调大该参数,可以减少生成的hfile数量,进而减少compaction次数。 |
hbase.hstore.blockingWaitTime | 当到达Hfile的数量限制时(由hbase.hstore.blockingStoreFiles参数指定),阻塞hregion更新数据的时间。 | 调小该参数值,可以减小阻塞时间 |
hbase.hstore.blockingStoreFiles | 阻塞写入的最大Hfile数量值 | 调大该参数值,可以降低或避免因hfile数量过多导致的阻塞(在写密集业务下,hfile数量会增长较快) |
hbase.hstore.compaction.min | 可以运行compaction的符合条件的最少hfile数量 | 调大该值,可以减少hfile被compaction的总次数,进而减少Compaction操作处理的总数据量。 |
hbase.hstore.compaction.max | 一次minor compaction所能选择的最大hfile数量 | 调大该值,可以减少hfile被compaction的总次数,进而减少Compaction操作处理的总数据量。 |
hbase.hstore.compaction.max.size | 超过该值得hfile将不会被选中做compaction | 大文件做compaction的性价比很低,通过适当调小该值,可以让较大的文件,避免被选中做compaction,减少IO占用。 |
- 点赞
- 收藏
- 关注作者
评论(0)