南七星之家 发表于 2024-10-20 13:49:13

大数据-165 Apache Kylin Cube优化 案例 2 定义衍生维度及对比 & 聚合组 &

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:



[*]Hadoop(已更完)
[*]HDFS(已更完)
[*]MapReduce(已更完)
[*]Hive(已更完)
[*]Flume(已更完)
[*]Sqoop(已更完)
[*]Zookeeper(已更完)
[*]HBase(已更完)
[*]Redis (已更完)
[*]Kafka(已更完)
[*]Spark(已更完)
[*]Flink(已更完)
[*]ClickHouse(已更完)
[*]Kudu(已更完)
[*]Druid(已更完)
[*]Kylin(正在更新…)
章节内容

上节我们完成了如下的内容:


[*]Cube 剪枝优化
[*]检查 Cube 数量、大小
[*]案例 1:定义衍生维度及对比(团体详细流程)
https://i-blog.csdnimg.cn/direct/2d160b48d1fd4673a5b454e5e6e6ad6b.png
定义Cube7

省略Model等操作。
构建前面Cube4类似的Cube7,仅在维度定义有区别。(我这里是Clone Cube4,然后修改的)
wzk_test_kylin_cube_7的字段中,都是Normal:
https://i-blog.csdnimg.cn/direct/b6daad62fd5c4ca9abdbaadc376656c3.png
天生的如下图:
https://i-blog.csdnimg.cn/direct/b18239ccebe4459fafbfc276827694e0.png
构建Cube7

https://i-blog.csdnimg.cn/direct/40b8ed31324042d7ba2badc247627f6b.png
大小对比

查看Size的对比:
由于之前数据太多跑的太慢,我的 cube-4 是125条数据占用22KB,我的cube-7是15条占用9KB。
https://i-blog.csdnimg.cn/direct/3c3fe017e2d642679fd52b6fbdea76bb.png
大抵可以估计出来,cube-7的大小要比cube-4的大小大很多(假如同数据量的话)
精度对比

wzk_kylin_test_cube_4

kylin.sh org.apache.kylin.engine.mr.common.CubeStatsReader wzk_kylin_test_cube_4
对应的信息如下:
https://i-blog.csdnimg.cn/direct/620d2fe69a9a4de593b05dfa02e635d8.png
wzk_kylin_test_cube_7

kylin.sh org.apache.kylin.engine.mr.common.CubeStatsReader wzk_kylin_test_cube_7
对应的信息如下:
https://i-blog.csdnimg.cn/direct/e51d557aac4345b89f07fe5392b40251.png
聚合组

随着维度数目标增长,Cuboid的数量会爆炸式的增长,为了缓解Cube的构建压力,Apache Kylin 引入了一系列高级的设置,资助用户筛选出真正需要的Cuboid(本质是要镌汰Cube构建过程中的预盘算),这些高级设置包罗:


[*]聚合组(Aggregation Group)
[*]逼迫维度(Mandatory Dimension)
[*]层级维度(Hierachy Dimension)
[*]联合维度(Joint Dimension)
https://i-blog.csdnimg.cn/direct/f5a7d2b46a274f2fab5420e0e4e9c6be.png
默认Kylin会把全部维度放在同一个聚合组中
假如维度数较多(如维度数>15),发起用户根据查询的风俗和模式,将维度分布到多个聚合组中。通过使用多个聚合组,可以大大降低Cube中的Cuboid数量。
如一个Cube有(M+N)个维度:


