前言
下面通过对kylin构建cube流程的分析来介绍cube优化思路。
创建hive中间表
kylin会在cube构建的第一步先构建一张hive的中间表,该表关联了所有的事实表和维度表,也就是一张宽表。
优化点:
1. hive表分区优化,在构建宽表的时候,kylin需要遍历hive表,事实表和维度表如果是分区表,那么会减少遍历时间
2. hive相关配置调整,join相关配置,mapreduce相关配置等
创建完成后,为了防止文件大小不一致的情况,kylin又基于hive做了一次重均衡操作,
`kylin.engine.mr.mapper-input-rows=1000000`,默认每个文件包含100w的数据量
代码 `CreateFlatHiveTableStep`
找出所有维度的基数
通过HyperLogLog 算法找出去重后的维度列,如果某个维度的基数很大,那么这种维度为被称为ultra high cardinality column(UHC),也就是超高基数维度。那么如何处理这类维度呢?
业务层处理UHC
比如时间戳维度基数可能是亿级的,可以转成为日期,基数降到几十万.
技术层处理UHC
kylin通过mapreduce进行此步骤,在reduce端,一个维度用一个reduce去重,因此当某个维度的基数很大时,会导致该维度所在的reduce运行很慢,甚至内存溢出,为了应对这种场景,kylin提供了两种解决方案