Apache Kylin的cube的构建过程所做的操作;构建过程中出现过的问题和解决过程;构建过程每一步的优化思路。
文章目录
- #1 Step Name: Create Intermediate Flat Hive Table
- #2 Step Name: Redistribute Flat Hive Table
- #3 Step Name: Extract Fact Table Distinct Columns
- #4 Step Name: Build Dimension Dictionary
- #5 Step Name: Save Cuboid Statistics
- #6 Step Name: Create HTable
- #7 Step Name: Build Base Cuboid
- #8 ~ #10 Step Name: Build N-Dimension Cuboid : level 1~N
- #11 Step Name: Build Cube In-Mem
- #12 Step Name: Convert Cuboid Data to HFile
- #13 Step Name: Load HFile to HBase Table
- #14 Step Name: Update Cube Info
- #15 Step Name: Hive Cleanup
- #16 Step Name: Garbage Collection on HDFS
- 参考链接
构建过程优化的主要目标是减少build时间。
#1 Step Name: Create Intermediate Flat Hive Table
创建Hive的中间平表
1 操作:
如下操作都通过hive -e的方式调用脚本执行的
1. 使用default库
2. 删除要创建的表
3. 根据所有列创建外部表
4. 根据$KYLIN_HOME/conf目录下的job相关的配置设置运行配置
5. 从原表查询数据插入中间表,where后的条件是用设置的时间列,对应的起止时间是构建时的StartDate和EndDate
这一步是把所用到的事实表和维度表的数据join后插入到中间表,作为下一步的输入
2 遇到的问题与解决方法
按照遇到的先后顺序排序
- 表现为cpu使用率达到100%,实际为死锁问题
解决过程:
手动解锁对应的表:https://blog.csdn.net/qq_39945938/article/details/109597334 - 表现为内存不够出现FAILED: Execution Error, return code N from org.apache.hadoop.hive.ql.exec.mr.MapredLocalTask,实际为mapjoin内存不够问题
解决过程:
增加hive内存:https://blog.csdn.net/qq_39945938/article/details/109597334
增加hive和kylin内存:https://blog.csdn.net/qq_39945938/article/details/113759752
关闭集群mapjoin:https://blog.csdn.net/qq_39945938/article/details/113369256
关闭kylin构建任务的mapjoin:https://blog.csdn.net/qq_39945938/article/details/114277736
3 优化思路
- 当join的维度表很大时(超过1000w)建议关闭mapjoin,否则需要频繁修改hive内存,可以通过修改配置文件
conf/kylin_hive_conf.properties
进行关闭
<property>
<name>hive.auto.convert.join</name>
<value>false</value>
<description>Enables the optimization about converting common join into mapjoin</description>
</property>
- 建议使用hive分区时间列作为partitionDate,否则每次构建都会扫描整个hive表,对增量build非常不友好,通过创建cube的最后一步Settings进行修改
- 关闭hive文件合并,因为kylin有自己的合并策略,可以在
conf/kylin_hive_conf.xml
修改配置关闭
<property>
<name>hive.merge.mapfiles</name>
<value>false</value>
<description>Disable Hive's auto merge</description>
</property>
#2 Step Name: Redistribute Flat Hive Table
重新分发中间表
1 操作:
1. 使用default库
2. 设置一些参数,reduce个数设置为1,不合并map输出文件
3. 根据配置重新分配数据,默认100万一个文件
2 优化思路
- 如果你的日常数据量没有这么大或者Hadoop集群有足够的资源,你或许想要更多的并发数,这时可以将conf/kylin.properties里的kylin.job.mapreduce.mapper.input.rows设为小一点的数值,比如:
kylin.job.mapreduce.mapper.input.rows=500000
- 建议制定一个高基数的维度作为分片维度,可以在创建cube的最后一步Settings页面设置
#3 Step Name: Extract Fact Table Distinct Columns
提取事实表的唯一列
1 操作:
1. 估算每个cuboid的大小
2. 找到维度唯一值为构建字典做准备
2 遇到的问题与解决方法
#4 Step Name: Build Dimension Dictionary
构建维度字典
1 操作:
构建维度字典类似男=1,女=2,hbase中存储字典值,这样可以节省空间;
后面查询的时候会根据字典转换回原表的值。
2 遇到的问题与解决方法
- 字典类型不适用高基数的字段,高基数的字段编码改为fixed_length或integer
3 优化思路
- 针对低基数的列可以用占空间较小的编码类型,可以节省空间
#5 Step Name: Save Cuboid Statistics
保存cuboid的统计数据
1 操作:
1.保存cuboid统计结果到kylin元数据,供后续使用
3 优化思路
- 这一步是轻量级和快速的,不需要优化
#6 Step Name: Create HTable
创建 HTable
操作:
创建HTable
3 优化思路
- 这一步是轻量级和快速的,不需要优化
#7 Step Name: Build Base Cuboid
构建基础cuboid
1 操作:
以第一步创建的零时表里的数据为数据源,计算生成包含所有维度组合数据的文件,
假设有N个维度,Base Cuboid包含N个维度的组合
2 遇到的问题与解决方法
- 表现为BufferOverflow! Please use one higher cardinality column for dimension column when build RAW cube!,实际是存在大量重复数据
解决过程:
找到重复数据段后重导数据再重新build:https://blog.csdn.net/qq_39945938/article/details/112987082
3 优化思路
- Reducer的数目是根据cube统计数据估算的:默认情况下每500MB输出使用一个reducer;如果观察到reducer的数量较少,你可以将kylin.properties里的“kylin.job.mapreduce.default.reduce.input.mb”设为小一点的数值以获得过多的资源,比如:
kylin.job.mapreduce.default.reduce.input.mb=200
#8 ~ #10 Step Name: Build N-Dimension Cuboid : level 1~N
构建N维cuboid
1 操作:
逐层处理cuboid,每一步都使用前一步的输出作为输入,然后去除某个维度聚合,生成一个子cuboid。
2 遇到的问题与解决方法
- 表现为BufferOverflow! Please use one higher cardinality column for dimension column when build RAW cube!,实际是存在大量重复数据
解决过程:
找到重复数据段后重导数据再重新build:https://blog.csdn.net/qq_39945938/article/details/112987082 - 表现为Error: java.lang.IllegalArgumentException: Cannot add NaN报错
解决过程:
https://blog.csdn.net/qq_39945938/article/details/114398445
#11 Step Name: Build Cube In-Mem
构建cube
1 操作:
这个步骤使用一个新的算法来构建cube:“逐片”构建(也称为“内存”构建)。
2 优化思路
- 它会使用一轮MR来计算所有的cuboids,但是比通常情况下更耗内存。配置文件”conf/kylin_job_inmem.xml”正是为这步而设。默认情况下它为每个mapper申请3GB内存。如果你的集群有充足的内存,你可以在上述配置文件中分配更多内存给mapper,这样它会用尽可能多的内存来缓存数据以获得更好的性能,比如:
<property>
<name>mapreduce.map.memory.mb</name>
<value>6144</value>
<description></description>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx5632m</value>
<description></description>
</property>
#12 Step Name: Convert Cuboid Data to HFile
将cuboid数据转换为HFile
1 操作:
将Cuboid转换为HFile
2 优化思路
- 如果你观察到reducer数目较小且性能较差,你可以将“conf/kylin.properties”里的以下参数设小一点,比如:
kylin.hbase.region.cut=2
kylin.hbase.hfile.size.gb=1
3 优化思路
- 这一步是轻量级和快速的,不需要优化
#13 Step Name: Load HFile to HBase Table
将HFile导入HBase表
操作:
将HFile导入HBase表
#14 Step Name: Update Cube Info
更新cube信息
1 操作:
更新cube元数据
2 优化思路
- 这一步是轻量级和快速的,不需要优化
#15 Step Name: Hive Cleanup
清理hive
1 操作:
删除中间表,和清理存储的这条命令功能相同 ${KYLIN_HOME}/bin/kylin.sh org.apache.kylin.tool.StorageCleanupJob --force true --delete true
2 遇到的问题与解决方法
- 表现为操作表阻塞,实际上是hive表存在排他锁
解决过程:
修改运行脚本前设置hive配置:https://blog.csdn.net/qq_39945938/article/details/108660246
3 优化思路
- 这一步是轻量级和快速的,不需要优化
#16 Step Name: Garbage Collection on HDFS
清理HDFS垃圾
1 操作:
清理HDFS上生成的不再使用的文件
和清理存储的这条命令功能相同
${KYLIN_HOME}/bin/kylin.sh org.apache.kylin.tool.StorageCleanupJob --force true --delete true
2 优化思路
- 这一步是轻量级和快速的,不需要优化
参考链接
kylin 官方文档 :http://kylin.apache.org/cn/docs/howto/howto_optimize_build.html