[*]这些维度放在一个聚合组中,默认有2^(M+N)个Cuboid
[*]将这些维度分为两个不相交的聚合组,第一个组有M个维度,第二个组有N个维度。那么Cuboid的总数为(2^M + 2^N)个维度
[*]一个维度可以出如今多个聚合组中
在单个组合组中,可以对维度设置一些高级属性,包罗逼迫思维、层级维度、联合维度。一个维度只能出如今一个属性组中。
构建N个维度的Cube会天生的2^N个Cuboid,如下图所示,构建一个4个维度(A、B、C、D)的Cube,需要天生16个Cuboid。
https://i-blog.csdnimg.cn/direct/56ebf241bf3c42c19153f75138bf7efd.png
根据用户关注的维度组合,可以维度分别差别的组合类,这些组合类在Kylin中被称为聚合组,如用户仅仅关注维度AB组合和维度CD组合,那么该Cube则可以被分化成两个聚合组,分别是聚合组AB和聚合组CD。天生的Cuboid数目从16个缩减为8个。
https://i-blog.csdnimg.cn/direct/bb95100b110c42629bab9c075265a597.png
用户关心的聚合组之间可能包含相同的维度,如聚合组ABC和聚合组BCD都包含维度B和维度C,这些聚合组之间会衍生相同的Cuboid。聚合组ABC会产生Cuboid BC,聚合组BCD也会产生Cuboid BC。
这些Cuboid不会重复天生,一份Cuboid为这些聚合组所共有。
https://i-blog.csdnimg.cn/direct/270339a889824036a9a16037bef4b8af.png
有了聚合组就可以粗粒度的对Cuboid进行筛选,获取本身想要的维度组合。Kylin的建模需要业务专家参数。
逼迫维度(Mandatory Dimension)

逼迫/须要 维度:指的是那些总会出如今Where条件或Group By语句中的维度。
通过指定某些维度为逼迫维度,Kylin不预盘算那些不包含此维度的Cuboid,从而镌汰盘算量。
维度A是逼迫维度,那么天生的Cube如下图所示,维度数从16变成9。
https://i-blog.csdnimg.cn/direct/85f2fea43a984422913f2479a43bfe09.png
层级维度(Hierachy Dimension)

层级维度:是指一组有层级关系的维度
维度中常常会出现具有层级关系的维度,例如:国家、省份、城市这三个维度,从上而下来说:国家/省份/城市之间分别是一对多的关系。假设维度A代表国家,维度B代表省份,维度C代表城市,ABC三个维度可以被设置为层级维度,天生的Cube如下图所示:
https://i-blog.csdnimg.cn/direct/89dac627eb6a420e9895ba6170079ae5.png
Cuboid = Cuboid, Cuboid = Cuboid,因而Cuboid 和 Cuboid 就不必重复存储。
联合维度(Joint Dimension)

联合维度:是将多个维度视作一个维度,在进行组合盘算的时候,它们要么一起出现,要么均不出现。
通常实用于以下几种情形:


[*]总是在一起查询的维度
[*]彼此之间有一定映射关系,如USER_ID和EMAIL
[*]基数很低的维度,如性别、布尔范例的属性
维度的基数:维度有多少个差别的值。
联合维度并不关心维度之间各种细节的组合方式,如用户查询语句中仅仅会出现GROUP BY A,B,C,而不会出现GROUP BY A、B大概GROUP BY C等等这细化的维度组合。这一类题目就是联合维度所办理的题目。
例如将A、B、C定义为联合维度,Apache Kylin就仅仅构建Cuboid ABC,而Cuboid AB、BC、A等等Cuboid都不会被天生,最终Cube结果如下图所示的,Cuboid数目从16镌汰到4:
https://i-blog.csdnimg.cn/direct/8f48d21917fc4fb9bd383f0b58e6768d.png
总结内容



[*]在单个聚合组中,可以对维度进行设置,包罗逼迫维度、层级维度、联合维度。
[*]逼迫维度:指的是那些总会出如今Where条件大概GROUP BY子句中的维度
[*]层级维度:一组具有层级关系的维度(如:国家、省、市)
[*]联合维度:将多个维度看成一个角度,要么一起出现,要么都不出现
RowKeys

简朴的说Cuboid的维度会映射为HBase的Rowkey,Cuboid的指标会映射为HBase的Value。
https://i-blog.csdnimg.cn/direct/c7986224139c43d7a6bf953dff1998a5.png


