Apache Kylin权威指南3.1 为什么要增量构建

第3章

增量?构建

第2章介绍了如何构建Cube并利用其完成在线多维分析的查询。每次Cube的构建都会从Hive中批量读取数据,而对于大多数业务场景来说,Hive中的数据处于不断增长的状态。为了支持Cube中的数据能够不断地得到更新,且无需重复地为已经处理过的历史数据构建Cube,因此对于Cube引入了增量构建的功能。

我们将Cube划分为多个Segment,每个Segment用起始时间和结束时间来标志。Segment代表一段时间内源数据的预计算结果。在大部分情况下(例外情况见第4章“流式构建”),一个Segment的起始时间等于它之前那个Segment的结束时间,同理,它的结束时间等于它后面那个Segment的起始时间。同一个Cube下不同的Segment除了背后的源数据不同之外,其他如结构定义、构建过程、优化方法、存储方式等都完全相同。

本章将首先介绍如何设计并创建能够增量构建的Cube,然后介绍实际测试或生产环境中触发增量构建的方法,最后将会介绍如何处理由于增量构建而导致的Segment碎片,以保持Kylin的查询性能。


3.1 为什么要增量构建


全量构建可以看作增量构建的一种特例:在全量构建中,Cube中只存在唯一的一个Segment,该Segment没有分割时间的概念,因此也就没有起始时间和结束时间。全量构建和增量构建各有其适用的场景,用户可以根据自己的业务场景灵活地进行切换。全量构建和增量构建的详细对比如表3-1所示。

表3-1 全量构建和增量构建的对比

全量构建 增量构建

每次更新时都需要更新整个数据集 每次只对需要更新的时间范围进行更新,因此离线计算量相对较小

查询时不需要合并不同Segment的结果 查询时需要合并不同Segment的结果,因此查询性能会受到影响

不需要后续的Segment合并 累计一定量的Segment之后,需要进行合并

适合小数据量或全表更新的Cube 适合大数据量的Cube

 

对于全量构建来说,每当需要更新Cube数据的时候,它不会区分历史数据和新加入的数据,也就是说,在构建的时候会导入并处理所有的原始数据。而增量构建只会导入新Segment指定的时间区间内的原始数据,并只对这部分原始数据进行预计算。为了验证这个区别,可以到Kylin的Monitor页面观察构建的第二步——创建Hive中间表(Create Intermediate Flat Hive Table),单击纸张形的LOG按钮即可观察该步骤的参数:

INSERT OVERWRITE TABLE

kylin_intermediate_test_kylin_cube_without_slr_left_join_desc_20120601000000_20130101000000 SELECT

TEST_KYLIN_FACT.CAL_DT

,TEST_KYLIN_FACT.LEAF_CATEG_ID

,TEST_KYLIN_FACT.LSTG_SITE_ID

,TEST_CATEGORY_GROUPINGS.META_CATEG_NAME

,TEST_CATEGORY_GROUPINGS.CATEG_LVL2_NAME

,TEST_CATEGORY_GROUPINGS.CATEG_LVL3_NAME

,TEST_KYLIN_FACT.LSTG_FORMAT_NAME

,TEST_KYLIN_FACT.SLR_SEGMENT_CD

,TEST_KYLIN_FACT.PRICE

,TEST_KYLIN_FACT.ITEM_COUNT

,TEST_KYLIN_FACT.SELLER_ID

,TEST_SITES.SITE_NAME

FROM DEFAULT.TEST_KYLIN_FACT as TEST_KYLIN_FACT

LEFT JOIN EDW.TEST_CAL_DT as TEST_CAL_DT

ON TEST_KYLIN_FACT.CAL_DT = TEST_CAL_DT.CAL_DT

LEFT JOIN DEFAULT.TEST_CATEGORY_GROUPINGS as TEST_CATEGORY_GROUPINGS

ON TEST_KYLIN_FACT.LEAF_CATEG_ID = TEST_CATEGORY_GROUPINGS.LEAF_CATEG_ID AND TEST_KYLIN_FACT.LSTG_SITE_ID = TEST_CATEGORY_GROUPINGS.SITE_ID

LEFT JOIN EDW.TEST_SITES as TEST_SITES

ON TEST_KYLIN_FACT.LSTG_SITE_ID = TEST_SITES.SITE_ID

LEFT JOIN EDW.TEST_SELLER_TYPE_DIM as TEST_SELLER_TYPE_DIM

ON TEST_KYLIN_FACT.SLR_SEGMENT_CD = TEST_SELLER_TYPE_DIM.SELLER_TYPE_CD

