kylin cube 构建过程

本文是对 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 时,会清除垃圾。

原文地址:https://www.cnblogs.com/langfanyun/p/10288118.html

时间: 2024-10-18 01:09:52

kylin cube 构建过程的相关文章

大数据分析平台Apache Kylin的部署(Cube构建使用)

前言 Apache Kylin是一个开源的分布式分析引擎,最初由eBay开发贡献至开源社区.它提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力以支持大规模数据,能够处理TB乃至PB级别的分析任务,能够在亚秒级查询巨大的Hive表,并支持高并发. Kylin的理论基础:空间换时间. Kylin从数据仓库中最常用的Hive中读取源数据,使用 MapReduce作为Cube构建的引擎,并把预计算结果保存在HBase中,对外暴露Rest API/JDBC/ODBC的查询接口. 部署Kyli

项目构建之maven篇:2.HelloWorld项目构建过程

文件结构说明: 项目构建生命周期: 清理 编译 测试 打包 运行 部署 清理与编译 hello\pom.xml POM:Project Object Model,项目对象模型 pom.xml与ant的build.xml类似 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocat

一步一步跟我学习lucene(7)---lucene搜索之IndexSearcher构建过程

最近一直在写一步一步跟我学习lucene系列(http://blog.csdn.net/wuyinggui10000/article/category/3173543),个人的博客也收到了很多的访问量,谢谢大家的关注,这也是对我个人的一个激励,O(∩_∩)O哈哈~,个人感觉在博客的编写过程中自己收获了很多,我会一直继续下去,在工作的过程中自己也会写出更多类似系列的博客,也算是对自己只是的一种积累: IndexSearcher 搜索引擎的构建分为索引内容和查询索引两个大方面,这里要介绍的是luce

ubuntu下stm32交叉工具链 构建过程1

说实话,这个过程将是十分折腾的过程,而且不一定成功,所以,我的很多朋友在听到我说要做这件事情的时候,都给我泼冷水. 但是,我还是想努力,因为这次我是下决心,非要反微软到底. 就算这个过程再难——我脑海里经常闪现起 勇敢的心 里 华伦士 最后受尽极性 仍然高喊 自由的情景. 我对自己说,也是激励自己:只有这样的人才有权利追求和获得自由. 这件事,难就难在我发现我光是为了获取一个可用的gcc编译器,在codesourcery codebench上下载下来都这么费劲. 我的网络速度相当快,但不知为什么

Maven学习总结(二)——Maven项目构建过程练习

Maven学习总结(二)——Maven项目构建过程练习 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化构建项目的过程 一.创建Maven项目 1.1.建立Hello项目 1.首先建立Hello项目,同时建立Maven约定的目录结构和pom.xml文件 Hello | --src | -----main | ----------java | ----------resources | -----test | ---------java | -----

Saiku3.1构建过程(暂时不包含Saiku-UI)

1.首先下载Saiku3.1的源码:https://github.com/OSBI/saiku/tree/release-3.1 2.以maven项目方式导入到eclipse中(此步骤可以不做) 3.修改下载的根目录中的pom文件,找到build节点-->pluginManagement节点-->plugins中添加如下代码 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId

Camel路由构建过程

个人认为Camel中最重要的两大块,一是路由的构建过程,二是路由构建完成后的执行过程. 下面就参数前面的Camel示例来说说路由的构建细节. 其实这里说的路由构建其实是构建路由定义,对应Camel中的RouteDefinition类,一个RouteDefinition对象规定了或者说指定了一个消息从哪里产生,中间要经过什么样的处理,最后路由到什么地方.RouteDefinition有点类似java中的Class类,包含的都是一个元信息,外界则是参照这些元信息进行工作.RouteDefinitio

redis集群构建过程 linux windows

redis集群的构建过程 本人初次构建redis集群时,通过查阅资料整理的文档 目录 Linux Redis cluster集群方案... 1 Windows redis集群方案... 5 Linux Redis cluster集群方案 1 安装: 下载地址:http://download.redis.io/releases/ 下载版本:redis3.0.7.tar.gz [[email protected] soft]$ tar -zxzf redis-3.0.7.tar.gz [[email

【龙书笔记】编译器简介及程序构建过程综述

备注:本文是近期重新阅读编译器经典教材<Compilers Principles, Techniques, & Tools>一书(又称DragonBook,龙书)的其中一篇读书笔记. 1. 什么是编译器 从本质来看,平时提到的"编程语言"其实都是一些助记符,用于向其他人或机器描述我们想要完成的逻辑运算.这些易于人类理解的语言想要被计算机理解并正确执行,就必须被转换成机器码,而完成这一转换过程的软件系统就是编译器. 简言之,编译器其实也是一个计算机程序,它可以读取用一