本文是对 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. 在接口中的静态方法来获取model的实例对象

    直接先上代码: 接口代码 abstract class BaseModel { /** * @var null */ protected static $_instances = Array(); / ...

  2. django学习笔记(一)视图和url配置

    1.开始一个项目: 进入创建的目录,然后: django-admin startproject myblog 2.启动开发服务器: python manage.py runserver 注:默认是80 ...

  3. Smooks:xml-to-java

    引言: Smooks是一个开源的Java框架,用于处理“数据事件流”.它常常被认为是一个转换框架并以此被用于好几个产品和项目中,包括JBoss ESB(以及其它ESB).然而究其核心,Smooks未提 ...

  4. bzoj 3307: 雨天的尾巴 线段树合并

    题目大意: N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.问完成所有发放后,每个点存放最多的是哪种物品. 题解: 首先我们为每一个节 ...

  5. NOIp2018集训test-10-18 (bike day4)

    这是一套简单题,这几天的考试让bike老爷感觉很绝望,说实话我也确实不知道还能怎么更简单了. 这几天的题换做llj.sxy应该都能轻松AK吧,至少随便考个250+应该不是问题吧,我越来越觉得觉得我跟他 ...

  6. Hadoop十年

    于 2006 年 1 月 28 日诞生的它改变了企业对数据的存储.处理和分析的过程,加速了大数据的发展,形成了自己的极其火爆的技术生态圈,并受到非常广泛的应用.在此为大家梳理 Hadoop 这十年的变 ...

  7. HDU3018:Ant Trip(欧拉回路)

    Ant Trip Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  8. mongodb 的命令操作(转)

    成功启动MongoDB后,再打开一个命令行窗口输入mongo,就可以进行数据库的一些操作. 输入help可以看到基本操作命令: show dbs:显示数据库列表  show collections:显 ...

  9. Python知识点: os.popen

    用例:f = os.popen("%s %s %s" % ("pkg-config", " ".join(args), mod)) pope ...

  10. C#中打开文件、目录、保存窗口

    打开文件代码: try { OpenFileDialog of = new OpenFileDialog(); of.ShowDialog(); txt_destFilePath.Text = of. ...