本文是对 http://kylin.apache.org/docs20/howto/howto_optimize_build.html的翻译,以便阅读。

1.  创建 Hive 中间表(Create Intermediate Flat Hive Table)

这个过程会把 cube 中用到的所有 Hive 表(包括 look at 的表)汇聚成一张表。如果 Cube 是分区的,kylin 会增加时间条件以获取相应的数据。此过程的输出大致如下:

hive -e "USE default;
DROP TABLE IF EXISTS kylin_intermediate_airline_cube_v3610f668a3cdb437e8373c034430f6c34; CREATE EXTERNAL TABLE IF NOT EXISTS kylin_intermediate_airline_cube_v3610f668a3cdb437e8373c034430f6c34
(AIRLINE_FLIGHTDATE date,AIRLINE_YEAR int,AIRLINE_QUARTER int,...,AIRLINE_ARRDELAYMINUTES int)
STORED AS SEQUENCEFILE
LOCATION 'hdfs:///kylin/kylin200instance/kylin-0a8d71e8-df77-495f-b501-03c06f785b6c/kylin_intermediate_airline_cube_v3610f668a3cdb437e8373c034430f6c34'; SET dfs.replication=2;
SET hive.exec.compress.output=true;
SET hive.auto.convert.join.noconditionaltask=true;
SET hive.auto.convert.join.noconditionaltask.size=100000000;
SET mapreduce.job.split.metainfo.maxsize=-1; INSERT OVERWRITE TABLE kylin_intermediate_airline_cube_v3610f668a3cdb437e8373c034430f6c34 SELECT
AIRLINE.FLIGHTDATE
,AIRLINE.YEAR
,AIRLINE.QUARTER
,...
,AIRLINE.ARRDELAYMINUTES
FROM AIRLINE.AIRLINE as AIRLINE
WHERE (AIRLINE.FLIGHTDATE >= '1987-10-01' AND AIRLINE.FLIGHTDATE < '2017-01-01');
"

   Hive 命令使用的配置文件在 conf/kylin_hive_conf.xml 中。

如果 Cube 的分区列(partition cloumn)和 Hive 的分区列(partition cloumn) 相同,那么在这一列上进行过滤,会使 Hive 能智能的过滤掉不符合的分区。因此强烈建议使用 Hive 表的分区列(如果是日期格式的话) 作为 Cube 的分区列。对于很大的表来说,这几乎是必须的。

如果你的 Hive 开启的文件合并,你应该在  conf/kylin_hive_conf.xml  中禁用它。因为 kylin 会在后面的步骤中会做这件事。

<property>
<name>hive.merge.mapfiles</name>
<value>false</value>
<description>Disable Hive's auto merge</description>
</property>

2. 重新分区中间表(Redistribute intermediate table)

在第1步中生成的数据文件有大有小,这会导致后续 MapReduce 的 job 有的很快就完成了,有的要处理很久。kylin 在这一步就是重新分区这些数据。日志大致如下:

total input rows = 159869711
expected input rows per mapper = 1000000
num reducers for RedistributeFlatHiveTableStep = 160

重新分区的命令:

hive -e "USE default;
SET dfs.replication=2;
SET hive.exec.compress.output=true;
SET hive.auto.convert.join.noconditionaltask=true;
SET hive.auto.convert.join.noconditionaltask.size=100000000;
SET mapreduce.job.split.metainfo.maxsize=-1;
set mapreduce.job.reduces=160;
set hive.merge.mapredfiles=false; INSERT OVERWRITE TABLE kylin_intermediate_airline_cube_v3610f668a3cdb437e8373c034430f6c34 SELECT * FROM kylin_intermediate_airline_cube_v3610f668a3cdb437e8373c034430f6c34 DISTRIBUTE BY RAND();
"

首先,得到中间表中总共有多少条记录,kylin 默认情况下,一个文件分配一百万条数据(通常一百万条数据不会超过 HDFS 中一个块的大小)。此例中 159869711 条数据会被分到 160 个文件中,会有 160 个 Mapper 和 160 个 Reduce 任务。如果你想增加并发量,并且你的 Hadoop 集群有充足的资源,你可以在 “conf/kylin.properties”中给“kylin.job.mapreduce.mapper.input.rows” 设置一个较小的值。

然后, Kylin 运行 “INSERT OVERWIRTE TABLE …. DISTRIBUTE BY “  这个 HiveQL, 把数据分发到各个 reducer 。通常会通过 “DISTRIBUTE BY RAND()” 将数据随机的分发到各个 reducer 中。

