连载:阿里巴巴大数据实践—实时技术

阿里数据人都在用的内部技术经验

关注数智化转型俱乐部,数智化不迷路

摘要
相对于离线批处理技术,流式实时处理技术作为一个非常重要的技术补充,在阿里巴巴集团内被广泛使用。

数据价值是具有时效性的,在一条数据产生的时候,如果不能及时处理并在业务系统中使用,就不能让数据保持最高的“新鲜度”和价值最大化。

相对于离线批处理技术,流式实时处理技术作为一个非常重要的技术补充,在阿里巴巴集团内被广泛使用。

在大数据业界中,流计算技术的研究是近年来非常热门的课题。

业务诉求是希望能在第一时间拿到经过加工后的数据,以便实时监控当前业务状态并做出运营决策,引导业务往好的方向发展。比如网站上一个访问量很高的广告位,需要实时监控广告位的引流效果,如果转化率非常低的话,运营人员就需要及时更换为其他广告,以避免流量资源的浪费。在这个例子中,就需要实时统计广告位的曝光和点击等指标作为运营决策的参考。

按照数据的延迟情况,数据时效性一般分为三种(离线、准实时、实时):

  • 离线:在今天(T)处理N天前(T-N,N≥1)的数据,延迟时间粒度为天。

  • 准实时:在当前小时(H)处理N小时前(H-N,N>0,如0.5小时、1小时等)的数据,延迟时间粒度为小时。

  • 实时:在当前时刻处理当前的数据,延迟时间粒度为秒;

离线和准实时都可以在批处理系统中实现(比如Hadoop、MaxCompute、Spark等系统),只是调度周期不一样而已,而实时数据则需要在流式处理系统中完成。简单来说,流式数据处理技术是指业务系统每产生一条数据,就会立刻被采集并实时发送到流式任务中进行处理,不需要定时调度任务来处理数据。

整体来看,流式数据处理一般具有以下特征。

1.时效性高

数据实时采集、实时处理,延时粒度在秒级甚至毫秒级,业务方能够在第一时间拿到经过加工处理后的数据。

2.常驻任务

区别于离线任务的周期调度,流式任务属于常驻进程任务,一旦启动后就会一直运行,直到人为地终止,因此计算成本会相对比较高。这一特点也预示着流式任务的数据源是无界的,而离线任务的数据源是有界的。这也是实时处理和离线处理最主要的差别,这个特性会导致实时任务在数据处理上有一定的局限性。

3.性能要求高

实时计算对数据处理的性能要求非常严格,如果处理吞吐量跟不上采集吞吐量,计算出来的数据就失去了实时的特性。比如实时任务1分钟只能处理30秒采集的数据,那么产出的数据的延时会越来越长,不能代表当前时刻的业务状态,有可能导致业务方做出错误的运营决策。在互联网行业中,需要处理的数据是海量的,如何在数据量快速膨胀的情况下也能保持高吞吐量和低延时,是当前面临的重要挑战。因此,实时处理的性能优化占了任务开发的很大一部分工作。

4.应用局限性

实时数据处理不能替代离线处理,除了计算成本较大这个因素外,对于业务逻辑复杂的场景(比如双流关联或者需要数据回滚的情况),其局限性导致支持不足。另外,由于数据源是流式的,在数据具有上下文关系的情况下,数据到达时间的不确定性导致实时处理跟离线处理得出来的结果会有一定的差异。

 ◆  ◆

流式技术架构

在流式计算技术中,需要各个子系统之间相互依赖形成一条数据处理链路,才能产出结果最终对外提供实时数据服务。在实际技术选型时,可选的开源技术方案非常多,但是各个方案的整体架构是类似的,只是各个子系统的实现原理不太一样。另外,流式技术架构中的系统跟离线处理是有交叉的,两套技术方案并不是完全独立的,并且在业界中有合并的趋势。

各个子系统按功能划分的话,主要分为以下几部分:

1.数据采集

数据的源头,一般来自于各个业务的日志服务器(例如网站的浏览行为日志、订单的修改日志等),这些数据被实时采集到数据中间件中,供下游实时订阅使用。

