• 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、修改负载均衡执行周期

  • 相关阅读:
    jsoncpp使用
    java学习笔记12--国际化
    java学习笔记13--比较器(Comparable、Comparator)
    java学习笔记15--引用传递
    java学习笔记16--异常
    Java学习笔记——File类之文件管理和读写操作、下载图片
    java学习笔记3
    我的二十一天CoreJava 学习笔记
    大数据处理方面的 7 个开源搜索引擎
    GridView编辑删除操作
  • 原文地址:https://www.cnblogs.com/yangh2016/p/14756091.html
Copyright © 2020-2023  润新知