- 快召唤伙伴们来围观吧
- 微博 QQ QQ空间 贴吧
- 视频嵌入链接 文档嵌入链接
- 复制
- 微信扫一扫分享
- 已成功复制到剪贴板
个推TechDay治数训练营第二期-基于Flink的实时数仓建设
近日,个推TechDay“治数训练营”系列直播课第二期举办。来自每日互动(个推)的资深数据研发工程师为大家详细解读了实时数仓架构演进,分享了实时数仓的技术选型要点,并结合实战案例详细剖析实时数仓搭建秘诀。
课程回顾
当下,企业的实时计算需求越来越高频。比如很多企业在建的实时数据可视化大屏就是很典型的实时计算场景:大屏数据实时刷新,展示最近一分钟甚至半分钟内的交易额。类似的实时计算场景还有很多,比如智能算法推荐、系统风险预警、实时特征工程等。
而以往的离线数仓具有高延时性,数据时效性一般为T+1,调度频率也是以天为单位,无法满足这些场景的数据时效性要求。所以,实时数仓便成为很多企业的大数据架构选择。
1. 何为实时数仓?
关于实时数仓,目前行业内还没有一个标准的定义。我们可以从以下几个方面来理解“实时数仓”:①实时数仓主要支持实时数据处理,并能够根据业务需求提供实时数据。②实时数仓的整个数据链路均采用实时的方式,包括数据归集、加工处理、数据分发等各环节。③另外,实时数仓的数据生态也采用实时方式,比如数据建设、数据质量、数据血缘、数据治理等。
2. 数仓架构演进
从经典数仓架构到离线数仓架构,再到能支撑实时计算场景需求的Lambda和Kappa架构,数仓架构也经历了较长的演进过程。
数仓架构演进
这里着重介绍一下Lambda架构和Kappa架构。
Lambda架构其实是在离线数仓架构的基础上,新增了一条实时链路,用于支撑低延时业务场景的计算需求。与此同时,离线计算(批处理)链路仍然存在。也就是说,Lambda架构采用实时和离线两条链路。由于同一部分业务代码需要有两套逻辑支撑,所以Lambda架构的后期维护比较复杂,对资源的消耗也比较大。
基于此又迭代产生了Kappa架构。Kappa架构在Lambda架构的基础上进行了优化,删除了Batch Layer(批处理层)的部分,将数据通道以消息队列进行替代,使用同一套逻辑进行离线和实时任务的计算。不过,目前Kappa架构还不是非常成熟,仍存在一些无法解决的问题。
鉴于Lambda架构和Kappa架构都存在一些缺陷,目前很多企业将两者相结合,采用Lambda+Kappa的混合架构进行数仓建设。比如,针对大部分实时指标,企业仍然使用Kappa架构进行计算;针对少量关键指标(比如金额相关),则使用Lambda 架构的批处理模块重新计算,增加一次校对过程,以此确保数据的时效性和计算结果的准确性。
3. 实时数仓技术选型
目前主流的实时计算引擎有Storm、Spark和Flink。如下图,每个计算引擎都有其特性。
各实时计算引擎特性对比
我们建议综合考虑延时和实时场景需求等方面因素,来进行计算引擎的选型。
- 延时
如果对延时要求较低,可以使用Spark Streaming。Spark Streaming的API非常丰富,并且吞吐量高。此外Spark已经发展较长时间,其生态体系也比较成熟。
如果对延时要求高,则推荐使用Flink。Flink的API也是相对比较丰富的,而且目前Flink社区非常活跃,尤其是在中国,其相关生态迭代迅速。
Structured Streaming也能够满足低延时需求,但是其目前的使用率还比较低,生态迭代发展较慢,相对来讲不是非常成熟。
- 实时场景的要求
如果企业需要支撑一些比较特殊的实时场景需求,比如窗口、Watermark等,我们比较推荐Flink。Flink对实时场景的支持已经非常完善了。相对而言,Storm的优势不明显,且整体较为陈旧,不是特别建议使用。
4. 实时数仓的建设
和离线数仓一致,实时数仓的建设也采用分层思想:ODS原始层对接原始数据;在ODS原始层之上,对数据进行ETL处理,形成DWD明细层;维度数据比如区域信息,建设成DIM维度层;最终经过数据的分析加工,形成DM汇总层。
下图是实时数仓的分层设计案例,供参考。
对于实时数仓的不同数据层,直播课程里都介绍了相应的建设核心、建设方法。
对于ODS层,需要使数据来源尽可能统一,并能够利用分区来确保数据局部有序。
-
对于DWD层,重点是解决原始数据中存在的数据噪声、数据不完整和数据格式不统一等情况,形成规范、统一的数据源。在DWD层,除了数据本身,我们还需要为每条数据额外补充一些信息,以应对实时数据生产环节的一些常见问题。比如为了解决重复数据的问题,需要给每一个数据打一个标记,形成“唯一键”,来标记微调数据。
-
对于DIM层,业内一般采用维表关联等建设方式。
需要注意的是,DIM层的建设要分两部分来看。一是针对变化频率较低的维度数据,比如说地域信息等,可以将离线中的维度数据同步到缓存,然后在缓存中进行访问,或者通过一些公共服务以及维度服务进行查询;二是针对变化频率较高的维度数据,比如说一些商品的价格信息,需要监测其变化情况,并创建一张价格变动的拉链表。
- 最后是DM汇总层的建设。这一层主要是对共性指标进行统一加工,同时根据主题进行多维度的汇总等操作。
为了降低计算的延时,实时数仓减少了分层。所以相比离线数仓,实时数仓层次更少。同时,实时数仓和离线数仓分别采用不同的数据存储方式。离线数仓主要采用Hive,实时数仓主要采用消息中间件,比如Kafka,来存储明细数据,对于维度数据,实时数仓多采用HBase、MySQL等数据库进行存储。
实时数仓的建设过程还是比较复杂的,本期课程还以Flink为例,为大家拆解了基于Flink进行实时数仓建设的全过程。
Q&A精选
直播过程中,大家就课程内容进行了交流,本文挑选了直播间的精彩提问做了Q&A梳理。
Q1:数据仓库和数据湖之间有哪些关系?
大数据架构从以数仓为主到演变为数仓+数据湖的形式,其实是业务系统越来越复杂、数据量级越来越大、数据种类越来越多的体现。
早期的数据分析需求大多面对的是业务系统的日志数据,为了适应大规模OLAP场景需求以及支持跨业务系统的复杂场景,基于数仓的大数据处理架构逐渐衍生出来。
随着业务系统的复杂性提升,数据量显著增加,数据结构也更加多元化,结构化数据、半结构化数据,甚至图像、语音、视频等非结构化数据越来越丰富。也许很多数据暂时未得到明确应用,但考虑到数据中可能蕴藏着的巨大潜在价值,企业需要先做好这些数据的存储,以便后续进行探索和挖掘。
这样就很自然的出现了一种妥协的解决方案,我们称之为“数据湖”,即从先进行数据处理后进行数据使用,转变为:先存储数据,待到后续想要使用数据时再考虑具体的数据加工处理方式。
“数据湖”架构既节约了前期的数据接入成本,又可以避免因为数据加工造成有价值信息丢失的情况。
综上,数仓和数据湖面对的是两种不同的大数据场景,个推目前也是通过将两者结合,以更好地进行数据价值挖掘。
Q2:实时任务与离线任务如何调度?
调度可以大致从任务调度、资源调度、调度框架几个方面展开说明。
任务调度:目前,无论是实时还是离线引擎,都会将任务划分为几个阶段(stage)执行。在任务调度机制上,实时任务和离线任务有一定差异。实时程序一般为常驻程序,会在调度阶段给每个stage提前分配资源,待所有资源申请好之后开始运行任务。离线程序一般则是按照顺序依次调度、依次申请资源。
资源调度:资源调度主要是对集群进行资源分配。离线和实时任务在这方面区别不大,目前主流的方式是采用yarn、k8s。
调度框架:调度框架主要负责任务的启动、调度、监控。离线和实时任务使用的框架基本一致,常见的有azkaban、dophinscheduler。
Q3:实时数仓的建设过程中有哪些容易让人陷入误区的点?建设过程中如何避免呢?
首先,没有一种技术能够适用于所有的场景,实时数仓的引入在增加数据时效性的同时也会使数据处理的架构复杂性增加。比如在Lamada架构下,企业还需要维护两套代码。所以,实时数仓在应用的时候,首先要从业务场景出发,期望通过引入实时数仓来解决哪些问题以及达成哪些目标,需要提前思考清楚。
其次,在很多场景下,实时数仓还会出现数据质量不高、离线实时数据不一致、故障容忍度低等缺点,所以数据开发人员还需要考虑这些新问题可能对业务造成的影响。
总体而言,实时数仓的建设还是要紧密结合公司的真实情况和业务需求,避免投入了很多的资源,无法带来业务收益,甚至对业务产生干扰。
Q4:Lambda架构和Kappa架构有区分吗?
在数据链路、开发成本、技术栈等方面都有较大区别:
数据链路:Lambda架构存在离线、实时2条链路,而Kappa架构会统一数据链路。
开发成本:主流Lambda由于历史原因不同链路会使用不同的计算引擎,如离线采用Spark、实时采用Flink,开发成本较高。而Kappa架构一般会统一计算引擎,开发流程简化,维护成本较低。
技术栈:Lambda的2条数据链路会使用不同体系的组件,如离线采用Hive、Spark,实时采用Kafka、Flink,而kappa架构统一使用实时相关的组件,如Flink、Kafka。
Q5:实时数仓的实时能达到什么级别?
实时数仓通过中间件和更少的数据层级来减少数据的处理周期,实时性可以达到秒级、毫秒级。
关于个推TechDay“治数训练营”
个推TechDay“治数训练营”系列直播课程由每日互动(个推)结合自身多年来的数据挖掘和治理经验特别打造。汇聚多位优秀大数据架构师的实操方法论,凝结众多数据开发和数据分析工程师的一线实践经验,个推TechDay“治数训练营”下期更精彩,请大家持续关注。
展开查看详情
1 .基于Flink的实时数仓建设
2 . 01 为什么要建实时数仓 02 数仓架构演进 目录 03 实时数仓技术选型 04 基于Flink建设实时数仓 2022年个推TechDay“治数训练营”
3 . PART 1 为什么要建实时数仓? 2022年个推TechDay“治数训练营”
4 . 为什么要建实时数仓 1、实时计算和分析的需求激增 实时数据可视化大屏 实时监控告警 实时特征工程 实时推荐 2、离线数仓的高延时 传统离线数仓的数据时效性是T+1,调度频率以天为单位,无法支撑实时场景的数据需求。 即使能将调度频率设置成小时,也只能解决部分对时效性要求不高的场景。 2022年个推TechDay“治数训练营”
5 . 实时数仓的定义 关于实时数仓,目前没有一个标准的定义。 我们从以下几个方面来理解: • 支持实时数据处理,并能够根据业务需求提供实时数据,比如实时推荐 • 数据链路采用实时方式,如数据归集、加工处理、数据分发 • 数据生态采用实时方式,如数据建设、数据质量、数据血缘、数据治理等 2022年个推TechDay“治数训练营”
6 . PART 2 数仓架构演进 2022年个推TechDay“治数训练营”
7 . 数仓架构的发展 经典数仓架构 数据量增加,传统数据库无法支撑 离线数仓架构 离线数仓延时高,无法满足实时业务低延时需求 Lambda架构 混合架构 一套逻辑多种实现,维护复杂,资源耗费大 Lambda和Kappa单一架构无法满足要求 Kappa架构 2022年个推TechDay“治数训练营”
8 . 数仓工具的发展 2022年个推TechDay“治数训练营”
9 . 传统数仓架构 传统的数仓架构:结构或半结构化数据通过离线ETL定期加载到离线数仓,之后通过计算引 擎取得结果,供前端使用。 这里的离线数仓+计算引擎,通常是使用大型数据库来承担,例如Oracle、MySQL等 2022年个推TechDay“治数训练营”
10 . 离线数仓架构 离线数仓架构:随着数据规模的不断增大,传统数仓方式难以承载海量数据。随着大数据 技术的普及,采用大数据技术来承载存储与计算任务。 当然,也可以使用传统数据库集群或MPP架构数据库来完成。例如Hadoop+Hive/Spark、 Oracle RAC、GreenPlum等。 2022年个推TechDay“治数训练营”
11 . 离线数仓架构示例 2022年个推TechDay“治数训练营”
12 . Lambda架构 Lambda架构:随着业务发展,企业对实时性有了更高的要求。在离线数仓的基础上,将高实时性 部分拆分出来,增加实时计算链路。与此同时,离线计算(批处理)链路仍然存在。最终由统一的 数据服务层合并结果给于前端展示。一般是以批量处理结果为准,实时结果主要为快速响应。 2022年个推TechDay“治数训练营”
13 . Lambda架构详解 批处理层: 主要负责两块功能: a) 存储数据,通常会保留数据的历史轨迹,类似于 数仓的贴源层概念。 b) 根据原始数据,执行相关业务指标批处理运算, 类似于数仓的中间层和汇总层;该层也可以达到 数据修正的目的。 服务层:将批处理层数据对外披露数据接口,提 低延迟、在线分析的数据服务。 速度层:消费实时数据并执行实时数据处理分析, 提供实时数据查询能力。 2022年个推TechDay“治数训练营”
14 . Lambda架构优缺 解决的问题 通过增加实时链路,支持提供实时数据的能力 存在的问题 • 一种逻辑两套代码,维护复杂 • 多条链路,资源消耗严重 • 不同的开发体系,使用组件太多 • 数据散布在多个系统中,难以形成统一数据标准 2022年个推TechDay“治数训练营”
15 . Lambda架构应用 2022年个推TechDay“治数训练营”
16 . Kappa架构 Kappa架构:在Lambda的基础上进行了优化,删除了Batch Layer(批处理层)的架构,将 数据通道以消息队列进行替代,使它既能够进行实时数据处理,同时也有能力在业务逻辑更 新的情况下重新处理以前处理过的历史数据。 2022年个推TechDay“治数训练营”
17 . Kappa架构优缺 解决的问题 Lambada架构存在严重的问题就是需要维护两套逻辑。 一部分在批量引擎实现,一部分在流式引擎实现,维护成本很高,资源消耗大。 为了解决这个问题Kappa架构在数据需要重新处理或数据变更时,可通过历史数据重新处理来完成,方 式是通过上游重放完成(从数据源拉取数据重新计算)。 存在的问题 技术不成熟,仍有很多问题无法解决。 2022年个推TechDay“治数训练营”
18 . Kappa架构示例 2022年个推TechDay“治数训练营”
19 . Lambda 和 Kappa 的对比 对比项 Lambda架构 Kappa架构 实时性 实时 实时 只有流处理,仅针对新需求开发阶段运行两 计算资源 批和流同时运行,资源开销大 个作业,资源开销小 重新计算时吞吐 批式全量处理,吞吐较高 流式全量处理,吞吐较批处理低 每个需求都需要两套不同代码,开发、 只需实现一套代码,开发、测试、上线难度 开发、测试 测试、上线难度大 相对较小 运维成本 维护两套系统(引擎),成本高 只维护一套系统(引擎),成本低 2022年个推TechDay“治数训练营”
20 . 混合架构 在真实的场景中,很多时候并不是完全规范的 Lambda架构或 Kappa架构,可以是两者的混合。 比如,大部分实时指标使用 Kappa架构完成计算,少量关键指标(比如金额相关)使用 Lambda 架构用批处理重新计算,增加一次校对过程。 2022年个推TechDay“治数训练营”
21 . 数据湖 数据湖(Data Lake)是一个以原始格式存储数据的存储库或系统。它按原样存储数据,而无需事先 对数据进行结构化处理。 数据湖可以存储结构化数据(如关系型数据库中的表),半结构化数据(如CSV、日志、XML、 JSON),非结构化数据(如电子邮件、文档、PDF)和二进制数据(如图形、音频、视频)。 2022年个推TechDay“治数训练营”
22 . 数据湖与数据仓库的区别 数据仓库 数据湖 能处理所有类型的数据,如结构化数据、非结构化数 主要处理历史的、结构化的数据,而且这些数据必 类型 据、半结构化数据等,数据的类型依赖于数据源系统 须与数据仓库事先定义的模型吻合。 的原始数据格式。 处理结构化数据,将它们或者转化为多维数据,或 适合于深度分析,拥有足够强的计算能力,用于处理 目的 者转换为报表,以满足后续的高级报表及数据分析 和分析所有类型的数据,分析后的数据会被存储起来 需求。 供用户使用。 特点 高性能、可重复性、持续使用 便于探索、创新、灵活性高 2022年个推TechDay“治数训练营”
23 . 数据湖示例 2022年个推TechDay“治数训练营”
24 . PART 3 实时数仓技术选型 2022年个推TechDay“治数训练营”
25 . 计算引擎选型 如何选型? 2022年个推TechDay“治数训练营”
26 . 计算引擎对比 组件 API 语义支持 延时 吞吐 容错机制 Window Watermark Storm Trident API Exactly One low low ACK No No Spark • SQL API At Least One hign hign RDD Yes No Streaming • 流 API SQL API Structured Exactly One low hign RDD Yes Yes Streaming • Stream API • State Flink • Table API Exactly One low hign Yes Yes • 分布式快照持久化 • SQL API 2022年个推TechDay“治数训练营”
27 . 计算引擎选型 计算引擎的选型主要基于延时和实时场景的两方面考虑: 1.延时 延时要求低:可以用 Spark Streaming,API丰富,吞吐量高,生态成熟。 延时要求高:推荐用 Flink,API丰富,目前社区活跃,相关生态迭代迅速。Structured Streaming 目前使用率较低,生态迭代发展较慢,不太成熟。 2.实时场景的要求 如果实时场景的需求比较特殊,比如窗口、Watermark等,推荐使用Flink,对实时场景的支 持比较完善。 备注:Storm相较于新的计算引擎各方面都不占明显优势,使用率较低。 2022年个推TechDay“治数训练营”
28 . PART 4 基于Flink建设实时数仓 2022年个推TechDay“治数训练营”
29 . 实时数仓的架构设计 目前,实时数仓基本也和离线数仓一致,采用分层的设计思路。 2022年个推TechDay“治数训练营”