共计 3866 个字符,预计需要花费 10 分钟才能阅读完成。
近日,个推 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。如下图,每个计算引擎都有其个性。
各实时计算引擎个性比照
咱们倡议综合思考延时和实时场景需要等方面因素,来进行计算引擎的选型。
1. 延时
如果对延时要求较低,能够应用 Spark Streaming。Spark Streaming 的 API 十分丰盛,并且吞吐量高。此外 Spark 曾经倒退较长时间,其生态体系也比拟成熟。如果对延时要求高,则举荐应用 Flink。Flink 的 API 也是绝对比拟丰盛的,而且目前 Flink 社区十分沉闷,尤其是在中国,其相干生态迭代迅速。Structured Streaming 也可能满足低延时需要,然而其目前的使用率还比拟低,生态迭代倒退较慢,绝对来讲不是十分成熟。
2. 实时场景的要求
如果企业须要撑持一些比拟非凡的实时场景需要,比方窗口、Watermark 等,咱们比拟举荐 Flink。Flink 对实时场景的反对曾经十分欠缺了。相对而言,Storm 的劣势不显著,且整体较为古老,不是特地倡议应用。
实时数仓的建设和离线数仓统一,实时数仓的建设也采纳分层思维: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“治数训练营”下期更精彩,请大家继续关注~