《大数据系统构建:可扩展实时数据系统构建原理与最佳实践》一1.7 Lambda架构

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介:

本节书摘来自华章出版社《大数据系统构建:可扩展实时数据系统构建原理与最佳实践》一书中的第1章,第1.7节,南森·马茨(Nathan Marz) [美] 詹姆斯·沃伦(JamesWarren) 著 马延辉 向 磊 魏东琦 译,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.7 Lambda架构

实时计算任意数据集上的任意函数,是一个令人望而却步的问题。没有单独的工具可以提供完整的解决方案,相反,你必须使用各种工具和技术构建一个完整的大数据系统。
Lambda架构的主要思想是将大数据系统建立为一系列的层,如图1-6所示。每一层满足属性的一个子集,且通过该层的下一层所提供的功能来构建。虽然你通过整本书来学习如何设计、实现和部署每一层,但整个系统是如何有机结合在一起的高层思想是很容易理解的。
一切从query = function(all data)等式开始。理想情况下,你可以不断运行这个函数来获取结果。不幸的是,即使这是可能的,也需要占用大量的资源,并且相当昂贵。想象一下,每次你想要响应某人当前位置的查询时,都必须要读取1PB的数据集。
最显而易见的替代方法是预先计算查询函数。我们将预先计算的查询函数称为批处理视图(Batch View)。这不是动态计算查询,而是从预先计算好的视图中读取结果。预先计算的视图是有索引的,因此可以用随机读取的方式进行访问。该系统看起来像是这样的:

在该系统中,你在所有数据上运行一个函数来获取批处理视图。然后,当你想知道一个查询的值时,只需针对批处理视图运行一个函数即可。批处理视图可以使你很快地从中获得所需要的值,而无须扫描所有数据。
这个讨论有点抽象,下面举例说明。假设你正在构建一个网络分析的应用程序(再次构建),并且想要查询任一范围天数内某个URL的页面浏览量。如果你在所有数据上运行该查询函数,最好扫描数据集中相应时间范围内那个URL的页面浏览量,并返回结果的计数。
批处理视图方法替代在所有页面浏览上运行一个函数的方式,来预先计算[url,day]键的索引,以获得某天某个URL页面浏览的计数。然后为了解决该查询,从视图中检索相应时间范围内的所有天的值,并将所有计数相加,以得到最终的结果。这种方法如图1-7所示。


372c0f0a3694018c51a98703da4640fd6a799a98


应该明确的是,到目前为止所描述的这种方法似乎缺了点什么。创建批处理视图显然会是一个高延迟操作,因为它是在你的所有数据上运行一个函数。在批处理视图结束时,很多新的数据将被收集但是没有展示在批处理视图中,并且这个查询将过期许多小时。但是我们暂时忽略这个问题,因为它是可以解决的。假设过期几个小时的查询是可以的,那么我们继续探索通过在完整数据集上运行函数来预先计算批处理视图的这个想法。
1.7.1 批处理层
Lambda架构中实现batch view = function(alldata)等式的这部分被称为批处理层。批处理层存储数据集的主副本,并在主数据集上预先计算批处理视图(见图1-8)。


2477043b210d04389f8143a413ffbd0c82635337



主数据集可以被视作一个非常大的记录列表。
批处理层需要能够做两件事:存储不可变的、不断增长的主数据集;在该数据集上运行任意函数。最好使用批处理系统完成这种类型的处理。Hadoop是批处理系统的一个典型例子,我们将在本书中使用Hadoop来阐述批处理层的概念。
批处理层最简单的形式可以用如下的伪代码表示:

批处理层在while(true)中循环运行,不断从头开始重新计算批处理视图。实际上,批处理层的功能并不仅限于此,相关内容会在本书后续章节予以介绍。这里只探讨批处理层的最好方式。
批处理层的优点是,使用起来很简单。批处理计算可以编写成例如单线程的程序,并且你可以毫不费力地获取并行性。很容易在批处理层编写鲁棒性好的、高度可扩展的计算。批处理层可通过添加新机器进行扩展。
下面是批处理层计算的一个例子。不要担心对代码的理解问题—重点是展示一个天生具备并行性的程序是什么样子的:

这段代码把给定的原始页面浏览的数据集作为输入,为每个URL计算页面浏览量。这段代码的有趣之处在于—调度工作的所有并行性挑战和结果的合并都已经为你做好了。由于算法是用这种方式写的,因此它可以任意地分布在MapReduce集群中,扩展到可用的不管多少数量的节点上。在计算结束时,输出目录将包含一些结果文件。本书第7章将介绍如何编写这样的程序。

1.7.2 服务层

批处理层的功能是生成批处理视图。下一步是在某个地方加载视图,以便它们可以被查询到—这个地方就是服务层。服务层(Serving Layer)是一个专用的分布式数据库,用于加载批处理视图,并可以对它进行随机读取(见图1-9)。当新的批处理视图可用时,服务层会自动替换那些视图,这样更多的最新结果就是可用的了。


f1b8d5f8bc9e396f626ab9035ca61de9165d5bae


服务层数据库支持批处理更新和随机读取。最值得注意的是,它不需要支持随机写操作—这是非常重要的一点,因为随机写会在数据库中导致绝大多数的复杂性—因为不支持随机写,所以这些数据库非常简单。简单性使得它们是可预测的、鲁棒性好的,易于配置,且操作简单。ElephantDB是你将在本书中学习使用的服务层数据库,它只有几千行代码。

1.7.3 批处理层和服务层满足几乎所有属性

批处理层和服务层支持对任意数据集上的任意查询,当然是以查询将过期几个小时为代价的。一个新的数据片段从批处理层传播到可以被查询到的服务层,需要花费几个小时。需要注意的是,除了低延迟更新,批处理层和服务层满足了大数据系统所需的每个属性(参见1.5节)。让我们依次检查一遍:
鲁棒性和容错性—当机器发生故障时,Hadoop处理故障转移。服务层在内部使用副本机制,确保服务器宕机时的可用性。批处理层和服务层也是可以容忍人为错误的,因为一旦出错,你可以修复算法或删除坏数据,并从头开始重新计算视图。
可扩展性—批处理层和服务层均易于扩展。它们都是完全的分布式系统,扩展它们就像添加新机器一样容易。
通用性—这里描述的架构非常通用。你可以计算和更新任意数据集的任意视图。
延展性—添加一个新的视图就像对主数据集添加一个新函数一样容易。由于主数据集可以包含任意数据,因此新类型的数据可以很容易地被添加进来。如果想微调一个视图,你不必担心支持应用程序中多个版本的视图。你可以简单地从头开始重新计算整个视图。
即席查询—批处理层支持即席查询。在某个位置,所有数据都是方便可用的。
最少维护—维护这个系统的主要组件是Hadoop。Hadoop需要一些管理知识,但操作起来相当简单。正如前面所解释的那样,服务层数据库是很简单的,因为它们不进行随机写操作。因为服务层数据库有很少的活动部件,出错的可能性不大。因此,服务层数据库不太可能出错,从而更容易维护。
可调试性—在批处理层运行时,你永远都有计算的输入和输出。在传统数据库中,一个输出可以替换原来的输入—比如递增一个值时。在批处理层和服务层,输入是主数据集,输出是视图。同样,所有中间步骤都有输入和输出。当出错时,输入和输出可以给出调试所需要的所有信息。
批处理层和服务层之美在于它们用一个简单且易于理解的方法满足了几乎所有你想要的属性—没有并发问题要处理,扩展非常简单。唯一没有满足的属性是低延迟更新。在最后一层,速度层,会解决这个问题。

1.7.4 速度层

一旦批处理层完成预先计算批处理视图,服务层即进行更新。这意味着唯一没有在批处理视图中展示的数据是运行预先计算期间新来的数据。为了实现一个完全的实时数据系统,剩下的任务要完成—也就是说,为了实时在任意数据上执行任意函数计算—弥补最后几个小时的那些数据。这是速度层的目的。顾名思义,它的目标是确保新的数据按照应用程序的需求尽快展示在查询函数中(见图1-10)。


b67602ca607d0e559fcc922fa9d18b534726884a


