数据系统架构——Lambda architecture(Lambda架构)

传统系统的问题

“我们正在从IT时代走向DT时代(数据时代)。IT和DT之间,不仅仅是技术的变革,更是思想意识的变革,IT主要是为自我服务,用来更好地自我控制和管理,DT则是激活生产力,让别人活得比你好”——阿里巴巴董事局主席马云。

数据量从M的级别到G的级别到现在T的级、P的级别。数据量的变化数据管理系统(DBMS)和数仓系统(DW)也在悄然的变化着。

传统应用的数据系统架构设计时,应用直接访问数据库系统。当用户访问量增加时,数据库无法支撑日益增长的用户请求的负载时,从而导致数据库服务器无法及时响应用户请求,出现超时的错误。出现这种情况以后,在系统架构上就采用图(A)的架构,在数据库和应用中间过一层缓冲隔离,缓解数据库的读写压力。然而,当用户访问量持续增加时,就需要考虑读写分离技术(Master-Slave)架构如图(B),分库分表技术。现在,架构变得越来越复杂了,增加队列、分区、复制等处理逻辑。应用程序需要了解数据库的schema,才能访问到正确的数据。

图(A)

图(B)

Lambda架构的背景

大数据处理技术需要解决这种可伸缩性与复杂性。首先要认识到这种分布式的本质,要很好地处理分区与复制,不会导致错误分区引起查询失败,而是要将这些逻辑内化到数据库中。当需要扩展系统时,可以非常方便地增加节点,系统也能够针对新节点进行rebalance。其次是要让数据成为不可变的。原始数据永远都不能被修改,这样即使犯了错误,写了错误数据,原来好的数据并不会受到破坏。

Storm的作者NathanMarz提出的一个实时大数据处理框架(Lambda架构)就满足以上两点。Marz在Twitter工作期间开发了著名的实时大数据处理框架Storm,Lambda架构是其根据多年进行分布式大数据系统的经验总结提炼而成。

Lambda架构的目标是设计出一个能满足实时大数据系统关键特性的架构,包括有:高容错、低延时和可扩展等。Lambda架构整合离线计算和实时计算,融合不可变性(Immunability),读写分离和复杂性隔离等一系列架构原则,可集成Hadoop,Kafka,Storm,Spark,Hbase等各类大数据组件。

大数据系统的关键特性

Marz介绍BigData System许具备的属性:

a、Robustandfault-tolerant(容错性和鲁棒性):对大规模分布式系统来说,机器是不可靠的,可能会当机,但是系统需要是健壮、行为正确的,即使是遇到机器错误。除了机器错误,人更可能会犯错误。在软件开发中难免会有一些Bug,系统必须对有Bug的程序写入的错误数据有足够的适应能力,所以比机器容错性更加重要的容错性是人为操作容错性。对于大规模的分布式系统来说,人和机器的错误每天都可能会发生,如何应对人和机器的错误,让系统能够从错误中快速恢复尤其重要。

b、Lowlatency reads and updates(低延时):很多应用对于读和写操作的延时要求非常高,要求对更新和查询的响应是低延时的。

c、Scalable(横向扩容):当数据量/负载增大时,可扩展性的系统通过增加更多的机器资源来维持性能。也就是常说的系统需要线性可扩展,通常采用scale
out(通过增加机器的个数)而不是scale up(通过增强机器的性能)。

d、General(通用性):系统需要能够适应广泛的应用,包括金融领域、社交网络、电子商务数据分析等。

e、Extensible(可扩展):需要增加新功能、新特性时,可扩展的系统能以最小的开发代价来增加新功能。

f、Allows ad hoc queries(方便查询):数据中蕴含有价值,需要能够方便、快速的查询出所需要的数据。

d、Minimal maintenance(易于维护):系统要想做到易于维护,其关键是控制其复杂性,越是复杂的系统越容易出错、越难维护。

h、Debuggable(易调试):当出问题时,系统需要有足够的信息来调试错误,找到问题的根源。其关键是能够追根溯源到每个数据生成点。

数据系统的本质

Marz认为:数据系统通过查询过去的(部分、全部)数据去回答问题。如:他是一个什么样的人?他有多少朋友?这个账号是否收支平衡?。因此,DataSystem的通用定义为Query=Function(alldata)。对通用的表达式进行分解得到:数据系统=数据+查询,从而可以从数据和查询两个方面认识大数据系统的本质。

数据本本质:When&What

数据是一个不可分割的单元,数据有两个关键的特性:When和What。

When是只数据是与时间相关的,也就是数据是在某个时间产生的。这个非常重要,在具有事务特性的数据库中,操作的先后顺序对结果至关重要。例如数据库的Binlog日志。因此,数据的时间性质决定了数据的全局发生先后,也就决定了数据的结果。

