大数据培训_W HBase 高级用法之行健设计
发布时间:
2019-05-30 14:30:04
大数据培训_W HBase 高级用法之行健设计
1.热点问题
写入要分散,减少region的热点问题。
例如: 历史交易订单,一般生成的订单号都是通过时间戳+随机的4位数字组成,可以让订单号倒序。这样rowkey是订单号的倒序存储,减少集中存储到某个region。
例如:用户上网流量存储到Hbase,一般是让手机号作为hbase的rowkey。由于手机号的后四位是随机的。可以让手机号倒序排序作为hbase的rowkey。
思考问题:
直接将时间戳作为行健, 在写入单个 region 时候会发生热点问题,为什么?
回答: 直接使用时间戳会引发单个region的热点问题。
HBase的rowkey在底层是HFile存储数据的,以<K,V>键值对存放到SortedMap中。并且region中的rowkey是有序存储,若时间比较集中。就会存储到一个region中,这样一个region的数据变多,其它的region数据很好,加载数据就会很慢。直到region分裂可以解决。
2.行健设计
在HBase中有两类基本的键结构:行健和列键
这两者都存储着有意义的信息,不仅仅是该键对应的值:
列键:包括了列族名和限定符,定位到列的索引
行健:相当于关系型数据库中的主键,通过行健得到逻辑布局中一行的所有列
逻辑上用户设置的每一行都没放在一起,但是实际存储的时候每个列族的以单独的文件存储的,不同列族的单元格绝对不会出现在同一个StoreFile中。同时,HBase也不会存储值为空的单元格,所以磁盘上的文件也只有这些有值的单元格。
每个单元格在实际存储的时候也保存了行健和列键,所以每个单元格都单独存储了它在表中所处位置的关键信息。
同一个单元格的不同版本被单独存储为连续的单元格,单元格按照时间戳降序排列,所以默认读取的是最新的单元格数据。
同一列族的单元格在存储的时候先按行健排序,当一行中有多个单元格的时候再按列键排序,同一单元格有多个版本的时候按时间戳排序
根据以上的存储特性,建议在查询的时候指定列族信息可以有效减少查询的存储文件,提高效率
3.行键设计的关键要点
(1)存储方式:磁盘上一个列族下所有的单元格都存储在一个存储文件(store file)中,不同列族的单元格不会出现在同一个存储文件中。
(2)NULL 不会存储在HBase表中。
(3)每个单元格在实际存储时也保存了行健和列键,即单独存储了它在表中所处位置的相关信息。
(4)同一个单元格的多个版本被单独存储为连续的单元格,单元格按照时间戳降序排列。故在HFile读取时候,最新的值先被读到。
(5)单元格的KeyValue内容:行健、列族、列限定符、时间戳、值。KeyValue存储先按照行健排序,再按列键排序。
(6)对于KeyValue,筛选的效率从左到右变差:行健、列族、列限定符、时间戳、值。故而尽量将重要的筛选信息左移。
上一篇:
Java培训_Java NIO的缓冲区介绍
下一篇:
Python培训_Python开发环境搭建