你可以认为速度层是类似于批处理层的,它基于接收到的数据生成视图。两者之间一个很大的区别是,速度层只查看最近的数据,而批处理层要立即查看所有数据。另一个很大的区别是,为达到最小延迟的可能,速度层不会立即查看所有新数据。相反,每当接收到新的数据,它就更新实时视图,而不是像批处理层从头开始重新计算视图。速度层做增量计算,而不是像批处理层那样进行重新计算。
我们可以将速度层上的数据流格式化成以下等式:
realtime view = function ( realtime view, new data)
实时视图基于新数据和现有的实时视图进行更新。
Lambda架构总体被总结为以下三个等式:

batch view = function (all data)
realtime view = function (realtime view, new data)
query = function (batch view. realtime view)
AI 代码解读

这些想法的图解如图1-11所示。也就是说,不是只需要对批处理视图运行一个函数就可以得到查询,而是需要通过查看批处理视图和实时视图并将结果合并在一起,才能得到查询。
速度层使用支持随机读取和随机写入的数据库。因为这些数据库支持随机写,所以它们比在服务层使用的数据库要高出几个数量级的复杂性,无论是实现方面还是操作方面。
Lambda架构之美在于,一旦数据通过批处理层到服务层,实时视图中相应的结果就不再需要了。这意味着你可以丢弃不再需要的实时视图。这是一个很好的结果,因为速度层远比批处理层和服务层更复杂。Lambda架构的这个属性被称为复杂性隔离,这意味着复杂性被推入一个只存储暂时结果的层中。如果有什么差错,你可以丢弃整个速度层的状态,并且在几小时内使一切恢复正常。
下面继续构建网络分析应用程序的例子—它支持一些天当中页面浏览量的查询。请回顾一下批处理层从[url,day]到页面浏览量所生成的批处理视图。
速度层保存自己独立的[url,day]到页面浏览量的视图。而批处理层通过逐次计算页面浏览,重新计算批处理视图。每当接收到新数据,速度层就通过增加在视图中的计数值来更新自己的视图。为解决一个查询过程,你需要查询所需的批处理视图和实时视图,来满足指定的日期范围,并将结果相加以得到最终计数。还有一项需要去做的工作,就是恰当地同步结果(相应内容将在本书后续的章节中介绍)。


f1e105f6cb7f8fec4a43cb38774a34aea8008851