WHERE (TEST_KYLIN_FACT.CAL_DT >= '2012-06-01' AND TEST_KYLIN_FACT.CAL_DT < '2013-01-01')

 distribute by rand();

该构建任务对应于名为test_kylin_cube_without_slr_left_join_empty的Cube构建,其Seg-ment所包含的时间段为从2012-06-01(包含)到2013-01-01(不包含),可以看到在导入数据的Hive命令中带入了包含这两个日期的过滤条件,以此保证后续构建的输入仅包含2012-06-01到2013-01-01这段时间内的数据。这样的过滤能够减少增量构建在后续的预计算中所需要处理的数据规模,有利于减少集群的计算量,加速Segment构建的时间。

其次,增量构建的Cube和全量构建的Cube在查询时也有不同。对于增量构建的Cube,由于不同时间的数据分布在不同的Segment之中,因此为了获得完整的数据,查询引擎需要向存储引擎请求读取各个Segment的数据。当然,查询引擎会根据查询中的条件自动跳过不感兴趣的Segment。对于全量构建的Cube,查询引擎只需要向存储引擎访问单个Segment所对应的数据,从存储层返回的数据无需进行Segment之间的聚合,但是这也并非意味着查询全量构建的Cube不需要查询引擎做任何额外的聚合,为了加强性能,单个Segment的数据也有可能被分片存储到引擎的多个分区上(参考第6章),从而导致查询引擎可能仍然需要对单个Segment不同分区的数据做进一步的聚合。当然,整体来说,增量构建的Cube上的查询会比全量构建的做更多的运行时聚合,而这些运行时聚合都发生在单点的查询引擎之上,因此通常来说增量构建的Cube上的查询会比全量构建的Cube上的查询要慢一些。

可以看到,日积月累,增量构建的Cube中的Segment越来越多,根据上一段的分析可以猜测到该Cube的查询性能也会越来越慢,因为需要在单点的查询引擎中完成越来越多的运行时聚合。为了保持查询性能,Cube的管理员需要定期地将某些Segment合并在一起,或者让Cube根据Segment保留策略自动地淘汰那些不会再被查询到的陈旧Segment。关于这部分的详细内容会在3.4.1节中展开详细讨论。

最后,我们可以得到这样的结论:对于小数据量的Cube,或者经常需要全表更新的Cube,使用全量构建需要更少的运维精力,以少量的重复计算降低生产环境中的维护复杂度。而对于大数据量的Cube,例如,对于一个包含两年历史数据的Cube,如果需要每天更新,那么每天为了新数据而去重复计算过去两年的数据就会变得非常浪费,在这种情况下需要考虑使用增量构建。

时间: 2024-12-07 03:26:48

Apache Kylin权威指南3.1 为什么要增量构建的相关文章

Apache Kylin权威指南3.3 触发增量构建

3.3 触发增量构建 3.3.1 Web GUI触发 在Web GUI上触发Cube的增量构建与触发全量构建的方式基本相同.在Web GUI的Model页面中,选中想要增量构建的Cube,单击Action→Build,如图3-3所示. 不同于全量构建,增量构建的Cube会在此时弹出对话框让用户选择"End Date"(如 图3-4所示),目前Kylin要求增量Segment的起始时间等于Cube中最后一个Segment的结束时间,因此当我们为一个已经有Segment的Cube触发增量构

Apache Kylin权威指南3.2 设计增量Cube