如果你的 Cube 指定了 “shard by”  维度(在 Cube 的 “Advanced setting” 页),这个维度又是一个高基维(如:user_id),kylin 会告诉 Hive,让其使用这一列的值进行分发数据,代替上面的 RAND() 方式。这会有利于 Cube 后续的构建。在一些典型的场景中,这将减少 40% 的构建时间。此例中 distribute 的条件是 “DISTRIBUTE BY USER_ID”:

注意:“shard by” 列必须是高基维的列,并且它会出现在大多数的 Cubeid 中,利用它可以获得每个时间范围内数据的均匀性,否则会引起数据倾斜。

3. 获取事实表去重后的值(Extract Fact Table Distinct Columns)

在这一步, kylin 会获取每个维度的去重后的值,用于数据字典编码。它也会使用 HyperLogLog 计数器去收集 Cube 的统计信息用以估算每个 cubeid 的行数。

如果你发现 Mapper 比较慢,这通常意味着 Cube 太复杂。

如果 Reducer 发生 OutOfMemory  的错误,这意味着 Cubeid 组合过大,或者默认的 YARN 无法分配所需的资源。

如果这一步不能在合理的时间内完成,你应该得新审视你的设计。

4. 建立维度字典(Build Dimension Dictionary)

通过上一步得到值,kylin 在内存中(以后会移到MR)创建这些值的字典。这步通常很快,但是如果这些值有很多,kylin 会报告类似 “Too high cardinality is not suitable for dictionary” 的错误。对这些高基维(UHC)请使用 “fixed_length”, “integer” 做为编码方式。

5.  Save Cuboid Statistics and Create HTable

这步很轻量,并且很快。

6. Build Base Cuboid

这一步从中间表创建基础 cuboid。这是 “by layer” cubing 算法中的第一轮 MR。Mapper 的数量是第2步中的 Reducer 的值。Reducer 的数量通过 Cube 统计信息进行估算(默认每 500MB 的输出使用一个 reducer)。如果观察到 reducer 数量较少,可以在kylin.properties 中设置 “kylin.job.mapreduce.default.reduce.input.mb”  成一个较小的值。

7. Build N-Dimension Cuboid

这一步会逐层构建 cube,每一步均使用上一步的结果作为此步的输入,然后减少一维,聚合成一个子 cuboid。例如:从 cuboid ABCD 中去除A,得到 BCD;去除 B 得到 ACD。

一些 cuboid 可以从多个父 cuboid 中得到,kylin 会使用较小的 cuboid。记住,在设计 cube 的 rowkey 时,应该把高基维放到前面。

通常从 N-D 到 (N/2)-D 的构建是慢的,因为这是由 cuboid 的爆发引起的: N-D 有 1 个 Cuboid,  (N-1)-D 有 N个 cuboids, (N-2)-D 有 N*(N-1) 个 cuboids... 经过 (N/2)-D 步后, 构建将会逐渐加快。

8. Build Cube

这一步使用 “by-split” Cubing (也叫 “in-mem” cubing) 算法去构建 Cube,它使用一次 MR 去计算所有的 cuboid,需要更多的内存。每个 Mapper 默认需要3GB,如果你的集群有足够的资源,可以通过 “conf/kylin_job_conf_inmem.xml” 分配更多的内存,有助于提升性能。

<property>
<name>mapreduce.map.memory.mb</name>
<value>6144</value>
</property> <property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx5632m</value>
</property>

注意: kylin 会自动根据数据分布(从 Cube 的统计信息中获得)选择最好的算法。你不必明确指定算法。

9. Convert Cuboid Data to HFile

这一步会启动一个 MR 的 job,把 Cuboid 文件(sequence file format)转化成 HBase 的 HFile。Kylin 会计算 HBase 的 Region number,默认每个 Region 5GB 大小。Reducer 的数量随着 Region 的增加而增加。如果你发现 Reducer 的数量较小、效率较低, 你可以修改 “conf/kylin.properties” 中下面的配置:

kylin.hbase.region.cut=2
kylin.hbase.hfile.size.gb=1

10. Load HFile to HBase Table

这一步利用 HBase 的 API 把 HFile 载入到 region server。这一步会很快。

11. Update Cube Info

数据加 HBase后,kylin 标记 Cube segment 在元数据中已准备完毕。这一步很快。

12. Cleanup

清除 Hive 中的临时表。这一步如果出错的话,不会有任何影响。当 kylin 执行 StorageCleanupJob 时,会清除垃圾。

