1. Lambda 架构

1.1. 简介

Lambda 架构是由 Storm 的作者 Nathan Marz 提出的一个实时大数据处理框架。Lambda 架构是其根据多年进行分布式大数据系统的经验总结提炼而成。Lambda 架构的目标是设计出一个能满足实时大数据系统关键特性的架构,包括有:高容错、低延时和可扩展等。Lambda 架构整合离线计算和实时计算,融合不可变性(Immunability),读写分离和复杂性隔离等一系列架构原则,可集成 Hadoop,Kafka,Storm,Spark,Hbase 等各类大数据组件。

数据从底层的数据源开始,经过各种各样的格式进入大数据平台,在大数据平台中经过Kafka、Flume等数据组件进行收集,然后分成两条线进行计算。一条线是进入流式计算平台(例如 Storm、Flink或者Spark Streaming),去计算实时的一些指标;另一条线进入批量数据处理离线计算平台(例如Mapreduce、Hive,Spark SQL),去计算T+1的相关业务指标,这些指标需要隔日才能看见。

1.2. 三层架构

截屏2020-09-15 上午9.36.06

1.2.1. Batch Layer(批处理层)

在全体数据集上在线运行查询函数得到结果的代价太大,同时处理查询时间过长,导致用户体验不好。如果预先在数据集上计算并保存预计算的结果,查询的时候直接返回预计算的结果,而无需重新进行复制耗时的计算。

batchview 是一个批处理过程,如采用 Hadoop 或 spark 支持的 map-reduce 方式。采用这种方式计算得到的每个view 都支持再次计算,且每次计算的结果都相同。

批处理层使用可处理大量数据的分布式处理系统预先计算结果。它通过处理所有的已有历史数据来实现数据的准确性。这意味着它是基于完整的数据集来重新计算的,能够修复任何错误,然后更新现有的数据视图。输出通常存储在只读数据库中,更新则完全取代现有的预先计算好的视图。

Batch Layer 的功能主要有两点:

  1. 存储数据集
  2. 在数据集上预先计算查询函数,构建查询所对应的 View

1.2.2. Speed Layer(速度处理层)

Batch Layer可以很好的处理离线数据,但有很多场景数据不断实时生成,且需要实时查询处理。Speed Layer是用来处理增量的实时数据。

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

  1. SpeedLayer 处理的数据是最近的增量数据流,BatchLayer 处理的是全体数据集
  2. SpeedLayer **为了效率,接收到新数据及时更新 RealtimeView,而 BatchLayer** 根据全体离线数据直接得到BatchView。Speed**Layer **是一种增量计算,而非重新计算(recomputation)。
  3. SpeedLayer因为采用增量计算,所以延迟小,而 BatchLayer 是全数据集的计算,耗时比较长。

速度层通过提供最新数据的实时视图来最小化延迟。速度层所生成的数据视图可能不如批处理层最终生成的视图那样准确或完整,但它们几乎在收到数据后立即可用。而当同样的数据在批处理层处理完成后,在速度层的数据就可以被替代掉了。

1.2.3. Serving Layer

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

  1. 对 batchView **和 RealTimeView **的随机访问
  2. 更新 BatchVeiw **和 RealTimeView**,并负责结合两者的数据,对用户提供统一的接口

1.3. 流程

数据流进入系统后,同时发往 Batch Layer 和 Speed Layer 处理。Batch Layer 以不可变模型离线存储所有数据集,通过在全体数据集上不断重新计算构建查询所对应的 Batch Views。Speed Layer 处理增量的实时数据流,不断更新查询所对应的 Realtime Views。Serving Layer 响应用户的查询请求,合并 Batch View 和 Realtime View 中的结果数据集到最终的数据集。

1.4. 资料

例如广告投放预测这种推荐系统一般都会用到 Lambda 架构。一般能做精准广告投放的公司都会拥有海量用户特征、用户历史浏览记录和网页类型分类这些历史数据的。业界比较流行的做法有在批处理层用 Alternating Least Squares (ALS) 算法,也就是 Collaborative Filtering 协同过滤算法,可以得出与用户特性一致其他用户感兴趣的广告类型,也可以得出和用户感兴趣类型的广告相似的广告,而用 k-means 也可以对客户感兴趣的广告类型进行分类。这里的结果是批处理层的结果。

在速度层中根据用户的实时浏览网页类型在之前分好类的广告中寻找一些top K的广告出来。最终服务层可以结合速度层的top K广告和批处理层中分类好的点击率高的相似广告,做出选择投放给用户。

1.5. 组件选型

Lambda 架构中各组件在大数据生态系统中和阿里集团的常用组件。

数据流存储选用不可变日志的分布式系统 Kafka;BatchLayer 数据集的存储选用 Hadoop 的 HDFS;BatchView 的加工采用 MapReduce,Spark;BatchView 数据的存储采用 MySQL(查询少量的最近结果数据)、Hbase(查询大量的历史结果数据)。SpeedLayer 采用增量数据处理 Flink;RealtimeView 增量结果数据集采用内存数据库 Redis。

截屏2020-09-14 下午4.40.45

2.实时处理系统架构

截屏2020-09-14 下午4.35.49

即从上面的架构中我们可以看出,其由下面的几部分构成:

  1. Flume 集群
  2. Kafka 集群
  3. Flink 集群

2.1.1. Flume 集群

Flume 的基本架构是 Agent。它是一个完整的数据收集工具,含有三个核心组件,分别是 Source、Channel、Sink。数据以Event为基本单位经过Source、Channel、Sink,从外部数据源来,向外部的目的地去。

2.1.2. Kafka 集群

Kafka 是一个分布式的、可分区的、可复制的消息系统,维护消息队列。

Kafka 的整体架构非常简单,是显式分布式架构,Producer、Broker 和 Consumer 都可以有多个。Producer,consumer 实现 Kafka 注册的接口,数据从 Producer 发送到 Broker,Broker 承担一个中间缓存和分发的作用。Broker 分发注册到系统中的 Consumer。Broker 的作用类似于缓存,即活跃的数据和离线处理系统之间的缓存。客户端和服务器端的通信,是基于简单、高性能、且与编程语言无关的TCP协议。

Flink 核心是一个流式的数据流执行引擎,其针对数据流的分布式计算提供了数据分布、数据通信以及容错机制等功能。基于流执行引擎,Flink 提供了诸多更高抽象层的 API 以便用户编写分布式任

3.2. 离线处理系统架构

截屏2020-09-15 下午3.35.45

4.Lambda 架构不足

虽然 Lambda 架构使用起来灵活,并且可以适用于很多的应用场景,但在实际应用的时候,Lambda 架构也存在着一些不足,主要表现在它的维护很复杂。

维护 Lambda 架构的复杂性在于我们要同时维护两套系统架构:批处理层和速度层,在架构中加入批处理层是因为从批处理层得到的结果具有高准确性,而加入速度层是因为它在处理大规模数据时具有低延时性。