2.数据处理

数据被采集到中间件中后,需要下游实时订阅数据,并拉取到流式计算系统的任务中进行加工处理。这里需要提供流计算引擎以支持流式任务的执行。

3.数据存储

数据被实时加工处理(比如聚合、清洗等)后,会写到某个在线服务的存储系统中,供下游调用方使用。这里的写操作是增量操作,并且是源源不断的。

4.数据服务

在存储系统上会架设一层统一的数据服务层(比如提供HSF接口、HTTP服务等),用于获取实时计算结果。

整体技术架构如图所示:

从图可以看出,在数据采集和数据服务部分实时和离线是公用的,因为在这两层中都不需要关心数据的时效性。这样才能做到数据源的统一,避免流式处理和离线处理的不一致。

  ◆  ◆

流式数据模型

在流式计算技术中,需要各个子系统之间相互依赖形成一条数据处理链路,才能产出结果最终对外提供实时数据服务。在实际技术选型时,可选的开源技术方案非常多,但是各个方案的整体架构是类似的,只是各个子系统的实现原理不太一样。另外,流式技术架构中的系统跟离线处理是有交叉的,两套技术方案并不是完全独立的,并且在业界中有合并的趋势。

各个子系统按功能划分的话,主要分为以下几部分:

数据模型设计是贯通数据处理过程的,流式数据处理也一样,需要对数据流建模分层。实时建模跟离线建模非常类似,数据模型整体上分为五层(ODS、DWD、DWS、ADS、DIM)。

由于实时计算的局限性,每一层中并没有像离线做得那么宽,维度和指标也没有那么多,特别是涉及回溯状态的指标,在实时数据模型中几乎没有。

整体来看,实时数据模型是离线数据模型的一个子集,在实时数据处理过程中,很多模型设计就是参考离线数据模型实现的。

1.数据分层

在流式数据模型中,数据模型整体上分为五层。

  • ODS层:跟离线系统的定义一样,ODS层属于操作数据层,是直接从业务系统采集过来的最原始数据,包含了所有业务的变更过程,数据粒度也是最细的。在这一层,实时和离线在源头上是统一的,这样的好处是用同一份数据加工出来的指标,口径基本是统一的,可以更方便进行实时和离线间数据比对。例如:原始的订单变更记录数据、服务器引擎的访问日志。

  • DWD层:DWD层是在ODS层基础上,根据业务过程建模出来的实时事实明细层,对于访问日志这种数据(没有上下文关系,并且不需要等待过程的记录),会回流到离线系统供下游使用,最大程度地保证实时和离线数据在ODS层和DWD层是一致的。例如:订单的支付明细表、退款明细表、用户的访问日志明细表。

  • DWS层:订阅明细层的数据后,会在实时任务中计算各个维度的汇总指标。如果维度是各个垂直业务线通用的,则会放在实时通用汇总层,作为通用的数据模型使用。比如电商网站的卖家粒度,只要涉及交易过程,就会跟这个维度相关,所以卖家维度是各个垂直业务的通用维度,其中的汇总指标也是各个业务线共用的。例如:电商数据的几大维度的汇总表(卖家、商品、买家)。

  • ADS层:个性化维度汇总层,对于不是特别通用的统计维度数据会放在这一层中,这里计算只有自身业务才会关注的维度和指标,跟其他业务线一般没有交集,常用于一些垂直创新业务中。例如:手机淘宝下面的某个爱逛街、微淘等垂直业务。

  • DIM层:实时维表层的数据基本上都是从离线维表层导出来的,抽取到在线系统中供实时应用调用。这一层对实时应用来说是静态的,所有的ETL处理工作会在离线系统中完成。维表在实时应用的使用中跟离线稍有区别,后面章节中会详细说明。例如:商品维表、卖家维表、买家维表、类目维表。

2.多流关联

