聊聊Lambda架构

Lambda 架构 (Partial Recomputation algorithms),也即选取必要的历史数据进行重新计算,以生日推断算法为例,假设新数据中只包含用户 A 的数据,那么,我们可以从主数据集中选取用户 A 的历史数据与新数据合并,再进行计算,这样计算的数据量将会大大减少。比如,假设用户的报表需要按月、按天、按小时、按分钟等维度的视图,最简单的方法是只保存一份分钟级视图,若用户需要查询小时级粒度的数据,临时汇聚。而增量计算只会对新的数据进行计算,并将计算出来的视图与已有视图进行合并,形成新的批视图。 阅读详情

定义

在数据分析场景中,我们可能会遇到这样的问题。例如,我们要做一个推荐系统,如果我们用批处理任务去做,一天或者一小时的推荐频次明显延迟太大。如果用流处理任务,虽然延迟的问题解决了,然而只用实时数据而没有历史数据,那么准确性就无法保证。因此需要结合批处理的历史数据和流处理的实时数据进行处理,既能保证准确性,又能保证实时性。再比如反作弊系统,实时识别作弊用户的时候同时需要用到用户的历史行为。

针对上述问题,Storm 的作者 Nathan Marz 提出了 Lambda 架构。根据维基百科的定义,Lambda 架构的设计是为了在处理大规模数据时,同时发挥流处理和批处理的优势。通过批处理提供全面、准确的数据,通过流处理提供低延迟的数据,从而达到平衡延迟、吞吐量和容错性的目的。为了满足下游的即席查询,批处理和流处理的结果会进行合并。

从上面定义可以看出,Lambda 架构包含三层,Batch Layer、Speed Layer 和 Serving Layer。架构图如下:

下面分别介绍这三层架构的作用。

  • Batch Layer:批处理层,对离线的历史数据进行预计算,为了下游能够快速查询想要的结果。由于批处理基于完整的历史数据集,因此准确性可以得到保证。批处理层可以用 Hadoop、Spark 和 Flink 等框架计算
  • Speed Layer:加速处理层,处理实时的增量数据,这一层重点在于低延迟。加速层的数据不如批处理层那样完整和准确,但是可以填补批处理高延迟导致的数据空白。加速层可以用 Storm、Spark streaming 和 Flink 等框架计算
  • Serving Layer:合并层,计算历史数据和实时数据都有了, 合并层的工作自然就是将两者数据合并,输出到数据库或者其他介质,供下游分析。

Amazon AWS 的 Lambda 架构

这里,我将用 AWS 作为例子来介绍 Lambda 架构,AWS Lambda 架构图如下

 

Batch Layer:使用 S3 bucket 从各种数据源收集数据,使用 AWS Glue 进行 ETL,输出到 Amazon S3。数据也可以输出到 Amazon Athena (交互式查询工具)

Speed Layer: 从上图看加速层有三个过程

  • Kinesis Stream 从实时数据流中处理增量的数据,这部分数据数据输出到 Serving Layer 的 Amazon EMR,也可以输出到 Kinesis Firehose 对增量数据进行后续处理
  • Kinesis Firehose 处理增量数据并写入 Amazone S3 中
  • Kinesis Analytics 提供 SQL 的能力对增量的数据进行分析

其实只有上面第一个组件与我们今天讨论的 Lambda 架构有关,其他两个组件只是针对实时处理的。

Serving Layer:合并层使用基于 Amazon EMR 的 Spark SQL 来合并 Batch Layer 和 Speed Layer 的数据。批处理数据可以从 Amazon S3 加载批处理数据,实时数据可以从 Kinesis Stream 直接加载,合并的数据可以写到 Amazone S3。下面是一段合并数据代码

以上便是 Amazon AWS 实现 Lambda 架构的简单介绍。

我的经历

接下来分享下我之前的项目经历。其实,我们的项目跟上面的 Lambda 架构并不是特别贴合,但是我觉得思想是一致的。本质上都是批处理和流处理相关补充,同时发挥二者的优势。