[*]如上图原始表所示:Hive表有两个维度列year、city,有一个指标列 price。
[*]如上图预聚合表所示:我们具体要盘算的是year和city这两个维度全部维度组合(即4个cuboid)下的sum(prices)指标,这个指标的具体盘算过程就由MapReduce完成的。
[*]如上图的字典编码所示:为了节流存储资源,Kylin对维度值进行了字典编码,图中将beijing和shanghai依次编码0和1。
[*]如上图HBase KV存储所示:在盘算Cuboid过程中,会将Hive表的数据转换为HBase的KV形式。Rowkey的具体格式是 Cuboid id + 具体的维度值(最新的Rowkey中为了并发查询还加入了Shard Key),以预聚合表内容的第2举动列,其维度组合是(year,city),所以Cuboid id就是00000011,Cuboid是8位,具体维度值是1994和shanghai,所以编码后的维度值对应上图的字典编码也是11,所以HBase的Rowkey就是00000011,对应HBase Value就是sum(price)的具体值。
[*]全部的Cuboid盘算完成后,会将Cuboid转换为HBase的KeyValue格式天生HBase的HFile,末了将HFile Load进Cube对应的HBase表中。
https://i-blog.csdnimg.cn/direct/d95e2ee1a66742f285f00d4fa3f04589.png
编码

Kyelin以Key-Value的方式将Cube存储到HBase中,HBase的Key就是Rowkey,是由各维度的值拼接而成的,为了更高效的的存储这些值,Kylin会对它们进行编码和压缩,每个维度均可以选择合适的编码方式,为了更搞笑存储这些值,Kylin会对它们进行编码和压缩,每个维度均可以选择合适的编码方式,默认采用的是字典(Dictionary)编码技术。字段支持的基本编码范例如下:


[*]Dictionary 字典编码将全部此维度下的值构成一张映射表,从而大大节约存储空间,实用于大部门字段,默认推荐使用。Dictionary产生的编码非常紧凑,尤其在维度的值基数小且长度大的环境下,但在超高基环境下,可能引起内存不足的题目,在Kylin中字典编码允许的基数上限默认是500万(由参数kylin.dictionay.max.cardinality配置)
[*]boolean:实用于字段为:ture、false、TURE、FALSE、t、f、T、F、yes、no、YES、NO、y、n、Y、N、1、0
[*]date:实用于字段为日期字符,支持的格式包罗yyyyMMdd、yyyy-MM-dd、yyyy-MM-dd HH:mm:ss.SSS
[*]time:实用于字段为时间戳字符,支持范围为,,毫秒部门会被忽略,time编码实用于time、datetime、timestamp等范例
[*]fix_length:使用超高基环境,将选取字段的前N个字节为编码值,当N小于字段长度,会造成字段阶段,当N较大时,造成RowKey过长,查询性能下降,只实用于varchar、nvarchar范例
[*]fixed_length_hex:实用于字段为十六进制字符,比如1A2BFF大概FF00FF,每两个字符需要一个字节,只实用于varchar或nvarchar范例
序次

各维度在RowKeys中的序次,对于查询的性能会产生较显着的影响,在这里用户可以根据查询的模式和风俗,通过拖拽的方式调整各个维度在RowKeys上的序次,推荐的序次为:


[*]Mandatory 维度
[*]where 过滤条件中出现频率较多的维度
[*]高基数维度
[*]低基数维度放背面
[*]不常用的维度放在背面
这样做的好处是,充实使用过滤条件来缩小在HBase中扫描的范围,从而进步查询的效率。
分片

指定ShardBy的列,明细数据将按照该列的值分片,没有指定的ShardBy的列,则默认根据全部列中的数据进行分片,选择适当的ShardBy列,可以使明细数据较为匀称的分散在多个数据片上,进步并行性,进而获得更抱负的查询。
发起选择基数较大的列作为ShardBy列,以避免数据分散不匀称。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 大数据-165 Apache Kylin Cube优化 案例 2 定义衍生维度及对比 & 聚合组 &