Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从Lambda到无Lambda,领英吸取到的教训

从Lambda到无Lambda,领英吸取到的教训

作者头像
深度学习与Python
发布于 2021-01-22 07:28:51
发布于 2021-01-22 07:28:51
6040
举报

作者 | Xiang Zhang、Jingyu Zhu

译者 | 王者

策划 | Tina

Lambda 架构已经成为一种流行的架构风格,它通过使用批处理和流式处理的混合方法来保证数据处理的速度和准确性。但它也有一些缺点,比如额外的复杂性和开发 / 运维开销。LinkedIn 高级会员有一个功能,就是可以查看谁浏览过你的个人资料 (Who Viewed Your Profile,WVYP),这个功能曾在一段时间内采用了 Lambda 架构。支持这一功能的后端系统在过去的几年中经历了几次架构迭代:从 Kafka 客户端处理单个 Kafka 主题开始,最终演变为具有更复杂处理逻辑的 Lambda 架构。然而,为了追求更快的产品迭代和更低的运维开销,我们最近把它变成无 Lambda 的。在这篇文章中,我们将分享一些在采用 Lambda 架构时的经验教训、过渡到无 Lambda 时所做的决定,以及经历这个过渡所必需的转换工作。

这个系统是如何运作的

WVYP 系统依靠一些不同的输入源向会员提供最近浏览过其个人资料的记录:

  • 捕获浏览信息并进行除重;
  • 计算浏览源 (例如,通过搜索、资料页面浏览等);
  • 浏览相关性 (例如,一位高级人员查看了你的资料);
  • 根据会员的隐私设置查看模糊信息。

下图显示了使用 Lambda 架构的系统简化图。