我们的业务是处理用户的定位数据,最开始主要使用 Spark Streaming 进行增量处理,处理后的数据实时写入 MongoDB。数据读写以用户 id 为粒度,由于粒度比较细,因此每天的数据量比较大。前端如果查询时间跨度较大的数据,每次都需按照用户粒度数据做聚合,导致查询响应比较慢且容易影响实时写入。因此,我们用批处理任务对历史的离线数据进行预计算,再存储到 MongoDB。同时我们开发了基于 gRPC 实现的一套 Service 来充当 Serving Layer,将历史的数据与实时的数据合并返回给前端,避免前端直接连接数据库。在这个项目中我们的 Batch Layer 和 Speed Layer 都是用的 Spark 框架,因此维护相对容易。

之前介绍 Lambda 都是用加速层弥补批处理层的空白,但是上面的例子中是用批处理层弥补加速层的不足。因此,架构设计只是一个思想,具体的实施还是要根据业务进行灵活变通,不能生搬硬套。

小结

本篇文章简单介绍了 Lambda 架构的内容,同时介绍了 Amazon AWS 实现 Lambda 架构的例子。最后举了一个我自己项目中的一个例子。经过整篇内容我们了解了 Lambda 架构的优势,但是它有没有缺点呢。显然也是有的,我能想到的有以下几点:

  • 批处理层、加速层和合并层用到的框架可能不一样,因此会增加了开发的成本
  • 批处理层和加速层处理的结果有可能不一致,如果用户看到的数据会变,这个体验不太好
  • 如果某一层的逻辑变了,是不是其他两层或者一层的逻辑也要跟着变,因此层与层处理逻辑耦合度较大

你还能想到其他的问题吗, 以及有没有更好的架构能解决这个问题?欢迎交流

欢迎关注公众号「渡码」

 

大数据架构之-- Lambda架构 一、什么是Lambda架构 Lambda架构由Storm 的作者 [Nathan Marz] 提出, 根据维基百科的定义,Lambda 架构的设计是为了在处理大规模数据时,同时发挥流处理和批处理的优势。通过批处理提供全面、准确的数据,通过流处理提供低延迟的数据,从而达到平衡延迟、吞吐量和容错性的目的。为了满足下游的即席查询,批处理和流处理的结果会进行合并。 二、Lambda架构组成 Lambda 架构包含三层,Batch Layer、Speed Layer 和 Serving Layer。架. 阅读详情

相关推荐

Oracle 11g版本下载及安装超详细教程图解

新手Oracle安装教程

weixin_43738344的博客 10万+

架构设计之大数据架构(Lambda架构、Kappa架构)

Lambda、Kappa大数据架构介绍

Elaine的博客 7617

django安装mysqlclient (Windows下正确安装mysqlclient)

由于本人也是初学Python和django。本人使用的Python版本是3.7所以连接MySQL数据库需要安装数据驱动,对应Python3的数据驱动是mysqlclient。因此本人习惯性的使用命令pip install mysqlclient,结果安装失败 (venv) C:\Users\songlihui\PycharmProjects\autotest>pip install my...

songlh1234的博客 2万+

用于实时大数据处理的Lambda架构

本文介绍了Lambda架构的基本概念。Lambda架构通过对数据和查询的本质认识,融合了不可变性(Immunability),读写分离和复杂性隔离等一系列架构原则,将大数据处理系统划分为Batch Layer, Speed Layer和Serving Layer三层,从而设计出一个能满足实时大数据系统关键特性(如高容错、低延时和可扩展等)的架构。

brucesea的专栏 2万+

使用html和JavaScript实现一个简易的物业管理系统

码实现了一个简易的物业管理系统,主要使用了以下技术和功能: 1.主要技术 使用的技术: HTML: 用于构建网页的基本结构。 包括表单、表格、按钮等元素。 CSS: 用于美化网页的外观和布局。 设置字体、颜色、边距、对齐方式等样式。 JavaScript: 用于处理用户交互和动态更新页面内容。 实现了新增住户、查询住户、编辑住户、删除住户等功能。 处理表单提交事件,验证输入数据,并更新表格显示。 DOM操作: 使用 JavaScript 直接操作 HTML DOM 元素。 动态

weixin_41312759的博客 1778

Workbuddy+DeepSeek V4傻瓜流配置全指南:API接入、模型切换与Agent实战