一些算法很难增量地计算。批处理/速度层的分离,为你在批处理层上使用精确算法和速度层上使用近似算法提供了足够的灵活性。批处理层多次重写速度层,所以近似值得到修正,并且系统也显示了最终准确性的属性。例如计算独立计数,如果独立值的集合很大,这可能是很有挑战性的。很容易在批处理层完成独立值计数,因为你能立即看到所有数据,但在速度层你可以将HyperLogLog集合作为一个近似值使用。
最终,性能和鲁棒性兼得。因为批处理层纠正在速度层中的计算,所以在批处理层做准确计算且在速度层做近似计算的系统,呈现了最终的准确性。你得到的仍然是低延迟更新,但由于速度层是暂时的,实现该属性的复杂性并不会影响结果的鲁棒性。当涉及性能折中方案时,速度层的暂时特性给你提供了极大的灵活性。当然,因为用增量方式完成的计算是准确的,所以该系统是完全准确的。
相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
相关文章
RocketMQ原理—5.高可用+高并发+高性能架构
本文主要从高可用架构、高并发架构、高性能架构三个方面来介绍RocketMQ的原理。
109 21
RocketMQ原理—5.高可用+高并发+高性能架构
基于LlamaIndex实现CodeAct Agent:代码执行工作流的技术架构与原理
CodeAct是一种先进的AI辅助系统范式,深度融合自然语言处理与代码执行能力。通过自定义代码执行代理,开发者可精准控制代码生成、执行及管理流程。本文基于LlamaIndex框架构建CodeAct Agent,解析其技术架构,包括代码执行环境、工作流定义系统、提示工程机制和状态管理系统。同时探讨安全性考量及应用场景,如软件开发、数据科学和教育领域。未来发展方向涵盖更精细的代码生成、多语言支持及更强的安全隔离机制,推动AI辅助编程边界拓展。
32 3
基于LlamaIndex实现CodeAct Agent:代码执行工作流的技术架构与原理
MySQL进阶突击系列(03) MySQL架构原理solo九魂17环连问 | 给大厂面试官的一封信
本文介绍了MySQL架构原理、存储引擎和索引的相关知识点,涵盖查询和更新SQL的执行过程、MySQL各组件的作用、存储引擎的类型及特性、索引的建立和使用原则,以及二叉树、平衡二叉树和B树的区别。通过这些内容,帮助读者深入了解MySQL的工作机制,提高数据库管理和优化能力。
《docker基础篇:2.Docker安装》包括前提说明、Docker的基本组成、Docker平台架构图解(架构版)、安装步骤、阿里云镜像加速、永远的HelloWorld、底层原理
《docker基础篇:2.Docker安装》包括前提说明、Docker的基本组成、Docker平台架构图解(架构版)、安装步骤、阿里云镜像加速、永远的HelloWorld、底层原理
584 90
深入解析Tiktokenizer:大语言模型中核心分词技术的原理与架构
Tiktokenizer 是一款现代分词工具,旨在高效、智能地将文本转换为机器可处理的离散单元(token)。它不仅超越了传统的空格分割和正则表达式匹配方法,还结合了上下文感知能力,适应复杂语言结构。Tiktokenizer 的核心特性包括自适应 token 分割、高效编码能力和出色的可扩展性,使其适用于从聊天机器人到大规模文本分析等多种应用场景。通过模块化设计,Tiktokenizer 确保了代码的可重用性和维护性,并在分词精度、处理效率和灵活性方面表现出色。此外,它支持多语言处理、表情符号识别和领域特定文本处理,能够应对各种复杂的文本输入需求。
109 6
深入解析Tiktokenizer:大语言模型中核心分词技术的原理与架构
用PyTorch从零构建 DeepSeek R1:模型架构和分步训练详解
本文详细介绍了DeepSeek R1模型的构建过程,涵盖从基础模型选型到多阶段训练流程,再到关键技术如强化学习、拒绝采样和知识蒸馏的应用。
321 3
用PyTorch从零构建 DeepSeek R1:模型架构和分步训练详解
|
4月前
|
使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
本文详细介绍了PaliGemma2模型的微调流程及其在目标检测任务中的应用。PaliGemma2通过整合SigLIP-So400m视觉编码器与Gemma 2系列语言模型,实现了多模态数据的高效处理。文章涵盖了开发环境构建、数据集预处理、模型初始化与配置、数据加载系统实现、模型微调、推理与评估系统以及性能分析与优化策略等内容。特别强调了计算资源优化、训练过程监控和自动化优化流程的重要性,为机器学习工程师和研究人员提供了系统化的技术方案。
281 77
使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
Python 高级编程与实战:构建微服务架构
本文深入探讨了 Python 中的微服务架构,介绍了 Flask、FastAPI 和 Nameko 三个常用框架,并通过实战项目帮助读者掌握这些技术。每个框架都提供了构建微服务的示例代码,包括简单的 API 接口实现。通过学习本文,读者将能够使用 Python 构建高效、独立的微服务。
MySQL原理简介—2.InnoDB架构原理和执行流程
本文介绍了MySQL中更新语句的执行流程及其背后的机制,主要包括: 1. **更新语句的执行流程**:从SQL解析到执行器调用InnoDB存储引擎接口。 2. **Buffer Pool缓冲池**:缓存磁盘数据,减少磁盘I/O。 3. **Undo日志**:记录更新前的数据,支持事务回滚。 4. **Redo日志**:确保事务持久性,防止宕机导致的数据丢失。 5. **Binlog日志**:记录逻辑操作,用于数据恢复和主从复制。 6. **事务提交机制**:包括redo日志和binlog日志的刷盘策略,确保数据一致性。 7. **后台IO线程**:将内存中的脏数据异步刷入磁盘。
143 12
ClickHouse 架构原理及核心特性详解
ClickHouse 是由 Yandex 开发的开源列式数据库,专为 OLAP 场景设计,支持高效的大数据分析。其核心特性包括列式存储、字段压缩、丰富的数据类型、向量化执行和分布式查询。ClickHouse 通过多种表引擎(如 MergeTree、ReplacingMergeTree、SummingMergeTree)优化了数据写入和查询性能,适用于电商数据分析、日志分析等场景。然而,它在事务处理、单条数据更新删除及内存占用方面存在不足。
860 21

热门文章

最新文章