What是只数据的本身。由于数据跟某个时间点相关,所以数据的本身是不可变的(immutable),过往的数据已经成为事实(Fact),你不可能回到过去的某个时间点去改变数据事实。这也就意味着对数据的操作其实只有两种:读取已存在的数据和添加更多的新数据。采用数据库的记法,CRUD就变成了CR,Update和Delete本质上其实是新产生的数据信息,用C来记录。

数据的存储:StoreEverything Rawly and Immutably

根据上述对数据特性的分析,lambda架构中对数据的存储采用的方式是:数据不可变,存储所有数据。

采用这两种方式存储的好处:

a、简单。采用不可变的数据模型,存储数据时只需要简单的往主数据集后追加数据即可。相比于采用可变的数据模型,为了Update操作,数据通常需要被索引,从而能快速找到要更新的数据去做更新操作。

b、应对人为和机器的错误。人和机器每天都可能会出错,如何应对人和机器的错误,让数据系统快速恢复极其重要。不可变和可重复计算是应对认为和机器错误的常用方法。采用可变数据模型,引发错误的数据有可能被覆盖而丢失。相比于采用不可变的数据模型,因为所有的数据都在,引发错误的数据也在。修复的方法就可以简单的是遍历数据集上存储的所有的数据,丢弃错误的数据,重新计算得到Views。重新计算的关键点在于利用数据的时间特性决定的全局次序,依次顺序重新执行,必然能得到正确的结果。

当前业界有很多采用不可变数据模型来存储所有数据的例子。比如分布式数据库Datomic,基于不可变数据模型来存储数据,从而简化了设计。分布式消息中间件Kafka,基于Log日志,以追加append-only的方式来存储消息。

Lambda架构

Lambda架构的主要思想是将大数据系统架构为多层个层次,分别为批处理层(batchlayer)、实时处理层(speedlayer)、服务层(servinglayer)如图(C)。

理想状态下,任何数据访问都可以从表达式Query= function(alldata)开始,但是,若数据达到相当大的一个级别(例如PB),且还需要支持实时查询时,就需要耗费非常庞大的资源。一个解决方式是预运算查询函数(precomputedquery funciton)。书中将这种预运算查询函数称之为Batch
View(A),这样当需要执行查询时,可以从BatchView中读取结果。这样一个预先运算好的View是可以建立索引的,因而可以支持随机读取(B)。于是系统就变成:

(A)batchview = function(all data);

(B)query =function(batch view)。

图(C)

BatchLayer

在Lambda架构中,实现(A)batch view =function(all data)的部分称之为BatchLayer。他承担两个职责:

a、存储MasterDataset,这是一个不变的持续增长的数据集

b、针对这个MasterDataset进行预运算

在全体数据集上在线运行查询函数得到结果的代价太大,同时处理查询时间过长,导致用户体验不好。如果我们预先在数据集上计算并保存预计算的结果,查询的时候直接返回预计算的结果,而无需重新进行复制耗时的计算。显然,batchview是一个批处理过程,如采用Hadoop或spark支持的map-reduce方式。采用这种方式计算得到的每个view都支持再次计算,且每次计算的结果都相同。

图(D)

对View的理解: 

View是一个和业务关联性比较大的概念,View的创建需要从业务自身的需求出发。一个通用的数据库查询系统,查询对应的函数千变万化,不可能穷举。但是如果从业务自身的需求出发,可以发现业务所需要的查询常常是有限的。BatchLayer需要做的一件重要的工作就是根据业务的需求,考察可能需要的各种查询,根据查询定义其在数据集上对应的Views。

Batch Layer的Immutabledata模型和Views

如图(E)坐席(agentid=50023)的人,在10:00:06分的时候,状态是calling,在10:00:10的时候状态为waiting。在传统的数据库设计中,直接后面的纪录覆盖前面的纪录,而在Immutable数据模型中,不会对原有数据进行更改,而是采用插入修改纪录的形式更改历史纪录。

图(E)

上文所提及的View是图(E)中预先计算得到的相关视图,例如:2016-06-21当天所有上线的agent数,每条热线、公司下上线的Agent数。根据业务需要,预先计算出结果。此过程相当于传统数仓建模的应用层,应用层也是根据业务场景,预先加工出的view。

SpeedLayer

BatchLayer能够很好的处理离线数据,但是在很多场景数据不断产生,并且业务场景需要实时查询。SpeedLayer就是设计用来处理增量实时数据。

SpeedLayer和BatchLayer比较类似,对数据进行计算并生成RealtimeView,其主要的区别在于:

a、SpeedLayer处理的数据是最近的增量数据流,BatchLayer处理的是全体数据集

