THIS IS A TEST INSTANCE. ALL YOUR CHANGES WILL BE LOST!!!!

Apache Kylin : Analytical Data Warehouse for Big Data

Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Reverted from v. 5

...

接下来是动态调整阶段,也就是 Cube Planner 阶段。Cube Planner 分为两个阶段,第 1 阶段发生在初次构建 Cube 时,系统将根据预设的膨胀率目标,结合数据特征,选择收益比最高的 Cuboid 集合,然后仅存储构建收益比高的 Cuboid。接下来,当用户启用了 System Cube,并且使用了 Kylin 一段时候之后,就可以手动触发 Cube Planner 第二阶段,并且可以按照一定的时间间隔反复触发 Cube Planner 第二阶段,从而不断优化 Cube。在 Cube Planner 2 阶段,系统一般会推荐删除对业务没有意义的 Cuboid,并推荐增加业务查询常用的 Cuboid

Image RemovedImage Added

本文不介绍聚合组设置相关的内容,你可以查看 Apache Kyin 官方文档 http://kylin.apache.org/cn/docs/tutorial/create_cube.html 了解聚合组设置方法。下文将详细介绍 Cube Planner 相关的内容。

...

在参考文献中,构建收益比一般称为 BPUS(benefit per unit space),以下公式即为 Cube Planner 的通过贪心算法选择 Cuboid 核心思想:

Image RemovedImage AddedImage Removed

Image Added

相关资料:

http://www.vldb.org/conf/1998/p488.pdf

...

Recommend Cuboid List 记录在 Cube Desc 中的 cuboid_bytes 和 cuboid_bytes_recommend。

  • 如果未使用 Cube Planner,cuboid_bytes 和 cuboid_bytes_recommend 都是 null,系统将根据静态规则剪枝之后的 Cuboid List 构建 Cube。
  • 当开启 Cube Planner 并首次生成 Recommend Cuboid List 之后,将记录在 cuboid_bytes,之后系统将根据这个 List 构建 Cube。
  • 当进行 Cube Planner 第二阶段优化时,将推荐出新的 Recommend Cuboid List 并记录在 cuboid_bytes_recommend。当完成第二阶段优化后,将更新 cuboid_bytes 为最新的 List,同时重置 cuboid_bytes_recommend 的值为 null。接下来依然按照 cuboid_bytes 中记录的 List 构建 Cube。

Image RemovedImage Added

2.2 Cube Planner Whole Process

Image RemovedImage Added

前五步为 Cube Planner 阶段一,后五步为 Cube Planner 阶段二。

...

Cube Planner 通过两种算法计算构建收益比并推荐出 Recommend Cuboid List:贪心算法和基因算法,选择哪一种算法取决于静态规则设置之后的 Cuboid 个数。

  • Cuboid Count <= 2X ,跳过 Cube Planner,使用静态规则剪枝优化之后的 Cuboid List 构建 Cube
  • 2X < Cuboid Count < 2Y ,使用贪心算法推荐 Recommend Cuboid List
  • 2Y <= Cuboid Count ,使用基因算法推荐 Recommend Cuboid List
参数代替为默认值参数级别
kylin.cube.cubeplanner.algorithm-threshold-greedy X8Cube
kylin.cube.cubeplanner.algorithm-threshold-geneticY23Cube

...

Cube

...

...

下面通过一个例子详解贪心算法。

假设原始数据中有4列:ABCMABC 表示 3 个维度,M 表示度量,对于维度 ABC 来说,有 27 行不重复的数据,如下图所示:

...

假设已经通过参数设定提交构建后会使用贪心算法。在 Kylin 中,Base Cuboid 或者强制 Cuboid 一定会被构建,本例中我们假设没有强制 Cuboid,因此将 Base Cuboid 加入 Recommend Cuboid List。提交构建后,系统会预估每个 Cuboid 的行数和存储大小。查询开销为查询某一个 Cuboid 需要扫描的行数,本例中 Cuboid(ABC)Base Cuboid) 的行数为 27,则 Cuboid(ABC) 的查询开销为 27。假设仅构建 Base Cuboid,那么构建之后,对 Base Cuboid 以外的 Cuboid 的查询都将通过 Base Cuboid 来回答,因此它们的查询开销与 Base Cuboid 的查询开销相等,都是 27

