Hbase常见知识点
写入流程
-
客户端发起写入数据请求,连接zk
-
获取zk当中一张特殊表 hbase:meta 表的位置信息
-
连接hbase:meta表所在的regionServer的服务器,与之进行通信,读取hbase:meta表示数据
-
与对应表的regionServer进行通信,写入数据
-
数据先写入到HLog,然后将数据写入到memoryStore里面去,这两个地方数据写入成功,就算数据写入成功
-
memoryStore写满了之后,就会冲洗开辟一个新的memoryStore,老的memoryStore会加入到flush队列里面去,等待flush storeFile也会进行compact机制 ==》 将数据进行合并,删除掉无用的数据,清理过期的数据 split机制:region分裂 将HFile一分为二,而且region也会一分为二,region的分裂,不会分到其他的机器上面去
读取流程
-
客户端发起请求,读取数据,连接zk
-
获取zk当中一张特殊表hbase:meta表数据
-
与对应表所咋子的regionServer进行通信,进行数据查询
读取或者写入数据:全程没有HMaster的参与
Hbase当中三个重要机制
-
Flush机制:数据从memoryStore到storeFile
-
Compact机制:数据从storeFile到HFile
-
Split机制:将HFile一分为二
Hbase当中rowkey的设计
1、rowkey的长度原则: rowkey最大的长度64KB,实际工作当中,一般10-100字节,不宜过长,在可能的前提下,越短越好
2、rowkey的散列原则:
- 尽量设计rowkey实现将数据均匀的分布到不同的region里面去,不要出现所有的数据都去往了某一个region
- rowkey都是按照字典顺序进行排列的,hbase数据究竟存储到哪一个region里面去的时候,会比较rowkey高几位 数据
- 随机字符串_15897845612/随机字符串_15894561235
- 实现将数据均匀保存到不同的region里面去
3、rowkey的唯一原则:rowkey不能重复,如果重复,就会出现数据覆盖情况 尽量将统一类型的数据,存放到同一个region里面去,便于我们查找数据
如何解决rowkey的热点问题—即数据倾斜问题
1、加盐 ==> 给rowkey加上随机的前缀的字符串
2、取 hashCode 码值,保证同一行数据,永远使用相同的前缀加盐
3、rowkey的反转 15894651235 ==> 反转 53215649851 15874563214 ==> 反转 41236547851
4、时间戳反转 每条数据都会有一个时间戳 时间戳的前缀都一样,可以将时间戳进行反转