b、SpeedLayer为了效率,接收到新数据及时更新RealtimeView,而BatchLayer根据全体离线数据直接得到BatchView。SpeedLayer是一种增量计算,而非重新计算(recomputation)。

c、SpeedLayer因为采用增量计算,所以延迟小,而BatchLayer是全数据集的计算,耗时比较长。

综上所诉,SpeedLayer是BatchLayer在实时性上的一个补充。如图(F)

图(F)

SpeedLayer可总结为以(C)RealtimeView=function(RealtimeView,newdata);

LambdaArchitecture将数据处理分解为BatchLayer和SpeedLayer有如下优点:

a、容错性:SpeedLayer中处理的数据不断写入BatchLayer,当BatchLayer中重新计算数据集包含SpeedLayer处理的数据集后,当前的RealtimeView就可以丢弃,这就意味着SpeedLayer处理中引入的错误,在BatchLayer重新计算时都可以得到修证。这点也可以看成时CAP理论中的最终一致性(EventualConsistency)的体现。

b、复杂性隔离。BatchLayer处理的是离线数据,可以很好的掌控。Speed Layer采用增量算法处理实时数据,复杂性比Batch Layer要高很多。通过分开BatchLayer和Speed Layer,把复杂性隔离到Speed Layer,可以很好的提高整个系统的鲁棒性和可靠性。

ServingLayer

BatchLayer通过对MasterDataset执行查询获得BatchView,Speed
Layer通过增量计算提供RealtimeView。Lambda架构的ServingLayer用于响应用户的查询请求,合并BatchView和Realtime
View中的结果数据集到最终的数据集,如图(G)。因此,ServingLayer的职责包含:

a、对batchView和RealTimeView的随机访问

b、更新BatchVeiw和RealTimeView,并负责结合两者的数据,对用户提供统一的接口

图(G)

综上所诉,ServingLayer采用如下等式(D)表示:Query=function(BatchViews,RealtimeView)。

Lambda架构组件选型

下图给出了Lambda架构中各组件在大数据生态系统中和阿里集团的常用组件。数据流存储选用不可变日志的分布式系统Kafa、TT、Metaq;BatchLayer数据集的存储选用Hadoop的HDFS或者阿里云的ODPS;BatchView的加工采用MapReduce;BatchView数据的存储采用Mysql(查询少量的最近结果数据)、Hbase(查询大量的历史结果数据)。SpeedLayer采用增量数据处理Storm、Flink;RealtimeView增量结果数据集采用内存数据库Redis。

图(H)

Lambda是一个通用框架,各模块选型不要局限于上面给出的组件,特别是view的选型。因为View是和各业务关联非常大的概念,View选择组件时要根据业务的需求,选择最合适的组件。

Lambda架构的评估

优点:

a、数据的不可变性。里面给出的数据传输模型是在初始化阶段对数据进行实例化,这样的做法是能获益良多的。能够使得大量的MapReduce工作变得有迹可循,从而便于在不同阶段进行独立调试。

b、强调了数据的重新计算问题。在流处理中重新计算是个主要挑战,但是经常被忽视。比方说,某工作流的数据输出是由输入决定的,那么一旦代码发生改动,我们将不得不重新计算来检视变更的效度。什么情况下代码会改动呢?例如需求发生变更,计算字段需要调整或者程序发出错误,需要进行调试。

缺点:

a、Jay Kreps认为Lambda包含固有的开发和运维的复杂性。Lambda需要将所有的算法实现两次,一次是为批处理系统,另一次是为实时系统,还要求查询得到的是两个系统结果的合并。

由于存在以上缺点,Linkedin的Jaykreps提出了Kappa架构如图(I):

图(I)

1、使用Kafka或其它系统来对需要重新计算的数据进行日志记录,以及提供给多个订阅者使用。例如需要重新计算30天内的数据,我们可以在Kafka中设置30天的数据保留值。

2、当需要进行重新计算时,启动流处理作业的第二个实例对之前获得的数据进行处理,之后直接把结果数据放入新的数据输出表中。

3、当作业完成时,让应用程序直接读取新的数据记录表。

4、停止历史作业,删除旧的数据输出表。

Kappa架构暂时未做深入了解,在此不做评价。我个人觉得,不同的数据架构有各自的优缺点,我们使用的时候只能根据应用场景,选择更合适的架构,才能扬长避短。

参考资料:

Big Data:Principles and best practices of scalable real-time data systems——Nathan Marz

http://blog.csdn.net/brucesea/article/details/45937875

https://zhuanlan.zhihu.com/p/20510974

http://www.infoq.com/cn/news/2014/09/lambda-architecture-questions

时间: 2024-10-11 22:57:19

数据系统架构——Lambda architecture(Lambda架构)的相关文章

微内核架构(Microkernel Architecture)

