Apache Kylin Build cube 过程详解、遇到的问题与解决过程、优化思路

Apache Kylin的cube的构建过程所做的操作;构建过程中出现过的问题和解决过程;构建过程每一步的优化思路。


构建过程优化的主要目标是减少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 遇到的问题与解决方法
按照遇到的先后顺序排序

  1. 表现为cpu使用率达到100%,实际为死锁问题
    解决过程:
    手动解锁对应的表:https://blog.csdn.net/qq_39945938/article/details/109597334
  2. 表现为内存不够出现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 优化思路

  1. 当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>
  1. 建议使用hive分区时间列作为partitionDate,否则每次构建都会扫描整个hive表,对增量build非常不友好,通过创建cube的最后一步Settings进行修改
  2. 关闭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 优化思路

  1. 如果你的日常数据量没有这么大或者Hadoop集群有足够的资源,你或许想要更多的并发数,这时可以将conf/kylin.properties里的kylin.job.mapreduce.mapper.input.rows设为小一点的数值,比如:
    kylin.job.mapreduce.mapper.input.rows=500000
  2. 建议制定一个高基数的维度作为分片维度,可以在创建cube的最后一步Settings页面设置

#3 Step Name: Extract Fact Table Distinct Columns

提取事实表的唯一列
1 操作

1. 估算每个cuboid的大小
2. 找到维度唯一值为构建字典做准备

2 遇到的问题与解决方法

  1. 内存溢出问题
    解决过程:
    https://blog.csdn.net/qq_39945938/article/details/107105058

#4 Step Name: Build Dimension Dictionary

构建维度字典
1 操作

 构建维度字典类似男=1,女=2,hbase中存储字典值,这样可以节省空间;
 后面查询的时候会根据字典转换回原表的值。

2 遇到的问题与解决方法

  1. 字典类型不适用高基数的字段,高基数的字段编码改为fixed_length或integer

3 优化思路

  1. 针对低基数的列可以用占空间较小的编码类型,可以节省空间

#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 遇到的问题与解决方法

  1. 表现为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 优化思路

  1. 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 遇到的问题与解决方法

  1. 表现为BufferOverflow! Please use one higher cardinality column for dimension column when build RAW cube!,实际是存在大量重复数据
    解决过程:
    找到重复数据段后重导数据再重新build:https://blog.csdn.net/qq_39945938/article/details/112987082
  2. 表现为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 优化思路

  1. 它会使用一轮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 优化思路

  1. 如果你观察到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 遇到的问题与解决方法

  1. 表现为操作表阻塞,实际上是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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值