一、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