kylin cube 构建过程的更多相关文章

  1. Kylin Cube构建过程优化

    原文地址:https://kylin.apache.org/docs16/howto/howto_optimize_build.html Kylin将一个cube的build过程分解为若干个子步骤,然 ...

  2. Apache Kylin Cube 的构建过程

    不多说,直接上干货! 1. Cube的物理模型 Cube物理模型 如上图所示,一个常用的3维立方体,包含:时间.地点.产品.假如data cell 中存放的是产量,则我们可以根据时间.地点.产品来确定 ...

  3. Mysql主从复制,读写分离(mysql-proxy),双主结构完整构建过程

    下面介绍MySQL主从复制,读写分离,双主结构完整构建过程,不涉及过多理论,只有实验和配置的过程. Mysql主从复制(转载请注明出处,博文地址:) 原理是master将改变记录到二进制日志(bina ...

  4. Android分析应用程序的构建过程

    为了方便Android应用开发要求我们Androidproject编制和包装有了更深入的了解,例如,我们知道这是做什么的每一步,境和工具.输入和输出是什么.等等. 在前文<命令行下Android ...

  5. vue 源码学习(一) 目录结构和构建过程简介

    Flow vue框架使用了Flow作为类型检查,来保证项目的可读性和维护性.vue.js的主目录下有Flow的配置.flowconfig文件,还有flow目录,指定了各种自定义类型. 在学习源码前可以 ...

  6. DOM 操作成本究竟有多高,HTML、CSS构建过程 ,从什么方向出发避免重绘重排)

    前言: 2019年!我准备好了 正文:从我接触前端到现在,一直听到的一句话:操作DOM的成本很高,不要轻易去操作DOM.尤其是React.vue等MV*框架的出现,数据驱动视图的模式越发深入人心,jQ ...

  7. android构建过程

    参考: http://blog.csdn.net/shangmingchao/article/details/47375111 首先,需要了解一下构建APK的七大工具: ①aapt 全称是Androi ...

  8. Linux内核剖析(五)Linux内核的构建过程

    参考 一次实验引发的故事 – kernel build system探索—vmlinux是如何炼成的– kernel makefile 深度探索Linux操作系统:系统构建和原理解析.pdf 问题 在 ...

  9. Deeplab v3+中的骨干模型resnet(加入atrous)的源码解析,以及普通resnet整个结构的构建过程

    加入带洞卷积的resnet结构的构建,以及普通resnet如何通过模块的组合来堆砌深层卷积网络. 第一段代码为deeplab v3+(pytorch版本)中的基本模型改进版resnet的构建过程, 第 ...

随机推荐

  1. 十八 Django框架,生成二维码

    用Python来生成二维码,需要qrcode模块,qrcode模块依赖Image 模块,所以首先安装这两个模块 生成二维码保存图片在本地 import qrcode img = qrcode.make ...

  2. 六 Django框架,models.py模块,数据库操作——链表结构,一对多、一对一、多对多

    链表操作 链表,就是一张表的外键字段,连接另外一张表的主键字段 一对多 models.ForeignKey()外键字段一对多,值是要外键的表类 from __future__ import unico ...

  3. Geoserver端口冲突解决方案

    转载:https://blog.csdn.net/wiinder/article/details/53260642 今天在安装Geoserver的时候遇到了端口冲突的问题,即默认的8080端口与Tom ...

  4. java支付宝开发-00-资源帖

    一.一些重要的官方文档 1.沙箱登录 2.沙箱环境使用说明 3.如何使用沙箱环境 4.当面付产品介绍 5.扫码支付接入指引 6.当面付快速接入 7.当面付接入必读 8.当面付进阶功能 9.当面付异步通 ...

  5. ROS 负载均衡

    [xuan89@MikroTik] > :for i from=1 to=$z do= {/ip firewall mangle add action=mark-connection chain ...

  6. 【leetcode刷题笔记】Maximum Depth of Binary Tree

    Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...

  7. bzoj1208Splay

    Splay查前驱后继 小tips:在bzoj上while(scanf)这种东西可以让程序多组数据一起跑 反正没加我就t了 #include<cstdio> #include<iost ...

  8. ACM学习历程—POJ 3764 The xor-longest Path(xor && 字典树 && 贪心)

    题目链接:http://poj.org/problem?id=3764 题目大意是在树上求一条路径,使得xor和最大. 由于是在树上,所以两个结点之间应有唯一路径. 而xor(u, v) = xor( ...

  9. openfire服务器开发环境搭建

    2017-07-26 更新:直接获取最新版源码,就不会报错了,而且可支持的插件多,老版本的openfire几乎没有可用的官方插件. 系统及软件环境: MAC OSX EI Capitan 10.11. ...

  10. DEBUG命令说明

    Debug在学习汇编的过程中,担任着一个非常重要的角色,是一个极其重要的调试工具,所以学会它是必须得. 命令格式 功能说明 A [地址] 输入汇编指令 C [范围] 起始地址 对由“范围”指定的区域与 ...