HBase应该如何优化?

原创
10/18 06:27
阅读数 27


1


HBase高可用


       在HBase中Hmaster负责监控RegionServer的生命周期,均衡RegionServer的负载,如果Hmaster挂掉了,那么整个HBase集群将陷入不健康的状态,此时的工作状态并不会维持太久。所以需要配置hbase的高可用


2


预分区


       每一个region维护着startRow与endRowKey,如果加入的数据符合某个region维护的rowKey范围,则该数据交给这个region维护。那么依照这个原则,我们可以将数据所要投放的分区提前大致的规划好,以提高HBase性能。


1

手动设定预分区


hbase> create 'user','info','partition1',SPLITS => ['a','c','f','h']


2

生成16进制序列预分区


create 'user2','info','partition2',{NUMREGIONS => 15SPLITALGO => 'HexStringSplit'}

3


按照文件中设置的规则预分区


创建splits.txt文件内容如下:

10

20

30

40

然后执行:

create 'user3','partition3',SPLITS_FILE => 'splits.txt'


4

使用JavaAPI创建预分区


//自定义算法,产生一系列Hash散列值存储在二维数组中byte[][] splitKeys = 某个散列值函数//创建HBaseAdmin实例HBaseAdmin hAdmin = new HBaseAdmin(HBaseConfiguration.create());//创建HTableDescriptor实例HTableDescriptor tableDesc = new HTableDescriptor(tableName);//通过HTableDescriptor实例和散列值二维数组创建带有预分区的HBase表hAdmin.createTable(tableDesc, splitKeys);

  

3


优化rowkey设计(防止热点)


1

长度


      Rowkey可以使任意字符串,最大长度64kb,建议越短越好,最好不要超过16个字节,原因如下:


  • 目前操作系统都是64位系统,内存8字节对齐,控制在16字节,8字节的整数倍利用了操作系统的最佳特性。

  • Hbase将部分数据加载到内存当中,如果Rowkey太长,内存的有效利用率就会下降。


2

唯一


       Rowkey必须保证是唯一的,如果不唯一的话,同一版本同一个Rowkey插入Hbase中会更新之前的数据,与需求不符


3

散列



1.加盐

      在Rowkey的前面增加随机数,散列之后的Rowkey就会根据随机生成的前缀分散到各个Region上,可以有效的避免热点问题。

     加盐这种方式增加了写的吞吐,但是使得读数据更加困难


2.Hash

     Hash算法包含了MD5等算法,可以直接取Rowkey的MD5值作为Rowkey,或者取MD5值拼接原始Rowkey,组成新的rowkey,由于Rowkey设计不应该太长,所以可以对MD5值进行截取拼接


3.字符串反转

  • 时间戳反转

  • 手机号反转

  • ...


4


内存优化


       HBase操作过程中需要大量的内存开销,毕竟Table是可以缓存在内存中的,一般会分配整个可用内存的70%给HBase的Java堆。

     但是不建议分配非常大的堆内存,因为GC过程持续太久会导致RegionServer处于长期不可用状态,一般16~48G内存就可以了,如果因为框架占用内存过高导致系统内存不足,框架一样会被系统服务拖死。


5


压缩


生产系统应使用其ColumnFamily定义进行压缩。

注意

压缩会缩小磁盘上的数据。当它在内存中(例如,在MemStore中)或在线上(例如,在RegionServer和Client之间传输)时,它会膨胀。因此,虽然使用ColumnFamily压缩是最佳做法,但它不会完全消除过大的Keys,过大的ColumnFamily名称或过大的列名称的影响。


6


Column数控制


        Hbase中的每个列,都归属于某个列簇,列簇是表的schema的一部分(列不是),必须在使用之前定义

        HBase 目前对于两列族或三列族以上的任何项目都不太合适,因此请将模式中的列族数量保持在较低水平。

        目前,flushing 和 compactions 是按照每个区域进行的,所以如果一个列族承载大量数据带来的 flushing,即使所携带的数据量很小,也会 flushing 相邻的列族。当许多列族存在时,flushing 和 compactions 相互作用可能会导致一堆不必要的 I/O(要通过更改 flushing 和 compactions 来针对每个列族进行处理)。


7


开启布隆过滤器


      当我们随机读get数据时,如果采用hbase的块索引机制,hbase会加载很多块文件。

      采用布隆过滤器后,它能够准确判断该HFile的所有数据块中是否含有我们查询的数据,从而大大减少不必要的块加载,增加吞吐,降低内存消耗,提高性能

      在读取数据时,hbase会首先在布隆过滤器中查询,根据布隆过滤器的结果,再在MemStore中查询,最后再在对应的HFile中查询。


2020大数据面试题真题总结(附答案)

数据建模知多少?

如何写好一篇数据部门规范文档

如何优化整个数仓的执行时长(比如7点所有任务跑完,如何优化到5点)

从0-1建设数仓遇到什么问题?怎么解决的?

多值维度及交叉维度最佳解决方案

深入探究order by,sort by,distribute by,cluster by

Hive调优,数据工程师成神之路

数据质量那点事

简述元数据管理

你真的了解全量表,增量表及拉链表吗?

缓慢变化维(SCD)常见解决方案

全方位解读星型模型,雪花模型及星座模型

Sqoop or Datax

left join(on&where)

ID-Mapping

你们公司还在用SparkOnYan吗?

大厂高频面试题-连续登录问题

朋友面试数据研发岗遇到的面试题

数据仓库分层架构

简单聊一聊大数据学习之路

朋友面试数据专家岗遇到的面试题

HADOOP快速入门

数仓工程师的利器-HIVE详解


本文分享自微信公众号 - 大数据私房菜(datagogogo)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部