大数据Kylin:Kylin创建cube

Posted Lansonli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据Kylin:Kylin创建cube相关的知识,希望对你有一定的参考价值。

文章目录

Kylin创建cube

一、​​​新建项目

二、​​​​​​​同步Hive表

三、新建 Data Model

四、新建 Cube


Kylin创建cube

一、​​​新建项目

1、由顶部菜单栏进入 Model 页面,然后点击 Manage Projects。

 

2、点击“+Project”按钮添加一个新的项目。 

3、填写下列表单并点击submit按钮提交请求。

 

4、成功后,底部会显示通知。

二、​​​​​​​​​​​​​​同步Hive表

1、在顶部菜单栏点击 Model,然后点击左边的Data Source标签,它会列出所有加载进 Kylin 的表,点击 Load Table 按钮。

2、输入表名并点击 Sync 按钮提交请求。

3、【可选】如果你想要浏览 hive 数据库来选择表,点击 Load Table From Tree 按钮。

4、【可选】展开数据库节点,点击选择要加载的表,然后点击 Sync 按钮。

5、成功的消息将会弹出,在左边的 Tables 部分,新加载的表已经被添加进来。点击表将会展开列。

6、在后台,Kylin 将会执行 MapReduce 任务计算新同步表的基数(cardinality),任务完成后,刷新页面并点击表名,基数值将会显示在表信息中。

三、新建 Data Model

创建 cube 前,需定义一个数据模型。数据模型定义了一个星型(star schema)或雪花(snowflake schema)模型。一个模型可以被多个 cube 使用。

 1、点击顶部的 Model ,然后点击 Models 标签。点击 +New 按钮,在下拉框中选择 New Model。

2、输入 model 的名字和可选的描述。

3、在 Fact Table 中,为模型选择事实表。

4、【可选】点击 Add Lookup Table 按钮添加一个 lookup 表。选择表名和关联类型(内连接或左连接)

5、点击 New Join Condition 按钮,左边选择事实表的外键,右边选择 lookup 表的主键。如果有多于一个 join 列重复执行。

 

6、点击 “OK”,重复4,5步来添加更多的 lookup 表。完成后,点击 “Next”。

7、Dimensions 页面允许选择在子 cube 中用作维度的列,然后点击Columns列,在下拉框中选择需要的列。

8、点击 “Next” 到达 “Measures” 页面,选择作为 measure 的列,其只能从事实表中选择。

9、点击 “Next” 到达 “Settings” 页面,如果事实表中的数据每日增长,选择 Partition Date Column 中相应的 日期列以及日期格式,否则就将其留白。

10、【可选】选择是否需要 “time of the day” 列,默认情况下为 No。如果选择 Yes, 选择 Partition Time Column 中相应的 time 列以及 time 格式

11、【可选】如果在从 hive 抽取数据时候想做一些筛选,可以在 Filter 中输入筛选条件。

12、点击 Save 然后选择 Yes 来保存 data model。创建完成,data mod就会列在左边 Models 列表中。

 

四、新建 Cube

创建完 data model,可以开始创建 cube。点击顶部 Model,然后点击Models 标签。点击 +New 按钮,在下拉框中选择 New Cube。

步骤1、Cube 信息

选择 data model,输入 cube 名字;点击 Next 进行下一步。cube 名字可以使用字母,数字和下划线(空格不允许)。Notification Email List 是运用来通知job执行成功或失败情况的邮箱列表。Notification Events 是触发事件的状态。

步骤2、维度

点击 Add Dimension,在弹窗中显示的事实表和 lookup 表里勾选输入需要的列。Lookup Table的维度可以设置为Normal(普通维度)或者Derived(衍生维度)两种类型,默认设置为衍生维度,衍生维度代表该列可以从所属维度表的主键中衍生出来,所以实际上只有主键列会被Cube加入计算。

选择所有维度后点击 “Next”。

衍生维度优化:

在kylin中,事实表与维度表关联时,类似使用主外键关联,事实表中有“外键-FK”,维度表中有“主键-PK”,如果在事实表中选择了FK为一个维度,那么相关的PK将自动查询,没有任何额外的开销。原因是:FK与PK总是相同的,FK可以由PK透明的替换。

以上“用户订单表”中的A维度与“地区维度表”中的D维度就是FK与PK的关系。在“地区维度表”中每个时间编号D对应一个季度F,那么只要D维确定,F维一定确定,也就是说可以由D维获取F维数据,F维度就称为“衍生维度”。这种维度不参与cube的构建,可以直接由主外键关联关系获取出来。