在流式计算中常常需要把两个实时流进行主键关联,以得到对应的实时明细表。在离线系统中两个表关联是非常简单的,因为离线计算在任务启动时已经可以获得两张表的全量数据,只要根据关联键进行分桶关联就可以了。但流式计算不一样,数据的到达是一个增量的过程,并且数据到达的时间是不确定的和无序的,因此在数据处理过程中会涉及中间状态的保存和恢复机制等细节问题。

比如A表和B表使用ID进行实时关联,由于无法知道两个表的到达顺序,因此在两个数据流的每条新数据到来时,都需要到另外一张表中进行查找。如A表的某条数据到达,到B表的全量数据中查找,如果能查找到,说明可以关联上,拼接成一条记录直接输出到下游;但是如果关联不上,则需要放在内存或外部存储中等待,直到B表的记录也到达。多流关联的一个关键点就是需要相互等待,只有双方都到达了,才能关联成功。

下面通过例子(订单信息表和支付信息表关联)来说明,如图示。

在上面的例子中,实时采集两张表的数据,每到来一条新数据时都在内存中的对方表截至当前的全量数据中查找,如果能查找到,则说明关联成功,直接输出;如果没查找到,则把数据放在内存中的自己表数据集合中等待。另外,不管是否关联成功,内存中的数据都需要备份到外部存储系统中,在任务重启时,可以从外部存储系统中恢复内存数据,这样才能保证数据不丢失。因为在重启时,任务是续跑的,不会重新跑之前的数据。

另外,订单记录的变更有可能发生多次(比如订单的多个字段多次更新),在这种情况下,需要根据订单ID去重,避免A表和B表多次关联成功;否则输出到下游就会有多条记录,这样得到的数据是有重复的。

以上是整体的双流关联流程,在实际处理时,考虑到查找数据的性能,实时关联这个步骤一般会把数据按照关联主键进行分桶处理,并且在故障恢复时也根据分桶来进行,以降低查找数据量和提高吞吐量。

3.维表使用

在离线系统中,一般是根据业务分区来关联事实表和维表的,因为在关联之前维表的数据就已经就绪了。而在实时计算中,关联维表一般会使用当前的实时数据(T)去关联T-2的维表数据,相当于在T的数据到达之前需要把维表数据准备好,并且一般是一份静态的数据。

为什么在实时计算中这么做呢?主要基于以下几点的考虑。

  • 数据无法及时准备好:当到达零点时,实时流数据必须去关联维表(因为不能等待,如果等就失去了实时的特性),而这个时候T-1的维表数据一般不能在零点马上准备就绪(因为T-1的数据需要在T这一天加工生成),因此去关联T-2维表,相当于在T-1的一天时间里加工好T-2的维表数据。

  • 无法准确获取全量的最新数据:维表一般是全量的数据,如果需要实时获取到当天的最新维表数据,则需要T-1的数据+当天变更才能获取到完整的维表数据。也就是说,维表也作为一个实时流输入,这就需要使用多流实时关联来实现。但是由于实时数据是无序的并且到达时间不确定,因此在维表关联上有歧义。

  • 数据的无序性:如果维表作为实时流输入的话,获取维表数据将存在困难。比如10:00点的业务数据成功关联维表,得到了相关的维表字段信息,这个时候是否就已经拿到最新的维表数据了呢?其实这只代表拿到截至10:00点的最新状态数据(实时应用永远也不知道什么时候才是最新状态,因为不知道维表后面是否会发生变更)。

因此在实时计算中维表关联一般都统一使用T-2的数据,这样对于业务来说,起码关联到的维表数据是确定的(虽然维表数据有一定的延时,但是许多业务的维表在两天之间变化是很少的)。

在有些业务场景下,可以关联T-1的数据,但T-1的数据是不全的。比如在T-1的晚上22:00点开始对维表进行加工处理,在零点到达之前,有两个小时可以把数据准备好,这样就可以在T的时候关联T-1的数据了,但是会缺失两个小时的维表变更过程。

