3、Hbase优化,数据结构

一、Hbase的优化

1.1、Rowkey的设计

  • Rowkey相当于Hbase中数据的主键,同时在底层存储的时候也是根据Rowkey划分region分布到不同的HregionService节点中。所以Rowkey的设计十分关键。
  • HBase中的Rowkey按字典顺序排序。可以使相关行彼此靠近存储。如果rowkey设计不当会引起热点问题,即客户端大量的读写请求都集中在一个或几个节点上。从而导致性能下降。
  • 为防止数据写入时出现热点,数据被写入时应写入集群中的多个区域,而不是一次写入一个区域(Hregion)。
  • 设计原则
    • 要保证rowkey的唯一性(随机数,时间戳)。
    • rowkey 长度建议是越短越好,不要超过16个字节。
    • Rowkey的散列原则,既是离散的
    • 如果Rowkey是按时间戳的方式递增,不要将时间放在二进制码的前面,建议将Rowkey的高位作为散列字段,由程序循环生成,低位放时间字段,这样将提高数据均衡分布在每个Regionserver实现负载均衡的几率。
    • 如果没有散列字段,首字段直接是时间信息将产生所有新数据都在一个 RegionServer上堆积的热点现象,这样在做数据检索的时候负载将会集中在个别RegionServer,降低查询效率。
    • 3、Hbase优化,数据结构_第1张图片

1.2、列族的设置

  • 尝试使ColumnFamily名称尽可能小,最好是一个字符(例如,“ d”表示数据/默认值)。
  • 对于那些临时性的ColumnFamily可以设置失效时间。一旦达到到期时间,HBase将自动删除行。
  • 将相同IO特性的列放入同一列族。
  • 列族的数量:
    • HBase当前不能很好地处理超过两个或三个列族的数据,因此请保持列族的数量较少。当前,刷新和压缩是在每个Region的基础上进行的,因此,如果一个列族承载着大量要进行刷新的数据,即使相邻族族携带的数据量很小,也将对其进行刷新。如果刷新太频繁,会导致大量不必要的I / O。
    • 最好的情况下使用一个列族。仅在数据访问通常是列范围的情况下才引入第二和第三列族。即,一次只查询一个列族,通常不会查询两个列族。
  • 多个列族中的数据(行数)分布大致均匀。
    • 在单个表中存在多个ColumnFamilie的地方,要注意基数(即行数)。如果ColumnFamilyA具有100万行,而ColumnFamilyB具有10亿行,则ColumnFamilyA的数据可能会分布在许多区域(RegionServers)中。这使得对ColumnFamilyA进行批量扫描的效率较低。

1.3、Region的预分

  • HBase默认建表时有一个region,这个region的rowkey是没有边界的,即没有startkey和endkey,在数据写入时,所有数据都会写入这个默认的region,随着数据量的不断增加,此region已经不能承受不断增长的数据量,会进行split,分成2个region。在此过程中,会产生两个问题:
    • 数据往一个region上写,会有写热点问题。
    • region split会消耗集群I/O资源。
  • 基于此我们可以控制在建表的时候,创建多个空region,并确定每个region的起始和终止rowky,这样只要我们的rowkey设计能均匀的命中各个region,就不会存在写热点问题。自然split的几率也会大大降低。当然随着数据量的不断增长,该split的还是要进行split。

二、Hbase数据结构

B+树

  • 传统关系型数据普通索引就是采用B+树的方式
  • B+树最大的性能问题是会产生大量的随机IO,随着新数据的插入,叶子节点会慢慢分裂,逻辑上连续的叶子节点在物理上往往不连续,甚至分离的很远,但做范围查询时,会产生大量读随机IO;

LSM树

  • 为了克服B+树的弱点,HBase引入了LSM树的概念,即Log-Structured Merge-Trees;
  • LSM树的设计思想:
    • 将对数据的修改增量保持在内存中,达到指定的大小限制后将这些修改操作批量写入磁盘,不过读取的时候稍微麻烦,需要合并磁盘中历史数据和内存中最近修改操作,所以写入性能大大提升,读取时可能需要先看是否命中内存,否则需要访问较多的磁盘文件。极端的说,基于LSM树实现的HBase的写性能比MySQL高了一个数量级,读性能低了一个数量级。
    • LSM树本质上就是在读写之间取得平衡,和B+树相比,它牺牲了部分读性能,用来大幅提高写性能
    • 基本过程:LSM树原理把一棵大树拆分成N棵小树,它首先写入内存中,随着小树越来越大,内存中的小树会flush到磁盘中,磁盘中的树定期可以做merge(合并)操作,合并成一棵大树,以优化读性能。

   3、Hbase优化,数据结构_第2张图片

B+树与LSM-Tree树本质区别

  • 他们本质不同点在于他们使用现代硬盘的方式,尤其是磁盘。从磁盘使用方面讲,RDBMS是寻道型,它需要随机读写数据。LSM-Tree则属于传输型,它会顺序读写数据。

HBase存储的设计思想:

  • 小树先写到内存中,为了防止内存数据丢失,写内存的同时需要暂时持久化到磁盘,对应了HBase的MemStore和HLog。
  • MemStore上的树达到一定大小之后,需要flush到HRegion磁盘中(一般是Hadoop DataNode),这样MemStore 就变成了DataNode上的磁盘文件StoreFile,定期HRegionServer 对 DataNode 的数据做 merge 操作,彻底删除无效空间,多棵小树在这个时机合并成大树,来增强读性能。

你可能感兴趣的:(3、Hbase优化,数据结构)