根据以上例子,如果我们要统计分析“每季度的订单总金额”这个需求,如果不使用衍生维度,那么构建的维度组合如下【注意:由于维度数量多,这里用户订单表中暂时考虑A、B两个维度,地区维度表考虑F一个维度,这里主外键关联列为A=D】:

ABF、AB、AF、BF、A、B、F,我们这里需要的就是F这个维度对应的M总结果。

如果将F设置为衍生维度,这里可以由D维度衍生推出F维度,那么构建的维度组合如下:

AB、A、B 。这里看似没有我们需要的F维度对应的M结果,实际上我们可以根据A维度下对应的M结果进一步聚合得到F维度对应的M结果。其过程如下:

虽然衍生维度具有很大的吸引力,但是并不代表所有维度表上的维度都可以编程衍生维度,如果从维度表主键到某个维度表维度所需要的聚合工作量很大,例如:统计每年E订单金额M,基本上需要365:1的聚合量,那么可以将E设置成为一个基本维度,而不是一个衍生维度更合适。这里建议如果维度表中主键维度与某些维度是一对一的关系可以将这些维度设置成为衍生维度,如果不是一对一关系就需要根据业务情况决定。

步骤3、度量

1、点击 +Measure 按钮添加一个新的度量。

根据它的表达式共有8种不同类型的度量:SUM、MAX、MIN、COUNT、COUNT_DISTINCT TOP_N, EXTENDED_COLUMN 和 PERCENTILE。请合理选择 COUNT_DISTINCT 和 TOP_N 返回类型,它与 cube 的大小相关。 

  • SUM

  • MIN

  • MAX

  • COUNT

  • DISTINCT_COUNT

这个度量有两个实现:

  1. 近似实现 HyperLogLog,选择可接受的错误率,低错误率需要更多存储
  2. 精确实现 bitmap

注意:distinct 是一种非常重的数据类型,和其他度量相比构建和查询会更慢。

  • TOP_N

TopN 度量在每个维度结合时预计算,它比未预计算的在查询时间上性能更好;需要两个参数:一是被用来作为 Top 记录的度量列,Kylin 将计算它的 SUM 值并做倒序排列;二是 literal ID,代表最 Top 的记录,例如 seller_id;

合理的选择返回类型,将决定多少 top 记录被监察:top 10, top 100, top 500, top 1000, top 5000 or top 10000。
注意:如果您想要使用 TOP_N,您需要为 “ORDER | SUM by Column” 添加一个 SUM 度量。例如,如果您创建了一个根据价格的总和选出 top100 的卖家的度量,那么也应该创建一个 SUM(price) 度量。

  • EXTENDED_COLUMN

Extended_Column 作为度量比作为维度更节省空间。在OLAP分析场景中,经常对某个id进行过滤,但结果需要展示name的情况,比如:uid和name两列,查询时可能会有如下语句:“select uid,name ,count(*) from table where uid = 1 group by uid,name”。以上可以将uid和name设置成两个维度,但是会导致维度增多,导致结果膨胀。也可以将uid和name设置成联合维度,但是限制了维度的其他优化,例如,uid不能再被设置成强制维度或者层次维度。这里可以设置uid为维度,name为Extended_Column(扩展度量),这种方式可以保证过滤uid并且查询name的需求。此类需求推荐使用extended_column。

  • PERCENTILE

Percentile 代表了百分比。100为最合适的值。

 步骤4、更新设置

这一步骤是为增量构建 cube 而设计的。

  • Auto Merge Thresholds:

自动合并小的 segments 到中等甚至更大的 segment。如果不想自动合并,删除默认2个选项。

  • Volatile Range:

默认为0,会自动合并所有可能的 cube segments,或者用 ‘Auto Merge’ 将不会合并最新的 [Volatile Range] 天的 cube segments。

  • Retention Threshold:

只会保存 cube 过去几天的 segment,旧的 segment 将会自动从头部删除;0表示不启用这个功能。

  • Partition Start Date: 

cube 的开始日期。

 

步骤5、 高级设置Kylin优化

  • Aggregation Groups:

默认 kylin 构建cube时会把所有维度放在一个聚合组,当维度较多时,产生的组合数可能是巨大的。例如维度有20个时,构建cube时,cuboid的个数将是2的20次方个,很容易会造成 Cube 爆炸,实际上查询可能使用到的cuboid的个数很少,这时就需要Cuboid的优化。Cube 中的维度可以划分到多个聚合组中,如果你很好的了解你的查询模式,那么你可以创建多个聚合组。在每个聚合组内,使用 “Mandatory Dimensions”, “Hierarchy Dimensions” 和 “Joint Dimensions” 来进一步优化维度组合。