另外,由于实时任务是常驻进程的,因此维表的使用分为两种形式。

  • 全量加载:在维表数据较少的情况下,可以一次性加载到内存中,在内存中直接和实时流数据进行关联,效率非常高。但缺点是内存一直占用着,并且需要定时更新。例如:类目维表,每天只有几万条记录,在每天零点时全量加载到内存中。

  • 增量加载:维表数据很多,没办法全部加载到内存中,可以使用增量查找和LRU过期的形式,让最热门的数据留在内存中。其优点是可以控制内存的使用量;缺点是需要查找外部存储系统,运行效率会降低。例如:会员维表,有上亿条记录,每次实时数据到达时,去外部数据库中查询,并且把查询结果放在内存中,然后每隔一段时间清理一次最近最少使用的数据,以避免内存溢出。

在实际应用中,这两种形式根据维表数据量和实时性能要求综合考虑来选择使用。注:本书中出现的部分专有名词、专业术语、产品名称、软件项目名称、工具名称等,是淘宝(中国)软件有限公司内部项目的惯用词语,如与第三方名称雷同,实属巧合。

点击阅读原文查看《阿里巴巴大数据实践-数据开发》

  • 节选自《大数据之路:阿里巴巴大数据实践》已受版权保护,未经授权不得转载

历史好文推荐

  1. 从0到1搭建大数据平台之计算存储系统

  2. 从0到1搭建大数据平台之调度系统

  3. 从0到1搭建大数据平台之数据采集系统

  4. 如何从0到1搭建大数据平台

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/56214.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里巴巴数学竞赛详细解答(据说晋级的直接P8岗)

关注并星标 从此不迷路 计算机视觉研究院 公众号ID|ComputerVisionGzq 学习群|扫码在主页获取加入方式 计算机视觉研究院专栏 作者:Edison_G 随着社会工作的沉淀,数学这些学问都忘记的差不多了,能力有限,解…

数学建模写作排版——LaTeX

笔记简介 2022年11月24日APAMCM开赛,但作为写论文的人员,在22号晚上11点对latex的使用还不是非常的熟练。于是在今天发奋图强,学会最基本的latex的用法。在有模板的情况下,能够写出完整的排版好看的文章。 latex模板 一般官网上…

项目组入职一个阿里的大 牛,看他写代码真的太优雅了

引言 很多同学在工作一段时间之后可能都有这样的困境,大家觉得自己总是在写业务代码,技术上感觉好像没有多大的长进,不知不觉就成为了CURD Boy或者Girl,自己想要去改变但是又不知道该从何处进行入手。 有的同学会去学习如何做架…

数学建模——论文(latex写作)

LaTeX 前言一、texlive 安装与Texstudio编辑器二、开始编辑基础编写文档1.设置文档类型:*宏包导入处: 2.开始正文 命令标题注释段落设置(顶格与不顶格) 图片表格公式行内公式行间公式行间公式之无编号行间公式之有编号 多行公式不带编号带编号…

他是阿里P11,靠写代码写成合伙人,身家几十亿,没有他,我们可能刷不了淘宝!...

点击“技术领导力”关注∆ 每天早上8:30推送 作者| Mr.K 编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 他是阿里的“扫地僧”,写代码级别最高的人,一等一的技术高手,他非科班出身,用近20年的时间,修…

阿里巴巴数学大赛赛题公布,你敢来挑战吗?(含参考答案)

9月中旬,阿里巴巴在全球范围内发起一场数学比赛,旨在让全社会看到基础科学尤其是数学的价值,理解数学之美。目前,组织方正在紧张地阅卷中,AI会辅助阅卷。 这次数学大赛引发社会强烈关注。活动公开不到一周,…

大淘宝技术提出TTNet算法荣获“最佳工业论文奖”奖项

大淘宝技术商家赋能算法团队联合浙江大学提出的TTNet算法荣获“最佳工业论文奖”奖项。 由IEEE计算机学会、国际网络智能协会、美国计算机学会主办,牛津大学、昆士兰大学、迪肯大学、中国医学科学院、东南大学、南京财经大学、PIESAT、大淘宝技术部、IOS Press协办的…

今天,阿里巴巴报告厅里只谈快乐的数学