微内核架构(Microkernel Architecture) 微内核架构有时也被成为插件架构模式(plug-in architecture pattern),通常用于实现基于产品的应用,如Eclipse和Firefox.然而许多公司也将内部的业务软件做成软件产品,提供版本.发版说明和插件特性.微内核架构模式通过插件向核心应用添加额外的功能,提供了可扩展性和功能的独立和分离. 模式描述 微内核架构包含两部分组件:核心系统(core system)和插件模块(plug-in modules).应用

Lambda architecture and Kappa architecture

https://blog.csdn.net/hjw199089/article/details/84713095 Lambda architecture and kappa architecture. From Mastering Azure Analytics by Zoiner Tejada Getting Started with Kudu Lambda Architecture Lambda architecture was originally proposed by the crea

软件架构设计学习总结(22):软件架构——分层架构、事件驱动架构、微内核架构、微服务架构、基于空间的架构

分层架构 (Layered Architecture) 分层架构是最常见的架构,也被称为n层架构.多年以来,许多企业和公司都在他们的项目中使用这种架构,它已经几乎成为事实标准,因此被大多数架构师.开发者和软件设计者所熟知.比如MVC. 分层架构的一个特性就是 关注分离(separation of concerns) .在层中的组件只负责本层的逻辑.组件的划分很容易让它们实现自己的角色和职责,也比较容易地开发,测试管理和维护. 我们需要这样的冗余,即使业务层没有处理业务规则,也要通过业务层来调用数

SOA EDA 事件驱动架构 (Event-Driven Architecture,EDA) 简介

事件驱动架构 (Event-Driven Architecture,EDA) 简介 可以从两个方面来理解 EDA: EDA 是一种侧重于以生成/消费为基础的异步通信的架构模式.这主要对照于传统的基于线程的同步系统. EDA 是一种以事件 (event)为核心,提供事件产生,路由,消费已经结果回调等机制的架构模式. 简单地说, 面向服务架构 (Service-Oriented Architecture, SOA) 是一种 IT 架构策略,其基于面向服务的概念之上.自从 2002 开始为大家熟知以来

什么是架构(Architecture)?

软件系统的架构将系统描述为计算组件及计算组件之间的交互. —— Mary Shaw  软件体系结构:一门初露端倪学科的展望 架构是以组件.组件之间的关系.组件与环境之间的关系为内容的某一系统的基本组织结构,以及指导上述内容设计与演化的原理. —— IEEE的定义 某个软件或计算机系统的软件架构是该系统的一个或多个结构,每个结构均由软件元素.这些元素的外部可见属性.这些元素之间的关系组成. —— 美国 卡内基梅隆大学软件研究所 什么是架构(Architecture)?,布布扣,bubuko.com

[Architecture] 系统架构正交分解法

[Architecture] 系统架构正交分解法 前言 随着企业成长,支持企业业务的软件,也会越来越庞大与复杂.当系统复杂到一定程度,开发人员会发现很多系统架构的设计细节,很难有条理.有组织的用一张大蓝图去做分析设计.先前在InfoQ上看到一篇文章:「亿级用户下的新浪微博平台架构 - 卫向军」,在这篇文章里,使用正交分解法,来分析设计新浪微博平台的系统架构. 透过正交分解法这样表格式的条列与分解,可以让开发人员清楚理解每个象限的关注点,进而去理解与组织整个系统架构所使用到的框架技术.本篇文章介绍

EDA: Event-Driven Architecture事件驱动架构

EDA: Event-Driven Architecture事件驱动架构 2009-09-24 17:28 5 赞  异步编程      软件架构      EDA事件驱动 SOA的核心是:暴露然后处理 expose and handle,SOA使事件Event跨系统流动 EDA是以事件为核心:什么时候触发 然后做什么.EDA是更加松散耦合,有极强的巨大事务处理能力 ESP—Event Stream Processing:监视事件数据流,分析这些事件.CEP—Complex Event Proc

Lambda Architecture: Achieving Velocity and Volume with Big Data

http://www.semantikoz.com/blog/lambda-architecture-velocity-volume-big-data-hadoop-storm/ Big data architecture paradigms are commonly separated into two (supposedly) diametrical models, the more traditional batch and the (near) real-time processing.

面向服务的体系架构(SOA)—架构篇

面向服务的体系架构(SOA)-架构篇 1.面向服务的体系架构(SOA) 面向服务的架构(service-oriented architecture)是Gartner于2O世纪9O年代中期提出的面向服务架构的概念.2002年的l2月,Gartner提出"面向服务的架构(SOA)"是"现代应用开发领域最重要的课题"之后.国内外计算机专家.学者掀起了对SOA的积极研究与探索. 在分布式的环境中,将各种功能都以服务的形式提供给最终用户或者其他服务.如今,企业级应用的开发都采