Image RemovedImage Added

步骤2:第一轮迭代,将构建收益比最高的 Cuboid 加入 Recommend Cuboid List

...

因此 N=3B1=27-9=18B2=27-9=18B3=27-9=18Z=9。 Cuboid(AB) 的构建收益比 = (18+18+18) / 9 = 6

Image RemovedImage Added

接下来依次计算新增其他 Cuboid 的构建收益比,总结如下:

...

因此,本轮将 Cuboid(A) 加入 Recommend Cuboid List,此时 Cuboid(A) 的行数为 3,查询开销也为 3,其余未构建的 Cuboid 的查询开销依然为 Cuboid(ABC) 的查询开销,为 27

Image RemovedImage Added


步骤3:多轮迭代,得到最终的 Recommend Cuboid List

...

Cube 中可以有多个 Segments,每个 Segment 的数据可能存储在不同的 RPC 服务器中,当用户发送一条查询时,查询可能击中多个 Cube,扫描每个 Cube 下的多个 Segments,扫描每个 Segment 下面多个 RPC 服务器中存储的数据。那么对于发送的一条查询,每击中一个 Cube,在表 hive_metrics_query_qa 中记录一行数据。当查询击中 Cube,每扫描 Cube 下的一个 Segment,在表 hive_metrics_query_cube_qa 中记录一行数据。当查询需要扫描 Cube 下的一个 Segment,每扫描一个 RPC 服务器下的数据,在表 hive_metrics_query_rpc_qa 中记录一行数据。

Image RemovedImage Added

2.4.3 What have been recorded into hive

...

Hive 表及 System Cube 的更多介绍请查看 System Cube Introduction_CN

3. Tips about

...

Cube Pruning optimization

3.1 How to debug the calculation process of Cube Planner algorithm ?

...

  • 编辑 conf/kylin-server-log4j.properties,添加配置项logger.org.apache.kylin.cube.cuboid.algorithm=TRACE

  • 首次构建 Segment,或者点击 Optimize 优化 Cube 时,在终端 $KYLIN_HOME 目录下执行 cat logs/kylin.log | grep GreedyAlgorithm

  • 可以按照日期筛选,如增加 grep yyyy-MM-dd,例 cat logs/kylin.log | grep GreedyAlgorithm | grep 2020-12-01

图示

Image RemovedImage Added

3.2 How to check whether the user query metrics have been recorded in Hive ?

...

  • 修改配置文件 $KYLIN_HOME/tomcat/webapps/kylin/WEB-INF/classes/kylinMetrics.xml 中的配置项,“index=1” 的配置项表示批量(累计多少条数据必然会插入 Hive),“index=2” 的配置项表示时间间隔(累计多长时间必然会插入 Hive,单位分钟);
  • 重启 Kylin 会立即记录所有需要被记录的数据;

图示

Image RemovedImage Added

3.3 How to check the query cost of SQL ?

...

  • 在终端 $KYLIN_HOME 目录下执行 "tail -f logs/kylin.log
  • Kylin 中进行查询;
  • 在终端查看查询的执行信息。

图示

Image RemovedImage Added

3.4 How to make Cube Planner help Cuboid pruning optimization well ?

...

  • parent_forward 的默认值为 3,表示子 Cuboid 与父 Cuboid 中间相隔 3 代,例如 ABCDE
  • 当某个子 Cuboid 有多个父 Cuboid 可以选择时,系统将根据 Rowkey 顺序选择排序靠后的父 Cuboid,从而获得最小的 Cuboid 行数。例如 BC 的父 Cuboid 可以是 ABCDE,也可以是 BCDEFRowkey 顺序为 ABCDEF,那么最终选择的父 Cuboid  BCDEF

图示

Image RemovedImage Added

4. An Example for Cube Planner

...

结论:构建后 Cube Size 明显减小,合理释放了存储空间;同样查询的扫描字节数减小,有效提升了查询效率。

Image RemovedImage Added