首先,我们有一个 Kafka 客户端,可以近实时地处理并提供会员资料视图活动。当一个会员查看另一个会员的个人资料时,会生成一个叫作 ProfileVieweEvent 的事件,并发送到 Kafka 主题。处理作业将消费这个 ProfileVieweEvent 并调用大约 10 个其他在线服务来获取额外的信息,如会员概要数据、工作申请信息、会员网络距离 (一度、二度连接) 等。然后,该作业将处理后的消息写入另一个 Kafka 主题,这个主题的消息将被 Pinot(一个分布式 OLAP 数据存储,https://pinot.apache.org) 消费。Pinot 将处理后的消息追加到实时中。Pinot 可以处理离线和实时数据,所以非常适合被用在这个地方。

与此同时,还有一组离线的 Hadoop MapReduce 作业在不同的技术栈中执行上述操作,使用的是 ETL 过的 ProfileViewEvent 和上述服务处理过的相应数据集。这些作业每天加载这些数据集,并执行数据转换操作,如过滤、分组和连接。此外,如上图所示,离线作业还将处理实时作业不处理的 NavigationEvent,这个事件可以告诉我们浏览者是如何找到被浏览资料的。处理后的数据集被插入到 Pinot 的离线表中。

Pinot 数据库负责处理来自实时表和离线表的数据。中间层服务通过查询 Pinot 获取处理过的会员资料信息,并根据前端 API 的查询参数 (如时间范围、职业等) 对数据进行切片和切块。

这就实现了 Lambda 架构:

  • 实时作业侧重速度,进行不完整信息的快速计算;
  • Hadoop 离线作业侧重批处理,旨在提高准确性和吞吐量;
  • Pinot 数据存储是服务层,将批处理和实时处理的视图合并起来。

Lambda 架构为我们带来了很多优势,这要得益于实时处理的快速和批处理的准确性及可再处理性。然而,这也伴随着大量的运维开销。随着我们不断迭代产品并增加更多的复杂性,是时候做出改变了。

我们的挑战

众所周知,Lambda 架构带来了饱受诟病的运维开销,违反了“不要重复你自己”(DRY) 原则。更具体地说,WVYP 系统面临以下几个挑战:

  1. 开发人员必须构建、部署和维护两个管道,这两个管道产生数据大部分是相同的;
  2. 这两个处理管道需要在业务逻辑方面保持同步。

上述的两个挑战占用了开发人员大量的时间。

导致系统的演化有很多不同的原因,包括特性增强、bug 修复、合规性或安全性的变更、数据迁移等。WYVP 的所有这些变更都需要付出双倍的成本,部分原因是因为 Lambda 架构。更糟糕的是,Lambda 架构还带来了额外的问题,因为我们是基于两个不同的技术栈实现大部分的特性,所以新的 bug 可能会在批处理或实时处理中出现。此外,随着 LinkedIn 工具和技术栈的不断演化,我们需要不断地跟进,以便能够保持在最新状态。例如,在最近的一次 GEO 位置数据迁移过程中,我们发现了一些不必要的复杂性。Lambda 架构的分层带来了运维上的负担。例如,实时作业在处理消息是会出现延迟,离线作业有时会失败——这两种情况我们都太熟悉了。最终我们发现,这种开销是不值得的,因为它显著降低了开发速度。因此,我们开始努力重新改造 WVYP 的 Lambda 架构。

无 Lambda 架构

我们开始简化架构,移除全部离线批处理作业,并使用 Samza 开发新的实时消息处理器。我们之所以选择移除离线作业并保留实时处理,主要原因是产品需要近实时的会员资料浏览通知。批处理更适合用在其他一些场景中,例如在 A/B 测试中计算业务指标影响。

新架构如下图所示。

新架构的两个主要变化:

  • 创建了一个新的 Samza 作业,用来消费 ProfileVieweEvent 和 NavigationEvent,旧的消费者客户端只消费 ProfileVieweEvent。
  • 所有的离线作业都被移除,并创建了一个单独的作业,我们稍后将讨论这个作业。

Samza 作业

Samza 最初由 LinkedIn 开发,是 LinkedIn 的分布式流式处理服务,现在是 Apache 的一个项目。我们选择将现有的实时处理器作业迁移到 Samza 有很多原因。

首先,Samza 支持各种编程模型,包括 Beam 编程模型。Samza 实现了 Beam API(https://beam.apache.org):我们可以用它轻松地创建数据处理单元管道,包括过滤、转换、连接等。例如,在我们的例子中,我们可以很容易地加入 PageVieweEvent 和 NavigationEvent,近乎实时地计算出视图的来源——这在旧处理器中是不容易做到的。其次,在 LinkedIn 部署和维护 Samza 作业非常简单,因为它们运行在由 Samza 团队维护的 YARN 集群上。开发团队仍然需要处理伸缩、性能等问题,但在定期维护方面确实有很大帮助 (例如,不需要担心机器发生故障)。最后,Samza 与 LinkedIn 的其他工具和环境进行了很好的集成。

新的离线作业

有些人可能会问,为什么我们仍然在无 Lambda 架构使用离线作业。事实上,从架构转换的角度来看,这并不是必要的。但是,如上图所示,离线作业会读取 HDFS 里经过 ETL 的数据,这些数据是由 Samza 作业通过 Kafka 主题间接产生的。离线作业的唯一目的是将所有写入 Pinot 实时表的数据复制到离线表。这样做有两个原因:1) 由于数据的组织方式,离线表有更好的性能 (离线表的数据段比实时表要少得多,查询速度更快)。2) 处理过的视图数据将保留 90 天,而实时表只保留几天的数据,并通过自动数据清除功能进行清除。新离线作业与旧离线作业的一个关键区别是,新作业在处理逻辑上与实时作业没有重叠,它没有实现 Samza 作业中已经实现的逻辑。当 Pinot 能够自动支持从实时表到离线表的文件整合时,我们就可以移除这个作业。

消息再处理

