HBase概念02-Region、HFile管理、rowkey设计

一、Hbase能进行实时查询的原理

其实就是问HBase实时查询的速度为啥这么快

  • 主要原因是由其架构和底层的数据结构决定的,即由LSM-Tree(Log-Structured Merge-Tree)+HTable(region分区)+Cache决定
  • 默认先从缓存里读,没找到的话从内存的MemStore读,如果都没找到,从HFile里加载,而HFile里保存的数据也是有序的
  • 读取与所要查询的rowkey连续的任意数量的记录都不会引发额外的磁盘寻道开销。比如有五个存储文件,那么最多需要5次磁盘寻道就可以
  • 使用了LSM树形结构,而不是B或B+树,磁盘顺序读取速度很快。

二、Region拆分、预拆分、强制拆分

1、自动拆分策略
在这里插入图片描述

2、预拆分的手段

HBase默认建表时有一个region,并且rowkey是没有边界的,没有startkey和endkey,所有数据都会默认写入这个Region,随着数据增加,此Region会进行split分裂为两个Region。在此过程中,会产生两个问题:

  • 数据往一个region上写,会产生写的热点问题;
  • region split分裂会消耗集群大量的IO资源;
    因此可以采用预分区的策略,创建空Region,确定每个Region的起始和终止rowkey,这样的rowkey设计可以均匀的存在于各个Region里,就不会存在写的热点问题,而且split分裂的概率大大降低
    创建预分区可以通过shell实现
#my_split_table:我们指定要新建的表名。 
#HexStringSplit:指定的拆分点算法为 HexStringSplit。 
#-c:要拆分的 Region 数量。 
#-f:要建立的列族名称。
#HexStringSplit指明分割策略,-c 10 指明要分割的区域数量,-f指明表中的列族,用":"分割
hbase org.apache.hadoop.hbase.util.RegionSplitter my_split_table HexStringSplit -c 10 -f mycf
#在hbase shell中查看即可看到每个Region的范围
hbase(main):013:0> scan 'hbase:meta',{STARTROW=>'my_split_table',LIMIT=>10}

3、强制拆分
找到指定的rowkey,调用 hbase shell 的 split 方法split 'tableName', 'splitKey'split 'regionName', 'splitKey'

三、HBase Compaction(压缩)的作用是什么?

1、Compaction概念

  • HBase采取的是Log-Structured Merge Tree(LSMT)架构模式,因此HBase的增删改其实都是新增数据,只不过是版本号不同。
  • 但在数据增加的过多时,数据的连续性和顺序性就很差了,因此HBase每隔一段时间就会进行一次Compaction,合并的对象为MemStore中的HFile文件。
  • 另外数据写入不断增多,Flush次数不断增多,所以HFile文件也会越来越多。而HFile过多会导致IO次数过多。
    ➢Minor Compaction:多个HFile合并为一个HFile,触发频率高,手动删除的数据不会被移除
    ➢Major Compaction:所有HFile合并为一个HFile,触发频率低,超过MaxVersions版本的数据会被删除以节约空间
    在这里插入图片描述

2、触发Minor Compaction 的时机:

  • 通过 CompactionChecker 线程来定时检查是否需要执行 compaction,每隔 10000 秒 (可配置)检查一次。
  • 每当 RegionServer 发生一次 Memstore flush 操作之后也会进行检查是 否需要进行 Compaction 操作。
  • 手动触发,执行命令 major_compact 、 compact。

3、触发Major Compaction 的时机:

  • 发生的周期,单位是毫秒,默认值是 7 天,可以配置参数修改默认值,设置为0时是关闭自动触发采用手动触发

在这里插入图片描述

  • 触发MajorCompaction时对系统的压力较大,一般采取手动触发的方式
  • 手动 Major Compaction 命令为:
    在这里插入图片描述

四、RowKey设计原理

  • RowKey设计的目的就是让所有数据根据RowKey均匀分布到不同的Region,一定程度上防止数据倾斜

哈希-对时间戳进行哈希
加盐-防止并发的太快导致随机数重复
反转,降低重复的概率

1.长度原则

  • 一般设计成定长.建议越短越好,不要超过16个字节,过长会影响HFile的存储效率、影响内存的有效利用率

2.唯一原则

  • 必须在设计上保证Rowkey的唯一性.由于在HBase中数据存储是key-value形式,类似HashMap,插入重复的rowkey,则原rowkey对应的值被覆盖

3.排序原则

  • HBase的Rowkey是按照ASCII字典序有序排序的

4.散列原则

  • 设计的Rowkey应均匀的分布在各个HBase节点上

五、HBase配置优化思路

  • 开启 HDFS 追加同步,可以优秀的配合 HBase 的数据同步和持久化。
位置:hdfs-site.xml、hbase-site.xml 
属性:dfs.support.append
  • 优化 DataNode 允许的最大文件打开数 hdfs-site.xml 属性
位置:hdfs-site.xml 
属性:dfs.datanode.max.transfer.threads
  • 优化延迟高的数据操作的等待时间
位置:hdfs-site.xml 
属性:dfs.image.transfer.timeout
  • 优化数据的写入效率
位置:mapred-site.xml 
属性: mapreduce.map.output.compress mapreduce.map.output.compress.codec
  • 设置 RPC 监听数量
位置:hbase-site.xml 
属性:hbase.regionserver.handler.count
  • 优化 HStore 文件大小
位置:hbase-site.xml 
属性:hbase.hregion.max.filesize
  • 优化 hbase 客户端缓存
位置:客户端配置 
属性:hbase.client.write.buffer
  • 指定 scan.next 扫描 HBase 所获取的行数,设置的值越大,消耗内存越大。
位置:客户端配置
属性:hbase.client.scanner.caching
  • flush、compact、split 机制 当 MemStore 达到阈值,将 Memstore 中的数据 Flush 进 Storefile;compact 机制则是把 flush 出来的小文件合并成大的 Storefile 文件。
属性:hbase.hregion.memstore.flush.size:134217728
属性:hbase.regionserver.global.memstore.size:默认整个堆大小的 40%
属性:hbase.regionserver.global.memstore.size.lower.limit:默认堆大小*0.4*0.95
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值