列式存储、Hbase、Kylin

列式存储: 区别于传统的行式存储,在存储层,把同一列的数据放在一起,利于聚合查询,不利于明细查询、INSERT/UPDATE等。

Hbase: 列式存储的一种实现

组成部件说明:

Row Key:    Table主键 行标识
Timestamp:    每次对数据操作对应的时间戳,即数据的version number(Hbase无法update,每次操作都是追加)
Column Family: 列簇,一个table在水平方向有一个或者多个列簇,列簇可由任意多个Column组成,可动态扩展,无须预定义数量及类型,二进制存储,用户需自行进行类型转换

逻辑视图:

概念视图

物理视图:

物理视图 

 系统架构

  • Table中所有行都按照row key的字典序排列;
  • Table在行的方向上分割为多个Region;
  • Region按大小分割的,每个表开始只有一个region,随着数据增多,region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region,之后会有越来越多的region;
  • Region是Hbase中分布式存储和负载均衡的最小单元,不同Region分布到不同RegionServer上。
  • Region是分布式存储的最小单元,不是存储的最小单元。在每台机器上Region由一个或者多个Store组成,每个store保存一个columns family;每个Strore又由一个memStore和0至多个StoreFile组成,StoreFile包含HFile;memStore存储在内存中,StoreFile存储在HDFS上。

Kylin: 以hbase为存储,维度做RowKey,指标做列族,支持SQL查询的预计算服务

Rowkey可以理解为“索引”,如:0001111是把维度ABCD作为索引的一份数据集,1110001是把维度AEFG作为索引的一份数据集....

每一种“索引”都包含了全量数据,称之为一个cuboid,如:原数据集大小为1G,有7个维度,那么预计算所有维度的结果集大小将是128G

正常的业务生产中不可能需要预计算所有维度,并且维度与维度间有可能还有内在关系(如:省市区),所以维度爆炸的问题可以通过kylin的剪枝策略避免

剪枝策略是基于业务场景和维度间的关系等多种因素减少cuboid个数的一种思路,目前Kylin可以使用的维度优化手段有以下几种:

  • 聚集组
  • 衍生纬度(如:cityName之于cityId)
  • 强制维度(如:很多业务场景都是按天查询的,datekey便可设为强制维度,可以把cuboid的个数由128直接降为64)
  • 层次维度(如:省-市-区)
  • 联合维度(类似于联合索引,业务上一定会一起作为条件去查询的几个维度)
  • Extended Column

待学习补充:

列式存储中的压缩存储、非精确去重、hyperloglog、bitmap

猜你喜欢

转载自www.cnblogs.com/morningao/p/10315253.html
今日推荐