天底下没有无 bug 的软件,一切事物仍然会以不同的方式出错。对于 WVYP,使用错误的逻辑处理过的事件会一直保留在数据库中,直到被重新处理和修复。此外,一些意想不到的问题会在系统可控范围之外发生 (例如,数据源被破坏)。批处理的一个重要作用是进行再处理。如果作业失败,它可以重新运行,并生成相同的数据。如果源数据被损坏,它可以重新处理数据。

在进行流式处理时,这个会更具挑战性,特别是当处理过程依赖其他有状态的在线服务提供额外的数据时。消息处理变成非幂等的。WVYP 在状态方面依赖在线服务,在消息被处理时需要向会员发送通知 (但我们不想发送重复的通知)。如果所选择的数据存储不支持随机更新,比如 Pinot,那么我们就需要一个重复数据删除机制。

我们意识到,要解决这个问题,并没有什么灵丹妙药。我们决定以不同的方式对待每个问题,并使用不同的策略来缓解问题:

  • 如果我们要对处理过的消息做一些微小的改动,最好的方法是写一个一次性离线作业,读取 HDFS 中已处理的消息 (就像新架构中的离线作业那样),进行必要的处理,再推送到 Pinot,覆盖掉之前的数据文件。
  • 如果出现重大的处理错误,或者 Samza 作业处理大量事件失败,我们可以将当前的处理偏移量倒回到前一个位置。
  • 如果作业只在某段时间内降级,例如视图相关性的计算失败,我们将跳过某些视图。对于这种情况,系统将在这段时间内降低容量。

去重

重复处理发生在各种场景中。一个是上面提到的,我们显式地想要重新处理数据。另一个是 Samza 固有的,为了确保消息的至少一次处理。当 Samza 容器重新启动时,它可能会再次处理一些消息,因为它读取的检查点可能不是它处理的最后一条消息。我们可以在两个地方解决去重问题:

  • 服务层:当中间层服务从 Pinot 表中读取数据时,它会进行去重,并选择具有最新处理时间的视图。
  • 通知层:通知基础设施确保我们不会在指定的时间段内向会员发送重复的通知。

价 值

Lambda 架构已经存在了很多年,并得到了相当多的赞扬和批评。在迁移 WVYP 的过程中,我们获得了以下这些好处:

  • 通过将大部分的开发时间减半,开发速度得到了显著的提升,维护开销也减少了一半以上 (实时流程的维护开销比批处理流程少)。
  • 提升了会员的用户体验。现在在开发过程中引入错误的可能性降低了。我们也有了更好的实时计算 (例如,视图源的快速计算,这在以前是不可用的),可以更快地为会员提供 WVYP 信息。

通过释放开发人员的时间,我们现在能够进行更快的迭代,并将精力放到其他地方。在这篇文章中,我们分享了 WVYP 系统的开发、运行和重新改造过程,希望我们的一些收获能够帮助那些在使用 Lambda 架构时面临类似问题的人做出更好的决策。

原文链接:

https://engineering.linkedin.com/blog/2020/lambda-to-lambda-less-architecture

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 InfoQ 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
BDCC - Lambda VS Kappa
Lambda架构使用了批处理和流处理两种不同的处理方式来处理数据。数据首先通过流处理层进行实时处理,然后再通过批处理层进行离线处理,最后将两种处理结果合并起来得到最终的结果。Lambda架构的优点是可以同时处理实时和历史数据,并且可以保证数据的一致性,但是需要维护两套不同的代码和基础设施。
小小工匠
2023/05/09
3310
BDCC - Lambda VS Kappa
Lambda架构的质疑
Nathan Marz 写了一篇非常受欢迎的博客文章,描述了 Lambda 架构(如何打破CAP定理)。Lambda 架构是一种在 MapReduce 和 Storm 或类似系统之上构建流处理应用程序的方法。
smartsi
2020/01/05
2.1K0
LinkedIn 互联网架构扩展简史
LinkedIn成立于 2003 年,其目标是连接到您的网络以获得更好的工作机会。第一周只有 2,700 名会员。时间快进了很多年,LinkedIn 的产品组合、会员基础和服务器负载都取得了巨大的增长。
用户5166556
2024/04/10
920
LinkedIn 互联网架构扩展简史
LinkedIn 使用 Apache Beam 统一流和批处理
翻译自 LinkedIn Unifies Stream and Batch Processing with Apache Beam 。
云云众生s
2024/03/27
1530
LinkedIn 使用 Apache Beam 统一流和批处理
质疑Lambda架构
Google和Twitter刚发布它们综合实时流处理和批处理的Lambda架构,LinkedIn的Jay Kreps则对这种架构提出了质疑,指出实时处理和批处理其实是两种范式,将它们硬生生捆绑在一起会犯ORM框架一样的错误,并且提出一种类似EventSourcing或CQRS架构思路只要使用一个实时流处理框架解决两种框架捆绑在一起的问题。 以下为大意翻译,原文见这里Storm 作者Nathan Marz 发表了Lambda Architecture (见:How to beat the CAP theore
Albert陈凯
2018/04/04
1.7K0
数据仓库建设之数仓架构
大家好,不管是离线数仓与实时数仓,建设的时候都少不了架构设计,今天来学习一下常见的架构及发展演变过程。
chimchim
2022/11/13
1.7K0
数据仓库建设之数仓架构
流批一体技术框架探索及在袋鼠云数栈中的实践
流批一体是一种架构思想,这种思想说的是同一个业务,使用同一个sql逻辑,在既可以满足流处理计算同时也可以满足批处理任务的计算。
袋鼠云数栈
2022/01/26
5.6K0
猿创征文|OLAP之apache pinot初体验
最近在熟悉公司内部的埋点采集,发现数据架构最后是存放到apache pinot库的,因为之前从来没见过,所以有了本文的学习文档。
chimchim
2022/11/13
9960
猿创征文|OLAP之apache pinot初体验
Lambda离线实时分治架构深度解析与实战
在大数据技术日新月异的今天,Lambda架构作为一种经典的数据处理模型,在应对大规模数据应用方面展现出了强大的能力。它整合了离线批处理和实时流处理,为需要同时处理批量和实时数据的应用场景提供了成熟的解决方案。本文将对Lambda架构的演变、核心组件、工作原理及痛点进行深度解析,并通过Java代码实现一个实战实例。
小马哥学JAVA
2025/01/09
1570
Apache下流处理项目巡览
我们的产品需要对来自不同数据源的大数据进行采集,从数据源的多样化以及处理数据的低延迟与可伸缩角度考虑,需要选择适合项目的大数据流处理平台。 我最初列出的候选平台包括Flume、Flink、Kafka Streaming以及Spark Streaming。然而对产品架构而言,这个技术选型的决策可谓举足轻重,倘若选择不当,可能会导致较大的修改成本,须得慎之又慎。 我除了在项目中曾经使用过Flume、Kafka以及Spark Streaming之外,对其余平台并不甚了解。即便是用过的这几个平台,也了解得比较
张逸
2018/03/07
2.4K0
Apache下流处理项目巡览
Apache Beam 大数据处理一站式分析
大数据处理其实经常被很多人低估,缺乏正确的处理体系,其实,如果没有高质量的数据处理流程,人工智能将只有人工而没有智能。现在的趋势是数据体量不断上涨,团队却低估了规模所带来的复杂度。大数据领域泰斗级人物Jesse Anderson曾做过研究,一个组织架构比较合理的人工智能团队,数据处理工程师需要占团队总人数的4/5,然而很多团队还没有认识到这点。大数据处理涉及大量复杂因素,而Apache Beam恰恰可以降低数据处理的难度,它是一个概念产品,所有使用者都可以根据它的概念继续拓展。
王知无-import_bigdata
2020/05/12
1.6K0
那些年我们用过的流计算框架
数据时代,从数据中获取业务需要的信息才能创造价值,这类工作就需要计算框架来完成。传统的数据处理流程中,总是先收集数据,然后将数据放到DB中。当人们需要的时候通过DB对数据做query,得到答案或进行相关的处理。这样看起来虽然非常合理,但是结果却非常紧凑,尤其是在一些实时搜索应用环境中的某些具体问题,类似于MapReduce方式的离线处理并不能很好地解决。 基于此,一种新的数据计算结构---流计算方式出现了,它可以很好地对大规模流动数据在不断变化的运动过程中实时地进行分析,捕捉到可能有用的信息,并把结果发送
CSDN技术头条
2018/02/08
4.2K0
那些年我们用过的流计算框架
实时数据计算框架演进介绍
数仓建设是公司数据发展到一定规模后必然会提供的一种基础服务,其中数仓建设也是“数据智能”中必不可少的一环。本文将从数据仓库的简介、经历了怎样的发展、如何建设、架构演变、应用案例以及实时数仓与离线数仓的对比六个方面全面分享关于数仓的详细内容。
数字悠客
2020/08/04
2K0
数据仓库介绍与实时数仓案例
数据仓库是一个面向主题的(Subject Oriented)、集成的(Integrate)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策。
王知无-import_bigdata
2019/07/23
2.9K0
数据仓库介绍与实时数仓案例
Stream 主流流处理框架比较(2)
在上篇文章中,我们过了下基本的理论,也介绍了主流的流处理框架:Storm,Trident,Spark Streaming,Samza和Flink。今天咱们来点有深度的主题,比如,容错,状态管理或者性能。除此之外,我们也将讨论开发分布式流处理应用的指南,并给出推荐的流处理框架。
smartsi
2019/08/07
1.6K0
LinkedIn前数据专家解读日志与实时流处理
编者注:本内容来自Jay Kreps所著的《我喜爱日志:事件数据、流计算处理和数据集成》一书的第三章。Jay Kreps是Confluent的联合创始人和CEO。在此之前,Jay是领英的主要架构师之一,专注于数据基础架构和数据驱动的产品。他是多个可扩展的数据系统空间的开源项目的作者之一,包括Voldemort、Azkaban、Kafka和Samza。 以下是原文: 到目前为止,我还仅仅只是描述了一些把数据从一个地方拷贝到其他地方的多种的方法。然而,在存储系统间挪动字节并不是故事的结尾。实际上我们发现,“日
大数据文摘
2018/05/24
7310
数据系统架构——Lambda architecture(Lambda架构)
“我们正在从IT时代走向DT时代(数据时代)。IT和DT之间,不仅仅是技术的变革,更是思想意识的变革,IT主要是为自我服务,用来更好地自我控制和管理,DT则是激活生产力,让别人活得比你好”——阿里巴巴董事局主席马云。
全栈程序员站长
2022/09/12
3.6K0
数据系统架构——Lambda architecture(Lambda架构)
大数据架构设计(四十五)
Lambda架构设计目的在于提供一个满足大数据系统关键特性的架构。整合离线计算和实时计算,融合不可变性、读写分离和复杂性隔离等原则。
用户9919783
2023/10/08
3910
大数据架构设计(四十五)
漫谈未来数仓架构如何设计
大家好,我是峰哥,夏天已经来了,小麦马上要丰收了,今天分享一篇关于未来数仓架构发展方向的文章。
数据社
2022/05/26
4640
漫谈未来数仓架构如何设计
数据仓库之Hive快速入门 - 离线&实时数仓架构
了解了Hive中的SQL基本操作之后,我们来看看Hive是如何将SQL转换为MapReduce任务的,整个转换过程分为六个阶段:
端碗吹水
2020/11/11
4.8K0
相关推荐
BDCC - Lambda VS Kappa
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档