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,如果需要每天更新,那么每天为了新数据而去重复计算过去两年的数据就会变得非常浪费,在这种情况下需要考虑使用增量构建。

相关文章
|
消息中间件 数据挖掘 Kafka
Apache Kafka流处理实战:构建实时数据分析应用
【10月更文挑战第24天】在当今这个数据爆炸的时代,能够快速准确地处理实时数据变得尤为重要。无论是金融交易监控、网络行为分析还是物联网设备的数据收集,实时数据处理技术都是不可或缺的一部分。Apache Kafka作为一款高性能的消息队列系统,不仅支持传统的消息传递模式,还提供了强大的流处理能力,能够帮助开发者构建高效、可扩展的实时数据分析应用。
1150 5
|
存储 人工智能 数据处理
Apache Doris 2025 Roadmap:构建 GenAI 时代实时高效统一的数据底座
秉承“以场景驱动创新” 的核心理念,持续深耕三大核心场景的关键能力,并对大模型 GenAI 场景的融合应用进行重点投入,为智能时代构建实时、高效、统一的数据底座。
736 10
Apache Doris 2025 Roadmap:构建 GenAI 时代实时高效统一的数据底座
|
存储 数据挖掘 数据处理
巴别时代使用 Apache Paimon 构建 Streaming Lakehouse 的实践
随着数据湖技术的发展,企业纷纷探索其优化潜力。本文分享了巴别时代使用 Apache Paimon 构建 Streaming Lakehouse 的实践。Paimon 支持流式和批处理,提供高性能、统一的数据访问和流批一体的优势。通过示例代码和实践经验,展示了如何高效处理实时数据,解决了数据一致性和故障恢复等挑战。
463 61
|
消息中间件 Java Kafka
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
871 1
|
9月前
|
人工智能 数据处理 API
阿里云、Ververica、Confluent 与 LinkedIn 携手推进流式创新,共筑基于 Apache Flink Agents 的智能体 AI 未来
Apache Flink Agents 是由阿里云、Ververica、Confluent 与 LinkedIn 联合推出的开源子项目,旨在基于 Flink 构建可扩展、事件驱动的生产级 AI 智能体框架,实现数据与智能的实时融合。
1482 6
阿里云、Ververica、Confluent 与 LinkedIn 携手推进流式创新,共筑基于 Apache Flink Agents 的智能体 AI 未来
|
存储 Cloud Native 数据处理
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
本文整理自阿里云资深技术专家、Apache Flink PMC 成员梅源在 Flink Forward Asia 新加坡 2025上的分享,深入解析 Flink 状态管理系统的发展历程,从核心设计到 Flink 2.0 存算分离架构,并展望未来基于流批一体的通用增量计算方向。
672 0
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
|
11月前
|
SQL 人工智能 数据挖掘
Apache Flink:从实时数据分析到实时AI
Apache Flink 是实时数据处理领域的核心技术,历经十年发展,已从学术项目成长为实时计算的事实标准。它在现代数据架构中发挥着关键作用,支持实时数据分析、湖仓集成及实时 AI 应用。随着 Flink 2.0 的发布,其在流式湖仓、AI 驱动决策等方面展现出强大潜力,正推动企业迈向智能化、实时化的新阶段。
1209 9
Apache Flink:从实时数据分析到实时AI
|
11月前
|
SQL 人工智能 API
Apache Flink 2.1.0: 面向实时 Data + AI 全面升级,开启智能流处理新纪元
Apache Flink 2.1.0 正式发布,标志着实时数据处理引擎向统一 Data + AI 平台迈进。新版本强化了实时 AI 能力,支持通过 Flink SQL 和 Table API 创建及调用 AI 模型,新增 Model DDL、ML_PREDICT 表值函数等功能,实现端到端的实时 AI 工作流。同时增强了 Flink SQL 的流处理能力,引入 Process Table Functions(PTFs)、Variant 数据类型,优化流式 Join 及状态管理,显著提升作业稳定性与资源利用率。
943 0
|
10月前
|
人工智能 运维 Java
Flink Agents:基于Apache Flink的事件驱动AI智能体框架
本文基于Apache Flink PMC成员宋辛童在Community Over Code Asia 2025的演讲,深入解析Flink Agents项目的技术背景、架构设计与应用场景。该项目聚焦事件驱动型AI智能体,结合Flink的实时处理能力,推动AI在工业场景中的工程化落地,涵盖智能运维、直播分析等典型应用,展现其在AI发展第四层次——智能体AI中的重要意义。
3245 27
Flink Agents:基于Apache Flink的事件驱动AI智能体框架
|
存储 人工智能 大数据
The Past, Present and Future of Apache Flink
本文整理自阿里云开源大数据负责人王峰(莫问)在 Flink Forward Asia 2024 上海站主论坛开场的分享,今年正值 Flink 开源项目诞生的第 10 周年,借此时机,王峰回顾了 Flink 在过去 10 年的发展历程以及 Flink社区当前最新的技术成果,最后展望下一个十年 Flink 路向何方。
1295 33
The Past, Present and Future of Apache Flink

热门文章

最新文章

推荐镜像

更多