HBASE-表设计-优化

1、开启布隆过滤器

布隆过滤器用于判断一个元素是否在集合中

有一定的误判率和删除困难

如果使用布隆过滤器判断一个元素在集合中,那它可能不在

但如果判断一个元素不在集合中,那它肯定不在

布隆过滤器[1(Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的。它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率(假正例False positives,即Bloom Filter报告某一元素存在于某集合中,但是实际上该元素并不在集合中)和删除困难,但是没有识别错误的情形(即假反例False negatives,如果某个元素确实没有在该集合中,那么Bloom Filter 是不会报告该元素存在于集合中的,所以不会漏报)

配置值有三个

默认为NONE

ROW  行健的哈希在每次插入行时将被添加到布隆过滤器

ROWCOL 表示行健,列族和列名三者的哈希将在每次插入行时添加到布隆过滤器

2、调整列族块大小

HBase存储数据在StoreFile中,StoreFile由HFile块组成

HFile块是Hbase从StoreFile中读取数据时最小的数据单元。

HFile块大小是一个很重要的调优参数。

为了获得更好的访问性能,需要根据平均键值对规模和磁盘IO速度的不同来选择不同的块大小。

该属性作用于列族级别。

BLOCKSIZE 默认大小为65536B   为64kb

BlockSize设置

块大小是HBase的一个重要配置选项,默认块大小为64M。对于不同的业务数据,块大小的合理设置对读写性能有很大的影响。而对块大小的调整,主要取决于两点:

1. 用户平均读取数据的大小。理论上讲,如果用户平均读取数据的大小较小,建议将块大小设置较小,这样可以使得内存可以缓存更多block,读性能自然会更好。相反,建议将块大小设置较大。

为了更好说明上述原理,笔者使用YCSB做了一个测试,分别在Get、Scan两种场景下测试不同BlockSize大小(16K,64K,128K)对性能的影响。测试结果分别如下面两图:

随着BlockSize的增大,系统随机读的吞吐量不断降低,延迟不断增大。64K大小比16K大小的吞吐量大约降低13%,延迟增大13%。同样的,128K大小比64K大小的吞吐量降低约22%,延迟增大27%。因此,对于以随机读为主的业务,可以适当调低BlockSize的大小,以获得更好的读性能。

随着BlockSize增大,scan的吞吐量逐渐增大,延迟不断降低。64K大小BlockSize比16K大小的吞吐量增加了33%,延迟降低了24%;128K大小比64K大小吞吐量增加了7%,延迟降低了7%;因此,对于以scan为主的业务,可以适当增大BlockSize的大小,以获得更好的读性能。

可见,如果业务请求以Get请求为主,可以考虑将块大小设置较小;如果以Scan请求为主,可以将块大小调大;默认的64M块大小是在ScanGet之间取得的一个平衡。

2. 数据平均键值对规模。可以使用HFile命令查看平均键值对规模,如下:

./hbase org.apache.hadoop.hbase.io.hfile.HFile -m -f /hbase-sc/data/news/NewsClickFeedback/627b1d95153d4157351b65135ab701a3/Toutiao/011b41375e584530a24a3a203b9ce1a3
Block index size as per heapsize: 704
reader=/hbase-sc/data/news/NewsClickFeedback/627b1d95153d4157351b65135ab701a3/Toutiao/011b41375e584530a24a3a203b9ce1a3,
    compression=snappy,
    cacheConf=CacheConfig:disabled,
    firstKey=a0000000be3d27a5a11d203f798781a9/Toutiao:ClickViewTS/1465783628056/Put,
    lastKey=a80072cbf409d04542f272446d4b65a4/Toutiao:ClickViewTS/1465776679416/Put,
    avgKeyLen=62,
    avgValueLen=93,
    entries=6451829,
    length=698454846
......

从上面输出的信息可以看出,该HFile的平均键值对规模为62B + 93B = 155B,相对较小,在这种情况下可以适当将块大小调小(例如32KB)。这样可以使得一个block内不会有太多kv,kv太多会增大块内寻址的延迟时间,因为HBase在读数据时,一个block内部的查找是顺序查找。

注意: 默认块大小适用于多种数据使用模式,调整块大小是比较高级的操作。配置错误将对性能产生负面影响。因此建议在调整之后进行测试,根据测试结果决定是否可以线上使用。

3In Memory属性

对于特别频繁访问的列族,可以设置为true

但如果数据量非常大可能导致内存溢出

BlockCache有三个优先级队列

1、一个block被初次访问,放在single队列

2、一个block被多次访问,放在multi队列

3、如果一个block是In memory的,则放在In Memory队列

三个队列分别占用BlockCache的25%  50%  25%

4、列族的最大版本数

versions

默认版本数是三个

对于更新频繁的应用,不同版本有用的情况下,最大可以设置为Integer的最大值  2147483647 

对于只有一个版本有用的应用,version应该设置为1

5、TTL属性

用于定义列族中单元格的存活时间,过期自动被删除

1)单位是秒,默认值是Integer的最大值2147483647  (1634年)

2)当一个行健的所有列都失效后,该行健也会被删除

3)如果将TTL设置为2个月,那么时间戳在两个月之前的数据将不能插入Hbase

其它优化暂不介绍

1、关闭mapreduce的预测执行功能

2、修改负载均衡执行周期

原文地址:https://www.cnblogs.com/yangh2016/p/14756091.html