AI编程助手的核心价值不在于模型本身,而在于如何稳定、安全、低门槛地调用其能力。Agent作为智能体范式,依赖可靠的运行时环境与标准化API通信;DeepSeek V4系列凭借高吞吐、低延迟和强工具调用支持,成为当前生产级Agent的理想引擎。Workbuddy则通过本地配置管理、环境变量注入与UTF-8无BOM容错等工程设计,将复杂部署简化为可复现、可版本化、可团队协同的实践流程。本文聚焦API接入路径下的真实卡点——从Key获取验证、models.json字段语义到沙箱权限控制,覆盖开发者在Window

weixin_33702545的博客 2376

lambda 根据属性去重_聊聊Lambda架构

定义在数据分析场景中,我们可能会遇到这样的问题。例如,我们要做一个推荐系统,如果我们用批处理任务去做,一天或者一小时的推荐频次明显延迟太大。如果用流处理任务,虽然延迟的问题解决了,然而只用实时数据而没有历史数据,那么准确性就无法保证。因此需要结合批处理的历史数据和流处理的实时数据进行处理,既能保证准确性,又能保证实时性。再比如反作弊系统,实时识别作弊用户的时候同时需要用到用户的历史行为。针对上述问...

weixin_30624767的博客 258

【VSCode Python无法格式化代码】

提示:需要Install Formatter…安装插件autopep8,点击install。出现Format Document。

AIFRZ的博客 1万+

从Lambda到Kappa:大数据架构选型,别再只看PPT了!聊聊我们踩过的那些坑

本文分享了从Lambda架构到Kappa架构的大数据架构选型实战经验,揭示了电商实时推荐系统重构过程中遇到的时间窗口对齐、历史数据回溯、Kafka存储成本等关键问题。通过对比分析两种架构的优缺点,最终提出混合架构解决方案,帮助团队在延迟、成本和开发效率之间找到平衡点。

weixin_30600197的博客 279

基于SiamFC的红外目标跟踪

初始化阶段:在第一帧中,通过用户标注获得目标框,从目标区域中提取一个固定大小的模板(称为 exemplar)。搜索阶段:在后续帧中,在以当前目标中心为中心的较大区域(称为 instance)内进行搜索,将模板与搜索区域通过卷积操作得到响应图。位置更新:在响应图中找到峰值位置,并转换到原图坐标,用以更新目标中心。部分实现中还会考虑多尺度搜索和目标尺寸更新。import cv2# 定义 SiamFC 简易网络(示例)# 特征提取部分,注意红外图像通常为单通道,使用较少的卷积核数提高实时性。

weixin_43745234的博客 774

计算机网络实验报告实验七可靠传输TCP协议分析

计算机网络实验报告实验七可靠传输TCP协议分析

m0_56638814的博客 966

聊聊Kotlin中的lambda

