深入浅出解析大数据Lambda架构

前言

Hadoop的出现让人们尝到了大数据技术的甜头,它的批处理能力已经被工业界充分认可,但是它的延迟性也一直为大家所诟病。随着各行各业的发展,越来越多的业务要求大数据系统既可以处理历史数据,又可以进行实时计算。比如电商推荐系统,当你在京东浏览商品时,京东会根据你的浏览、加车、收藏、删除等行为,实时为你推荐商品。要实现这个功能,推荐引擎首先需要根据历史数据预先离线计算推荐模型,然后从消息队列中实时拉取用户行为数据,结合两者,实时生成推荐结果。

再举一个智慧交通系统的例子。在智慧交通系统中,需要对未年检、未报废等危险车辆进行实时预警,这就要求该系统预先根据历史数据删选出未年检或未报废的车辆信息库,然后将道路上实时获取到的车辆信息与车辆信息库进行对比,判断有没有违章车辆。

面对这样复杂的业务需求,开发者首先需要一个比较好的架构设计思路,在架构设计完成后再做相应的技术选型。目前业界有几个知名的架构设计来处理此类需求,如Lambda和Summingbird,但是它们在架构的设计上又有比较大的不同。就目前而言,Summingbird和Lambda架构都考虑到了实时计算和批处理相结合的问题,只不过Summingbird主张以统一的方式来执行代码,有关两者的区别,大家可以自行上网了解一下,这里我们只讨论Lambda架构。

背景介绍

Lambda架构是NathanMarz提出的一个实时大数据处理框架。NathanMarz是著名的实时大数据处理框架Storm的作者,Lambda架构就是其根据多年分布式大数据系统的经验总结提炼而成。

NathanMarz在BigData:Principlesandbestpracticesofscalablereal-timedatasystems一书中提到了很多实时大数据系统的关键特性,包括容错性,健壮性,低延迟,可扩展,通用性,方便查询等,Lambda就是其根据这些特性设计的一个实时大数据框架。需要注意的是,Lambda并不是一个具有实体的软件产品,而是一个指导大数据系统搭建的架构模型,因此,用户可以根据自己的需要,在Lambda的三层模型中,任意集成Hadoop,Kafka,Storm,Spark,Hbase等各类大数据组件,或者选用商用软件来构建系统。

原理讲解

大数据系统的特性

在讲大数据系统的特性之前,我们先来分析一下数据系统的本质。

NathanMarz认为,数据系统的本质是“查询+数据”,用公式表达如下:

Query=Function(AllData)

数据系统其实是一个提供了数据存储和数据查询功能的系统。在数据存储过程中,数据可能会发生丢失,在数据查询的过程中,查询也可能出现错误,因此,数据系统必须能够应对这些问题,这就是我们所说的数据系统的容错性和健壮性。除此之外,随着数据的规模越来越大,查询越来越复杂,我们希望数据系统是易于扩展的,并且是可维护的,最好查询仍然是低延迟的,至此,我们就可以来总结一下大数据系统的关键特性了,具体如下:

a.容错性和健壮性:对于分布式系统来说,保证人为操作不出错,程序也不出错是不可能的,因此,大数据系统必须对这样的错误有足够的适应能力。

b.低延迟:很多应用对于读和写操作的延时要求非常高,要求对更新和查询的响应是低延时的。

c.横向扩容:当数据量/负载增大时,系统可以采用scaleout(通过增加机器的个数),而不是scaleup(通过增强机器的性能)来维持性能。

d.可扩展:当系统需要增加一些新功能或者新特性时,所花费的代价比较小。

e.方便查询:数据系统的本质是“查询+数据”,因此,数据系统应具备方便、快速的数据查询功能。

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

Lambda架构的三层模型

前面提到,Query=Function(AllData),那么大数据系统的关键问题就变成了:如何实时地在任意大数据集上进行查询?如果单纯地对全体数据集进行在线查询,那么计算代价会很大,延迟也会很高,比如Hadoop。

Lambda的做法是将大数据系统架构拆分成了三层:BatchLayer,SpeedLayer和ServingLayer。Lambda的分层结构图如图1所示:

图1Lambda分层结构图

a.BatchLayer

既然对全体数据集进行在线查询,计算代价会很高,那么如果对查询事先进行预计算,生成对应的Views,并且对Views建立索引,这样,查询的速度会提高很多,这就是BatchLayer所做的事。

BatchLayer层采用不可变模型对所有数据进行了存储,并且根据不同的业务需求,对数据进行了不同的预查询,生成对应的BatchViews,这些BatchViews提供给上层的ServingLayer进行进一步的查询。另外,每隔一段时间都会进行一次预查询,对BatchViews进行更新,BatchViews更新完成后,会立即更新到ServingLayer中去。

预查询的过程是一个批处理的过程,因此,这一层可以选择诸如Hadoop这样的组件。BatchLayer层的结构图如图2所示:

图2BatchLayer结构图

b.SpeedLayer

如上一节中提到,预查询的过程是一个批处理的过程,该过程花费的时间会比较长,在该过程中,ServingLayer使用的仍然是旧版本的BatchViews,那么仅仅依靠BatchLayer这一层,新进入系统的数据将无法参与最后结果的计算,因此,Marz为Lambda设计了SpeedLayer层来处理增量的实时数据。

SpeedLayer和BatchLayer比较类似,对数据计算生成RealtimeViews,其主要的区别是:

第一,SpeedLayer处理的数据是最近的增量数据流,BatchLayer处理的是全体数据集。

第二,SpeedLayer为了效率,接收到新数据时,就更新RealtimeViews,并且采用的是IncrementalUpdates(增量计算模型),而BatchLayer则是根据全体离线数据集得到BatchViews,采用的是Re







































输卵管炎有哪些症状
老王解惑157期nbsp眼睛里面有



转载请注明:http://www.xcqg58.com/bcxx/bcxx/1617.html