Apache Kylin cube创建过程每一步的优化思路

Apache Kylin 创建cube过程每一步的优化思路。包括创建model的优化思路、创建cube时的优化思路、kylin相关配置文件的优化思路

0 优化目的

cube设计优化的目的包括:

  • 更好的维护cube;
  • 让cube提高响应速度
  • 降低膨胀率

1 创建model

创建model的过程以及优化思路

下图为创建model的流程:
在这里插入图片描述

1 Model Info

这一步就是输入model名称,下面可以加上描述来表示这个model的信息

优化思路

  1. model名字命名规范建议
    一级业务分类_二级业务分类_具体业务名称_model_yyyymmdd

2 Data Model

这一步是选择事实表和维度表

优化思路

  1. 事实表和维度表不要为了省事提前join成大宽表,建议在这里分开选择事实表和维度表以及对应的join条件

3 Dimensions

选择希望作为维度的列

优化思路

  1. 设计表的时候建议把年、月、日每个都作为单独的列,在Dimensions这里把三个维度都选,方便下钻和上卷

4 Measures

选择希望作为度量的列,需要注意的是度量只能从事实表选择

优化思路

  • 无需优化

5 Settings

选择分区列

优化思路

  1. 这里的分区列一定要选择hive表的分区时间字段
  2. 分区字段的内容建议为年月日

2 创建cube

创建cube的过程以及优化思路

下图为创建cube的流程:
在这里插入图片描述

1 Cube Info

选择model,输入cube名称,输入通知邮件

优化思路

  1. cube名命名规范建议
    一级业务分类_二级业务分类_具体业务名称_cube_yyyymmdd
  2. 添加描述标识对应的cube的作用

2 Dimensions

选择维度

优化思路
1.维度选择时可以只选择哪些维度出现在cube中和哪些维度不出现在cube中。这样可以避免维度爆炸。具体操作就是将维度表的主键选为Normal,维度表的其他列选择为Derived
具体案例:https://www.jianshu.com/p/be07962d84cb

3 Measure

选择度量

优化思路

  1. 扩展列(EXTENDED_COLUMN)
    在OLAP分析场景中,经常存在对某个id进行过滤,但查询结果要展示为name的情况,比如user_id和user_name。这时,可以将user_name作为度量,Measure类型设置为EXTENDED_COLUMN,即可达到即减少维度,又可查询user_name的目的

4 Refresh Setting

更新设置

合并后cube的查询效率会有所提升,建议开启合并

5 Advanced Setting

高级设置,重头戏来了

优化思路

  1. Aggregation Groups(聚合组)
    如果你很好的了解你的查询模式且查询模式相对固定,那么你可以创建多个聚合组。在每个聚合组内,使用 “Mandatory Dimensions”, “Hierarchy Dimensions” 和 “Joint Dimensions” 来进一步优化维度组合。

这里可以搜集所有针对一个cube的查询函数,根据sql出现次数,可以根据查询评率在前N个的sql设置对应的N个或更少的聚合组


  1. Mandatory Dimensions(必要维度)
    必要维度,用于总是出现的维度。例如,如果你的查询中总是会带有 “ORDER_DATE” 做为 group by 或 过滤条件, 那么它可以被声明为必要维度。这样一来,所有不含此维度的 cuboid 就可以被跳过计算。

所有sql中都会出现的维度或者80%的SQL中会出现的维度建议设置为必要维度


  1. Hierarchy Dimensions(层级维度)
    层级维度,例如 “国家” -> “省” -> “市” 是一个层级;不符合此层级关系的 cuboid 可以被跳过计算,例如 [“省”], [“市”]. 定义层级维度时,将父级别维度放在子维度的左边。

年月日和省市区以及类似的有层级关系的维度建议设置为层级维度


  1. Joint Dimensions(联合维度)
    联合维度,有些维度往往一起出现,或者它们的基数非常接近(有1:1映射关系)。例如 “user_id” 和 “email”。把多个维度定义为组合关系后,所有不符合此关系的 cuboids 会被跳过计算。

对应关系是1对1的维度建议设置为联合维度


  1. Rowkeys(hbase里的rowkey设置)
    Rowkeys是由维度编码值组成。”Dictionary” (字典)是默认的编码方式; 字典只能处理中低基数(少于一千万)的维度;如果维度基数很高(如大于1千万), 选择 “false” 然后为维度输入合适的长度,通常是那列的最大长度值; 如果超过最大值,会被截断。请注意,如果没有字典编码,cube 的大小可能会非常大。
    你可以拖拽维度列去调整其在 rowkey 中位置; 位于rowkey前面的列,将可以用来大幅缩小查询的范围。通常建议将 mandantory 维度放在开头, 然后是在过滤 ( where 条件)中起到很大作用的维度;如果多个列都会被用于过滤,将高基数的维度(如 user_id)放在低基数的维度(如 age)的前面。

建议按照查询每个维度被查询的频率,在rowkey中以从前到后的方式设置维度在rowkey里的顺序


  1. Mandatory Cuboids(维度组合白名单)
    维度组合白名单。确保你想要构建的 cuboid 能被构建。

建议根据所有必须要满足的SQL整理对应的维度组合,将这些维度设置到白名单中


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

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

