Apache Kylin 创建cube过程每一步的优化思路。包括创建model的优化思路、创建cube时的优化思路、kylin相关配置文件的优化思路
0 优化目的
cube设计优化的目的包括:
- 更好的维护cube;
- 让cube提高响应速度
- 降低膨胀率
1 创建model
创建model的过程以及优化思路
下图为创建model的流程:
1 Model Info
这一步就是输入model名称,下面可以加上描述来表示这个model的信息
优化思路:
- model名字命名规范建议
一级业务分类_二级业务分类_具体业务名称_model_yyyymmdd
2 Data Model
这一步是选择事实表和维度表
优化思路:
- 事实表和维度表不要为了省事提前join成大宽表,建议在这里分开选择事实表和维度表以及对应的join条件
3 Dimensions
选择希望作为维度的列
优化思路:
- 设计表的时候建议把年、月、日每个都作为单独的列,在Dimensions这里把三个维度都选,方便下钻和上卷
4 Measures
选择希望作为度量的列,需要注意的是度量只能从事实表选择
优化思路:
- 无需优化
5 Settings
选择分区列
优化思路:
- 这里的分区列一定要选择hive表的分区时间字段
- 分区字段的内容建议为年月日
2 创建cube
创建cube的过程以及优化思路
下图为创建cube的流程:
1 Cube Info
选择model,输入cube名称,输入通知邮件
优化思路
- cube名命名规范建议
一级业务分类_二级业务分类_具体业务名称_cube_yyyymmdd - 添加描述标识对应的cube的作用
2 Dimensions
选择维度
优化思路
1.维度选择时可以只选择哪些维度出现在cube中和哪些维度不出现在cube中。这样可以避免维度爆炸。具体操作就是将维度表的主键选为Normal,维度表的其他列选择为Derived
具体案例:https://www.jianshu.com/p/be07962d84cb
3 Measure
选择度量
优化思路
- 扩展列(EXTENDED_COLUMN)
在OLAP分析场景中,经常存在对某个id进行过滤,但查询结果要展示为name的情况,比如user_id和user_name。这时,可以将user_name作为度量,Measure类型设置为EXTENDED_COLUMN,即可达到即减少维度,又可查询user_name的目的
4 Refresh Setting
更新设置
合并后cube的查询效率会有所提升,建议开启合并
5 Advanced Setting
高级设置,重头戏来了
优化思路
- Aggregation Groups(聚合组)
如果你很好的了解你的查询模式且查询模式相对固定,那么你可以创建多个聚合组。在每个聚合组内,使用 “Mandatory Dimensions”, “Hierarchy Dimensions” 和 “Joint Dimensions” 来进一步优化维度组合。
这里可以搜集所有针对一个cube的查询函数,根据sql出现次数,可以根据查询评率在前N个的sql设置对应的N个或更少的聚合组
- Mandatory Dimensions(必要维度)
必要维度,用于总是出现的维度。例如,如果你的查询中总是会带有 “ORDER_DATE” 做为 group by 或 过滤条件, 那么它可以被声明为必要维度。这样一来,所有不含此维度的 cuboid 就可以被跳过计算。
所有sql中都会出现的维度或者80%的SQL中会出现的维度建议设置为必要维度
- Hierarchy Dimensions(层级维度)
层级维度,例如 “国家” -> “省” -> “市” 是一个层级;不符合此层级关系的 cuboid 可以被跳过计算,例如 [“省”], [“市”]. 定义层级维度时,将父级别维度放在子维度的左边。
年月日和省市区以及类似的有层级关系的维度建议设置为层级维度
- Joint Dimensions(联合维度)
联合维度,有些维度往往一起出现,或者它们的基数非常接近(有1:1映射关系)。例如 “user_id” 和 “email”。把多个维度定义为组合关系后,所有不符合此关系的 cuboids 会被跳过计算。
对应关系是1对1的维度建议设置为联合维度
- Rowkeys(hbase里的rowkey设置)
Rowkeys是由维度编码值组成。”Dictionary” (字典)是默认的编码方式; 字典只能处理中低基数(少于一千万)的维度;如果维度基数很高(如大于1千万), 选择 “false” 然后为维度输入合适的长度,通常是那列的最大长度值; 如果超过最大值,会被截断。请注意,如果没有字典编码,cube 的大小可能会非常大。
你可以拖拽维度列去调整其在 rowkey 中位置; 位于rowkey前面的列,将可以用来大幅缩小查询的范围。通常建议将 mandantory 维度放在开头, 然后是在过滤 ( where 条件)中起到很大作用的维度;如果多个列都会被用于过滤,将高基数的维度(如 user_id)放在低基数的维度(如 age)的前面。
建议按照查询每个维度被查询的频率,在rowkey中以从前到后的方式设置维度在rowkey里的顺序
- Mandatory Cuboids(维度组合白名单)
维度组合白名单。确保你想要构建的 cuboid 能被构建。
建议根据所有必须要满足的SQL整理对应的维度组合,将这些维度设置到白名单中
- Cube Engine(构建引擎)
cube 构建引擎。有两种:MapReduce 和 Spark。如果你的 cube 只有简单度量(SUM, MIN, MAX),建议使用 Spark。如果 cube 中有复杂类型度量(COUNT DISTINCT, TOP_N),建议使用 MapReduce。
- 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