Lambda架构:如何打破CAP定理?

全文共2087字,预计学习时长6分钟

图源:unsplash

计算机科学领域有一个CAP定理,即分布式数据存储最多只能同时具有以下三个特性中的两个:

· 一致性:每一次读取都将接收到最新写入的数据或错误。

· 可用性:每次请求都会收到(非错误)响应,但不保证包含最新写入的数据。

· 分区容错性:即便网络节点间的信息出现了遗漏(或延迟),系统也可以继续运行。

背景简介

2011年,南森·马茨(Nathan Marz)提出了一种克服CAP定理局限性的重要方法,那就是Lambda架构。

Lambda架构

如何运作?

仔细观察Lambda架构,它一共有三层:批处理层(batch layer)、速度层(speed layer)和服务层(serving layer)。这是对同一数据的实时批量处理。

首先,实时数据流传入后存储在批处理层的主数据集和速度层的缓存中。然后,通过批处理视图,将批处理层中的数据编入索引,以供利用。同时,通过实时视图,公开速度层中的实时数据。最后,可分开或合并查询批处理视图和实时视图,以回答所有过去或实时的问题。

批处理层

该层负责管理主数据集。主数据集中的数据必须包含下列三个属性:

· 数据是原始的

· 数据不可变

· 数据永远真实

真实数据都来自主数据集。即使所有的服务层和速度层数据集都丢失了,也可以从主数据集重新构建应用程序。批处理层还对主数据集进行预计算并将其添加至批处理视图中,从而通过低延时解决查询问题。

批处理视图的预计算

由于主数据集在不断增加,当有新数据可用时,必须有一个管理批处理视图的策略。

· 重计算算法:删去旧的批处理视图,重新计算整个主数据集的函数。

· 增量算法:获得新数据后,直接更新视图。

速度层

速度层对批处理视图进行索引,以便快速进行即席查询。为更新这些视图,速度层对实时视图进行存储并处理传入的数据流。底层存储层必须满足以下条件:

· 随机读取:支持快速随机读取以快速回复查询。

· 随机写入:支持增量算法,可通过低延时修改实时视图。

· 可扩展性:实时视图随存储数据量和应用所需读/写率的变化而变化。

· 容错性:即使机器崩溃,实时视图也能继续正常运行。

服务层

该层可对主数据集执行的计算结果进行低延时访问。此过程可通过对数据进行附加索引来加快读取速度。和速度层类似,服务层必须满足随机读取、批处理写入、可扩展性和容错性这些要求。

Lambda架构几乎具有所有属性

Lambda架构基于以下假设:容错性、即席查询支持性、可扩展性和可延长性。

· 容错性:Lambda架构为大数据系统添加了人类的容错能力,当发生错误时,可修复算法或重新计算视图。

· 即席查询:批处理层允许对所有数据进行即席查询。

· 可扩展性:所有的批处理层、速度层和服务层都是全分布系统,可通过添加新机器轻松实现扩展。

· 可延长性:添加新视图和为主数据集添加新函数一样易如反掌。

常见问题

代码如何在层与层之间实现同步?

一个解决办法是使用公共库或引入某种共享于数据流之间的抽象概念,从而为所有层获取一个通用代码基。例如Summingbird或Lambdoop等框架(Casado介绍)。

能否去掉速度层?

的确,速度层在很多应用中并非必需。如果缩短批处理周期,数据可用性的延迟也能随之减少。另一方面,诸如Impala、Drill或新版Tez的新工具能更快访问存储在Hadoop中的数据,能够在适当的时间内对数据进行操作。

能否放弃批处理层,在速度层进行所有操作?

可以。Kappa Kreps架构就是一个很好的例子,它利用流式传输处理输入的数据,无论需要多少历史记录,它都能从Kafka缓冲区回流,或从历史数据集群追溯到更久之前的记录。

如何实现Lambda架构?

在现实世界中,可以通过使用Hadoop数据湖来实现该架构,其中HDFS用于存储主数据集,Spark(或Storm)作为速度层,HBase(或Cassandra)则作为服务层,Hive用来创建可供查询的视图。

Lambda架构的实现示例

Lambda架构的应用

雅虎(Yahoo)

在分析广告数据仓库时,雅虎采取了类似方法,使用了Apache Storm、Apache Hadoop和Druid。

网飞(Netflix)

Netflix Suro项目是Netflix数据传输管的主要部分,它有独立的数据处理路径,而不必严格遵循Lambda架构,因为这些路径可能用于不同的目的,不一定是为了提供同类型视图。

领英网(LinkedIn)

使用Apache Calcite桥接离线和近线计算。

留言点赞关注

我们一起分享AI学习与发展的干货

如转载,请后台留言,遵守转载规范

打开APP阅读更多精彩内容