8、hbase数据flush过程
① 当MemStore数据达到阈值(默认是128M,老版本是64M),把数据刷到硬盘,将内存中的数据删除,同时删除HLog中的历史数据。
② 将数据存储到HDFS中。
③ 在HLog中做标记点。
9、数据合并过程
① 当数据块达到4块,hmaster将数据块加载到本地,进行合并。
② 当合并的数据超过256M,进行拆分,将拆分后的region分配给不同的hregionserver管理。
③ 当hregionser宕机后,将hregionserver上的hlog拆分,然后分配给不同的hregionserver加载,修改.META。
注意:hlog会同步到hdfs
10、Hmaster和Hgionserver的职责
Hmaster的职责
① 管理用户对Table的增、删、改、查操作。
② 记录region在哪台Hregion server上。
③ 在Region Split后,负责新Region的分配。
④ 新机器加入时,管理HRegion Server的负载均衡,调整Region分布。
⑤ 在HRegion Server宕机后,负责失效HRegion Server 上的Regions迁移。
Hgionserver的职责
① HRegion Server主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBASE中最核心的模块。
② HRegion Server管理了很多table的分区,也就是region。
11、HBase列族和region的关系
HBase有多个RegionServer,每个RegionServer里有多个Region,一个Region中存放着若干行的行键以及所对应的数据,一个列族是一个文件夹,如果经常要搜索整个一条数据,列族越少越好,如果只有一部分的数据需要经常被搜索,那么将经常搜索的建立一个列族,其他不常搜索的建立列族检索较快。
12、请简述Hbase的物理模型是什么?
13、如果使用Hbase做即席查询,如何设计二级索引?
14、如何避免读、写HBase时访问热点问题?
① 加盐
这里所说的“加盐”,不是密码学中的“加盐”,而是在rowkey的前面增加随机数。具体就是给rowkey分配一个随机前缀,使得它和之前的rowkey的开头不同。
那么,给多少个前缀?这个数量应该和我们想要分散数据到不同的region的数量一致(类似hive里面的分桶)。
更通俗易懂的理解:region数量是一个范围,我们给rowkey分配一个随机数,前缀(随机数)的范围是region的数量。
加盐之后的rowkey就会根据随机生成的前缀分散到各个region上,以避免热点。
② 哈希
哈希会使同一行永远用一个前缀加盐。哈希也可以使负载分散到整个集群,但是读却是可以预测的。使用确定的哈希可以让客户端重构完整的rowkey,可以使用get操作准确获取某一个行数据。
③ 反转
第三种防止热点的方法是“反转”-固定长度或者数字格式的rowkey。这样可以使得rowkey中经常改变的部分(最没有意义的部分)放在前面。这样做可以有效的随机rowkey,但是牺牲了rowkey的有序性。
反转rowkey的例子:以手机号为rowkey,可以将手机号反转后的字符串作为rowkey,从而避免诸如139、158之类的固定号码开头导致的热点问题。
④ 时间戳反转
一个常见的数据处理问题是如何快速获取数据的最近版本,使用反转的时间戳作为rowkey的一部分对这个问题十分好解。可以用Long.Max_Value – timestamp追加到key的末尾,例如[key][reverse_timestamp],[key] 的最新值可以通过scan [key]获得[key]的第一条记录,因为HBase中rowkey是有序的,第一条记录是最后录入的数据。
⑤ 减少行和列的大小
在HBase中,value永远和它的key一起传输的。当具体的值在系统间传输时,它的rowkey,列名,时间戳也会一起传输。如果你的rowkey和列名很大,HBase storefiles中的索引(有助于随机访问)会占据HBase分配的大量内存。因为具体的值和它的key很大。此时,可以增加block大小,使得storefiles索引再更大的时间间隔增加,或者修改表的模式以减小rowkey和列名的大小。压缩也有助于更大的索引。
⑥ 其他办法
列族名的长度尽可能小,最好是只有一个字符。冗长的属性名虽然可读性好,但是更短的属性名存储在HBase中会更好。也可以在建表时预估数据规模,预留region数量,例如create ‘myspace:mytable’, SPLITS => [01,02,03,…99]。
我是IT鸣人,喜欢我的文章欢迎 转发 及 关注
如果你在学习过程中或者择业时有什么问题和困惑,欢迎私信或留言。