如果度量很多,例如超过200个,建议将指标分两份分别放到2个列簇中

6 重写配置

这里可以在cube级别覆盖部分 kylin.properties 中的配置

7 保存cube

保存cube后一个cube就建好了

3 配置参数优化

每个配置文件的可优化参数

1 $KYLIN_HOME/confkylin.properties

1. hbase中设置压缩格式,建议使用snappy或gzip;
snappy比gzip更快,gzip比snappy压缩率更高,以snappy为例。
kylin.storage.hbase.compression-codec=none
修改为如下
kylin.storage.hbase.compression-codec=snappy

2.每个mapper处理的行数默认为100w,如果集群资源充足,可以调小,增加并行度
kylin.engine.mr.mapper-input-rows=500000

3.每个任务启动的最小reducer可以设置为2
kylin.engine.mr.min-reducer-number=2

4.针对存在超高基维度的cube,构建时可以设置如下参数
kylin.engine.mr.build-uhc-dict-in-additional-step=TRUE
kylin.engine.mr.uhc-reducer-count=5

2 yarn参数优化

yarn配置如果是cdh可以通过界面修改,如果是开源hadoop需要修改配置文件

yarn容器的内存决定了mapreduce的并行度,推荐内存配置如下(按需自行修改)

注意:这里的配置不止影响cube,同时会决定spark on yarn任务的内存配置等其他基于yarn组件的任务内存大小。如果不确定修改成多大,请咨询hadoop集群运维或cdh管理员。

1.容器的内存
yarn.nodemanager.resource.memory-mb = 32 GB

2.容器最大内存
yarn.scheduler.maximum-allocation-mb = 32 GB

3.容器虚拟cpu内核
yarn.nodemanager.resource.cpu-vcores = 16 cores

3 $KYLIN_HOME/conf/setenv.sh

在 $KYLIN_HOME/conf/setenv.sh 中存在对 KYLIN_JVM_SETTINGS 的两种示例配置。
默认配置使用的内存较少,用户可以根据自己的实际情况,注释掉默认配置并取消另一配置前的注释符号以启用另一配置,从而为 Kylin 实例分配更多的内存资源,该项配置的默认值如下:

export KYLIN_JVM_SETTINGS="-Xms1024M -Xmx4096M -Xss1024K -XX`MaxPermSize=512M -verbose`gc -XX`+PrintGCDetails -XX`+PrintGCDateStamps -Xloggc`$KYLIN_HOME/logs/kylin.gc.$$ -XX`+UseGCLogFileRotation -XX`NumberOfGCLogFiles=10 -XX`GCLogFileSize=64M"
# export KYLIN_JVM_SETTINGS="-Xms16g -Xmx16g -XX`MaxPermSize=512m -XX`NewSize=3g -XX`MaxNewSize=3g -XX`SurvivorRatio=4 -XX`+CMSClassUnloadingEnabled -XX`+CMSParallelRemarkEnabled -XX`+UseConcMarkSweepGC -XX`+CMSIncrementalMode -XX`CMSInitiatingOccupancyFraction=70 -XX`+UseCMSInitiatingOccupancyOnly -XX`+DisableExplicitGC -XX`+HeapDumpOnOutOfMemoryError -verbose`gc -XX`+PrintGCDetails -XX`+PrintGCDateStamps -Xloggc`$KYLIN_HOME/logs/kylin.gc.$$ -XX`+UseGCLogFileRotation -XX`NumberOfGCLogFiles=10 -XX`GCLogFileSize=64M"

4 $KYLIN_HOME/conf/kylin_hive_conf.xml

1.设置hive压缩,以snappy为例
<property>
	<name>mapreduce.map.output.compress.codec</name>
	<value>org.apache.hadoop.io.compress.SnappyCodec</value>
	<description></description>
</property>
<property>
	<name>mapreduce.output.fileoutputformat.compress.codec</name>
	<value>org.apache.hadoop.io.compress.SnappyCodec</value>
	<description></description>
</property>

2.

5 $KYLIN_HOME/conf/kylin_job_conf.xml

1.设置mapreduce输出压缩,以snappy为例
<property>
	<name>mapreduce.map.output.compress.codec</name>
	<value>org.apache.hadoop.io.compress.SnappyCodec</value>
	<description></description>
</property>
<property>
	<name>mapreduce.output.fileoutputformat.compress.codec</name>
	<value>org.apache.hadoop.io.compress.SnappyCodec</value>
	<description></description>
</property>

6 $KYLIN_HOME/conf/kylin_job_conf_inmem.xml

1.设置mapreduce输出压缩,以snappy为例
<property>
	<name>mapreduce.map.output.compress.codec</name>
	<value>org.apache.hadoop.io.compress.SnappyCodec</value>
	<description></description>
</property>
<property>
	<name>mapreduce.output.fileoutputformat.compress.codec</name>
	<value>org.apache.hadoop.io.compress.SnappyCodec</value>
	<description></description>
</property>

参考链接

https://www.jianshu.com/p/be07962d84cb
http://kylin.apache.org/cn/docs/tutorial/create_cube.html
http://kylin.apache.org/cn/docs/howto/howto_optimize_cubes.html

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值