1 阐述Hbase写数据流程
前提是主节点maser正常开启
1 首先客户端发送写数据, 请求zk写,zk找寻meta元数据位置,
2返回给客户端meta位置
3客户端拿到meta解析put数据rk在哪个region上,请求regionserver获取元素表
4 下载到客户端本地,方便下次直接拿取
5 客户端请求rs写入 put 'a' , 'rk001' ....
6 在rs 中写入, 操作写入日志文件, 数据写入store,写进本地memstore ,
然后1 单个文件达到128M 会默认flush到hdfs
2 经过人为将数据flush到hdfs,
3 hbase会经过一段时间flush到hdfs
4 节点的内存到达阀值也会flush到hdfs
(包括日志文件)
2 阐述hbase读数据流程
1客户端发送读的请求到zk ,zk返回元数据的位置信息
2 解析meta拿到元数据位置,请求rs获取元数据表
3 元数据下载到本地
4 解析 然后请求对应的rs读取数据
5 到rs节点上1 首先找寻region的memstore文件看有没有,
2 没有到缓存中找,
3 再没有就请求hdfs获取
hdfs中有很多文件怎样找寻的呢?
1 存储时设计二级索引,相对会快一点,但是没有到达很快
2 hfile 文件底层有算法查询速度贼快,布隆过滤器,在hfile文件中会开辟一段空间给布隆,布隆底层其实和hashmap差不多,他是将拿到的rk进行hash算法得到数值然后在空间中找到位置,看是1还是0 ,1是可能有(因为有几率很小的hash碰撞,导致数据误判),0是一定没有,这样查找非常快,去hflie找rk位置
6 找到就开始读取
想了解布隆过滤器算法的可以观看博客 https://blog.youkuaiyun.com/houzuoxin/article/details/20907911
3 什么是二级索引, 意义何在 ,怎么使用
二级索引其实说白了就是一个表的最简单好查索引对应的value是另一个索引 , 查询要比单索引快
假如有一个电影类型的表,电影名movie , 时间戳 timestamp , 评分 rate ,用户uid
设计索引一般是,电影名+时间戳或者uid+时间 ,uid+电影名+时间,不同的需求有不同的设计模式,rk的设计关系到查询的快慢,还要避免热点问题,查询热点和插入热点,你是查询多还是插入多
但是要求需要特别快速时,那我们就开始使用二级索引了,
写一个简单的二级索引
rk设计成uid_时间 对应的value是电影_时间\
value又是下一级的rk 对应的值是所有信息,movie,timestamp,rate,uid
这样一来查询非常快,先查询uid+时间比如u001_529209 对应到992_298345
992_298345 对应992,4288543,5分,u001 这样就很快,降低了重复率
4 Hbase中的rowkey是什么,怎么设计
rowkey设计很关键,这直接影响到查询,
1 RK是一行的唯一标识
2 在写数据的时候 数据会写到memstore (按rk升序排列)写到hdfs中是有序得
3 在磁盘中数据存储的位置 关键就是rowkey
5 hflie中的数据 以rk建立索引
5 put数据到region中 确定数据的位置根据 startkey endkey
6 查询时 依靠rowkey
rowkey设计尽量不要太长也不要重复率特别高,
Rowkey是一个二进制码流,Rowkey的长度被很多开发者建议说设计在10~100个字节,不过建议是越短越好,不要超过16个字节。
原因如下:
(1)数据的持久化文件HFile中是按照KeyValue存储的,如果Rowkey过长比如100个字节,1000万列数据光Rowkey就要占用100*1000万=10亿个字节,将近1G数据,这会极大影响HFile的存储效率;
(2)MemStore将缓存部分数据到内存,如果Rowkey字段过长内存的有效利用率会降低,系统将无法缓存更多的数据,这会降低检索效率。因此Rowkey的字节长度越短越好。
(3)目前操作系统是都是64位系统,内存8字节对齐。控制在16个字节,8字节的整数倍利用操作系统的最佳特性。
根据业务避免热点问题
rowkey 可以是 前缀_时间 前缀_id_时间 反转前缀
5 什么是HBASE热点问题 如何避免
热点问题是同一时间大量查询上传下载在一台机器region上,也是并发问题
1 rowkey设计合理,
2 根据业务避免设计,业务是查询多还是插入多
3 加配置 ,内存(这个操作就比较溜了)
4 拆分region