Mandatory Dimensions: 必要维度,用于总是出现的维度。例如,如果你的查询中总是会带有 “ORDER_DATE” 做为 group by 或 过滤条件, 那么它可以被声明为必要维度。这样一来,所有不含此维度的 cuboid 就可以被跳过计算。例如有三个维度A、B、C,构建cube与将其中一个维度设置为强制维度,cuboid的个数将会减少,构建出的Cube如图:

Hierarchy Dimensions: 层级维度,例如 “国家” -> “省” -> “市” 是一个层级;不符合此层级关系的 cuboid 可以被跳过计算,例如 [“省”], [“市”]。定义层级维度时,将父级别维度放在子维度的左边。举例:例如A->B->C符合层级维度,构建出的cube如下:

Joint Dimensions:联合维度,有些维度查询时往往一起出现,可以将查询时很少使用并且基数关系为1:1的几个列设置成联合维度。例如 “user_id” 和 “email”。把多个维度定义为组合关系后,所有不符合此关系的 cuboids 会被跳过计算,也会减少Cube中cuboid的个数。举例:有维度A、B、C,B、C设置为联合维度,构建cube如下:

  • Rowkeys:

RowKeys是由维度编码值组成。”Dictionary” (字典)是默认的编码方式; 字典只能处理中低基数(少于一千万)的维度;如果维度基数很高(如大于1千万), 选择 “fix_ed_length” 然后为维度输入合适的长度,通常是那列的最大长度值; 如果超过最大值,会被截断。请注意,如果没有字典编码,cube 的大小可能会非常大。“shard by”维度列,可以针对基数高的维度做分片,可以使MR在构建Cube过程中按照该列进行重新分布,加快构建速度。

你可以拖拽维度列去调整其在 rowkey 中位置,位于rowkey前面的列,将可以用来大幅缩小查询的范围。通常建议将查询频率高基数比较大的维度在rowkey中的顺序应该越靠前,这样为了提高查询效率及防止数据在Hbase中有倾斜。

  • Mandatory Cuboids:

 维度组合白名单。确保你想要构建的 cuboid 能被构建。

  • Cube Engine:

cube 构建引擎。有两种:MapReduce 和 Spark。如果你的 cube 只有简单度量(SUM, MIN, MAX),建议使用 Spark。如果 cube 中有复杂类型度量(COUNT DISTINCT, TOP_N),建议使用 MapReduce。

  • Advanced Dictionaries:

“Global Dictionary” 是用于精确计算 COUNT DISTINCT 的字典, 它会将一个非 integer的值转成 integer,以便于 bitmap 进行去重。如果你要计算 COUNT DISTINCT 的列本身已经是 integer 类型,那么不需要定义Global Dictionary。Global Dictionary 会被所有 segment 共享,因此支持在跨 segments 之间做上卷去重操作。请注意,Global Dictionary 随着数据的加载,可能会不断变大。

“Segment Dictionary” 是另一个用于精确计算 COUNT DISTINCT 的字典,与 Global Dictionary 不同的是,它是基于一个 segment 的值构建的,因此不支持跨 segments 的汇总计算。如果你的 cube 不是分区的或者能保证你的所有 SQL 按照 partition_column 进行 group by, 那么你应该使用 “Segment Dictionary” 而不是 “Global Dictionary”,这样可以避免单个字典过大的问题。

请注意:”Global Dictionary” 和 “Segment Dictionary” 都是单向编码的字典,仅用于 COUNT DISTINCT 计算(将非 integer 类型转成 integer 用于 bitmap计算),他们不支持解码,因此不能为普通维度编码。

  • Advanced Snapshot Table:

为全局 lookup 表而设计,提供不同的存储类型。

  • Advanced ColumnFamily: 

如果有超过一个的COUNT DISTINCT 或 TopN 度量, 你可以将它们放在更多列簇中,以优化与HBase 的I/O。

步骤6、重写配置

Kylin 允许在 Cube 级别覆盖部分 kylin.properties 中的配置,你可以在这里定义覆盖的属性。如果你没有要配置的,点击 Next 按钮。

步骤7、概览 & 保存

你可以概览你的 cube 并返回之前的步骤进行修改。点击 Save 按钮完成 cube 创建。

恭喜,到此为止,cube 创建完成。


  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨

以上是关于大数据Kylin:Kylin创建cube的主要内容,如果未能解决你的问题,请参考以下文章

大数据Kylin:Kylin构建Cube实战

大数据Kylin:Kylin构建Cube算法

大数据分析平台Apache Kylin的部署(Cube构建使用)

大数据量多维分析项目Kylin调研二期

六十四Kylin的初体验

六十五Kylin Cube的构建