聊聊Kotlin中的lambda 本质 kotlin中的lambda使用创建类和调用类实现。 实现原理 将lambda定义的方法变成一个function类,其invoke方法体内容也就是lambda的方法体。 在lambda执行的时候会创建这个function类再调用其invoke方法实现。 代码演示 fun main(args: Array<String>) { foo { println("dive into Kotlin...") }

北洋的博客 1210

一文读懂 STAR-CCM+:多物理场仿真王者,从入门到精通全攻略(附实战路线)

STAR-CCM+是西门子旗下的多物理场仿真平台,集流体、传热、结构、电磁等耦合求解于一体。其核心优势包括:全自动网格处理技术(支持十亿级网格)、多物理场无缝耦合、CPU/GPU并行加速计算、流程自动化与设计探索等。广泛应用于汽车(空气动力学优化、电池热管理)、航空航天(气动设计、发动机仿真)、能源(风电叶片流固耦合)、电子(芯片散热)等行业。相比ANSYS Fluent和OpenFOAM,STAR-CCM+在多物理场耦合和复杂几何处理方面更具优势,适合工业级高精度仿真需求。学习路径建议从基础操作入手,逐步

源代码杀手的博客 340

一篇搞懂大数据Lambda架构及实践

lambda为了解决什么?lambda是什么?lambda的优缺点又是什么?快来这里了解一下

EdwardWang_的博客 3145

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

聊聊实时数仓架构设计

什么是实时数仓首先需要明确什么是实时数仓,百度百科与维基百科都没有给出具体说明,哪究竟什么才是实时数仓呢?是不是可以通过实时流实时获取数据就是实时数仓?或者说流批一体就是实时数仓?在或者全...

http://www.54tianzhisheng.cn/ 578

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

别再纠结Lambda和Kappa了!聊聊我们团队从Lambda迁移到Flink流批一体的真实踩坑经历

本文分享了团队从Lambda架构迁移到Flink流批一体的实战经验,详细解析了技术选型、迁移过程中的关键陷阱及解决方案。通过统一DataStream API和状态管理机制,实现了实时数仓的高效构建,最终将业务指标延迟从小时级压缩到秒级,显著提升资源利用率和数据一致性。

weixin_33743880的博客 433

聊聊 C++ 和 C# 中的 lambda 玩法

这几天在看 C++ 的 lambda 表达式,挺有意思,这个标准是在 加进去的,也就是 2011 年,相比 C# 2007 还晚了个 4 年, Lambda 这东西非常好用,会上瘾,今天我们简单聊一聊。首先我们看下 C++ 语法定义格式:相比 C# lambda 的语法格式:要复杂一些,之所以复杂还是因为 C++ 让程序员用的必须更谨慎一些。为了说明更谨慎在哪里,我们上一个简单的例子。 上面就定义了一个原子化的 lambda 函数,在现实开发中往往不仅要获取参数,还要获取 的变量,比如说,我想计算 的

www_xuhss_com的博客 1498

现代编程语言都具备的Lambda到底是个啥?详细聊聊Lambda与函数式接口

本篇主要给大家带来的前世今生和函数式接口的关系,并详细讲解函数式接口中的四个主要接口和一众衍生接口,在文章正式开始之前,想必一些读者也是知道是匿名表达式的,但是可能并不清楚它是根据什么规则进行的转换,想必大家看完本文之后会有一个清晰的了解。...

m0_72885838的博客 1288

聊聊kotlin之Lambda表达式解析(二)

1.lambda类型解释 在kotlin中,lambda可以表示函数类型,也可以表示Java语言声明的函数式接口,但用kotlin语言声明的函数式接口是不能用lambda表示的,kotlin声明的函数式接口和lambda是不能互相转换的。 lambda表示函数: val addMethod: (Int, Int) -> Int = { a, b -> a + b } lambda表示java声明的函数式接口: val runnable: Runnable = Runnable { pr

haoxl1994的博客 986

聊聊工作中常用的Lambda表达式

本文我们介绍了,工作中常用的十几种Lambda 表达式的使用。一起加油。

LoveSummer 2万+

【WPF】聊聊WPF中INotifyPropertyChanged [TOC]

接口用于向客户端发出某一属性值已更改的通知。在应用有两种方式OneTime模式、OneWay模式和TwoWay模式。OneTime模式OneTime模式是一个初始化一次绑定。不常用。OneWay模式绑定源的每一次变化都会通知绑定目标,但是绑定目标的改变不会改变绑定源。当绑定源的数据实体类没有实现INotifyPropertyChanged接口时,当改变了数据源,发现绑定目录的UI上的相应的数据不会立即变化。TwoWay模式TwoWay。

记录总结工作过往 3045

随便聊聊Lambda

C#用多了,对于Lambda肯定不陌生,作为创建委托的一种简易方式,使用上确实相当顺手,不过用的多了,难免也会踩坑,下面这个坑可能就有不少朋友踩过:var count = 8; var Func = new List<Action>(count);for (int i = 0; i < count; ++i) { Func.Add(() => { Console.WriteLine(i);

tkokof1的专栏 375

【C++ 面试真题】14. 聊聊 C++ 的 lambda 表达式

lambda 是 C++11 引入的"明星特性"——写起来爽、用起来多,但面试真考起来,很多人只说得出"匿名函数",却答不清"它到底是个什么类型、捕获列表干了什么、值捕获和引用捕获有啥区别"。本文用问答的方式,把 lambda 一次讲透。

码工许师傅 347
上一篇: 工作4年后的一些思考
下一篇: 从 5G 到 Flink 101
渡码
博客等级 码龄14年 31粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值