3.2 设计增量Cube 3.2.1 设计增量Cube的前提 并非所有的Cube都适用于增量构建,Cube的定义必须包含一个时间维度,用来分割不同的Segment,我们将这样的维度称为分割时间列(Partition Date Column).尽管由于历史原因该命名中存在"date"的字样,但是分割时间列既可以是Hive中的Date类型.也可以是Timestamp类型或String类型.无论是哪种类型,Kylin都要求用户显式地指定分割时间列的数据格式,例如精确到年月日的Date类型(或

Apache Kylin权威指南1.4 Apache Kylin的技术架构

1.4 Apache Kylin的技术架构 Apache Kylin系统可以分为在线查询和离线构建两部分,技术架构如图1-4所示,在线查询的模块主要处于上半区,而离线构建则处于下半区.   图1-4 Kylin的技术架构 我们首先来看看离线构建的部分.从图1-4可以看出,数据源在左侧,目前主要是Hadoop Hive,保存着待分析的用户数据.根据元数据的定义,下方构建引擎从数据源抽取数据,并构建Cube.数据以关系表的形式输入,且必须符合星形模型(Star Schema)(更复杂的雪花模型在成文

Apache Kylin权威指南1.5 Apache Kylin的主要特点

1.5 Apache Kylin的主要特点 Apache Kylin的主要特点包括支持SQL接口.支持超大数据集.秒级响应.可伸缩性.高吞吐率.BI工具集成等. 1.5.1 标准SQL接口 Apache Kylin以标准SQL作为对外服务的主要接口.因为SQL是绝大多数分析人员最熟悉的工具,同时也是大多数应用程序使用的编程接口.尽管Kylin内部以Cube技术为核心,对外却没有选用MDX(MultiDimensional eXpressions)作为接口.虽然MDX作为OLAP查询语言,从学术上

Apache Kylin权威指南导读

前 言 "麒麟出没,必有祥瑞." --中国古谚语 "于我而言,与Apache Kylin团队一起合作使Kylin通过孵化成为顶级项目是非常激动人心的,诚然,Kylin在技术方面非常振奋人心,但同样令人兴奋的是Kylin代表了亚洲国家,特别是中国,在开源社区中越来越高的参与度." --Ted Dunning Apache孵化项目副总裁,MapR首席应用架构师 今天,随着移动互联网.物联网.AI等技术的快速兴起,数据成为了所有这些技术背后最重要,也是最有价值的"

Apache Kylin权威指南2.2 在Hive中准备数据

2.2 在Hive中准备数据 2.1节介绍了Kylin中的常见概念.本节将介绍准备Hive数据的一些注意事项.需要被分析的数据必须先保存为Hive表的形式,然后Kylin才能从Hive中导入数据,创建Cube. Apache Hive是一个基于Hadoop的数据仓库工具,最初由Facebook开发并贡献到Apache软件基金会.Hive可以将结构化的数据文件映射为数据库表,并可以将SQL语句转换为MapReduce或Tez任务进行运行,从而让用户以类SQL(HiveQL,也称HQL)的方式管理和

Apache Kylin权威指南2.6 SQL参考

2.6 SQL参考 Apache Kylin支持标准SQL作为查询语言,但是SQL有很多变体,Kylin支持的只是SQL所有变体中的一个子集,并不是支持所有现存的SQL语句和语法.用户在使用Kylin之前,需要对Kylin所支持的SQL有一个了解,以避免走弯路. 首先,Kylin作为OLAP引擎,只支持查询,而不支持其他操作,如插入.更新等,即所有的SQL都必须是SELECT语句,否则Kylin会报错. 第二,查询Kylin中SQL语句的表名.列名.度量.连接关系时,需要至少跟一个Cube的模型

Apache Kylin权威指南1.6 与其他开源产品比较

1.6 与其他开源产品比较 与Apache Kylin一样致力于解决大数据查询问题的其他开源产品也有不少,比如Apache Drill.Apache Impala.Druid.Hive.Presto(Facebook).SparkSQL等.本节试图将Kylin与它们做一个简单的比较. 从底层技术的角度来看,这些开源产品有很大的共性,一些底层技术几乎被所有的产品一致采用,Kylin也不例外. 大规模并行处理:可以通过增加机器的方式来扩容处理速度,在相同的时间里处理更多的数据. 列式存储:通过按列存

Apache Kylin权威指南1.2 Apache Kylin的使命

1.2 Apache Kylin的使命 Kylin的使命是超高速的大数据OLAP(Online Analytical Processing),也就是要让大数据分析像使用数据库一样简单迅速,用户的查询请求可以在秒内返回,交互式数据分析将以前所未有的速度释放大数据里潜藏的知识和信息,让我们在面对未来的挑战时占得先机. 1.2.1 为什么要使用Apache Kylin 自从10年前Hadoop诞生以来,大数据的存储和批处理问题均得到了妥善解决,而如何高速地分析数据也就成为了下一个挑战.于是各式各样的"

Apache Kylin权威指南1.7 小结

1.7 小结 本章介绍了Apache Kylin的历史背景和技术特点.尤其是它基于预计算的大数据查询原理,理论上可以在任意大的数据规模上达到O(1)常数级别的查询速度,这一点也是Apache Kylin与传统查询技术的关键区别,如图1-6所示.传统技术,如大规模并行计算和列式存储的查询速度都在O(N)级别,与数据规模增线性关系.如果数据规模增长10倍,那么O(N)的查询速度就会下降到十分之一,无法满足日益增长的数据需求.依靠Apache Kylin,我们不用再担心查询速度会随着数据量的增长而减慢