3月29日下午,伴随着巴赫的经典G大调小步舞曲,第一届阿里巴巴全球数学竞赛颁奖典礼在杭州举办。在阿里巴巴报告厅里,马老师为数十位年轻选手一一颁奖。这些来自全球各地的数学顶尖高手相聚一堂,谈论着快乐数学和数学之美。 马老师为…

【技术大牛招募】-- 阿里巴巴 南京研发中心

大家好,相信大家这段实际的的朋友圈都被阿里江苏总部的文章刷屏了,作为先遣部队,阿里巴巴集团客户体验事业群-智能创新中心-南京研发中心(目前办公地点坐标江宁九龙湖),上图是同事拍的办公楼。现招募岗位如…

阿里巴巴人工智能实验室(Ali A.I. Labs)负责人浅雪近期问答整理

目前开发者平台成为大厂兵家必争之地。谷歌开发者平台,紧随其后百度的AI开发者平台,科大讯飞开放平台(挑了一个1024大吉大利的日子发布)。人工智能时代,连硬件厂商曙光都开始做开发者平台了(10月24日&#…

连载:阿里巴巴大数据实践—数据开发平台

阿里数据人都在用的内部技术经验 关注数智化转型俱乐部,数智化不迷路 摘要介绍MaxCompute和阿里巴巴内部基于MaxCompute的大数据开发套件,并对在数据开发过程中经常遇到的问题和相关解决方案进行介绍。 数据只有被整合和计算,才能被用于洞察商…

语音聊天机器人

这个机器人有点智障,主要是免费的图灵机器人接口,就是前些日子没回家休假的雪轩的弟弟雪桐,一个微信聊天机器人,他可能没她姐姐功能多但还是可以使用的。 为什么写一个语音聊天机器人呢?还是上周六中午吃饭的时候&…

chatgpt赋能python:Python人脸对比技术介绍

Python人脸对比技术介绍 人脸识别技术在现代社会中得到了广泛的应用,具有便捷、高效和精度高等优点。Python作为一种高级编程语言,具有方便、易用的特点,受到了越来越多的人的青睐。Python人脸对比技术就是Python在人脸识别技术领域的一种重…

chatgpt赋能Python-python2下载安装教程

Python2下载安装教程 Python是一种高级编程语言,由于其易于学习和使用的特点,在全球范围内受到了广泛的欢迎和使用。Python2是Python语言的早期版本,虽然已经逐渐被Python3所取代,但仍有许多项目在使用Python2。因此,…

chatgpt赋能python:Python宏替换:让你的代码更高效

Python宏替换:让你的代码更高效 Python是一种高级编程语言,它将程序员从繁琐的底层实现细节中解放出来。Python宏替换是一种强大的编程技术,可以加速开发过程并提高代码的可读性。在本文中,我们将介绍Python宏替换,包…

类似于ChatGPT的优秀应用notion

notion 是一款流行的笔记应用。不过功能实际远超笔记,官方自己定义是:“将笔记、知识库和任务管理无缝整合的协作平台”。其独特的 block 概念,极大的扩展了笔记文档的作用,一个 block 可以是个数据库、多媒体、超链接、公式等等。…

陶哲轩的10岁与30岁

Terence Tao(陶哲轩),1975年7月17日出生于澳大利亚Adelaide(阿德莱德)。本讲话作于1985年上半年,即陶哲轩尚未满10周岁时所作,一个稚气儿童,给大学生和教授们作报告,少见…

三位物理学家与陶哲轩证明的惊天定理,原来早在教科书里吗?

陶哲轩菲尔兹奖得主,著名华裔数学家,号称地表最强大脑的拥有者, 近日他与三位物理学家共同发表了一篇论文发现了特征值与特征向量之间的全新关系,在业内引起了不小的反响。 特征值与特征向量 特征值是线性代数中的一个重要概念。其实简单的理解特征值与特征向量就要从线性…

华裔天才数学家-陶哲轩

 陶哲轩 当代最年轻的天才数学家,他的才学、人格魅力和治学风范值得我们尊敬和学习。 陶哲轩,男,1975年7月17日出生于澳大利亚阿德莱德, 华裔数学家,任教于美国 加州大学洛杉矶分校&#xff0…