“Apache Beam 使 LinkedIn 能够通过利用最新数据并实时处理数据来创建及时的推荐和个性化体验,最终使全球超过 9.5 亿的 LinkedIn 成员受益。”
实时流处理的革命:LinkedIn 每天处理 4 万亿事件
背景
在 LinkedIn,Apache Beam 在流处理基础设施中发挥着至关重要的作用,这些基础设施每天通过多个生产数据中心超过 3000 条管道处理超过 4 万亿事件。这个强大的框架使关键服务和平台能够实现近实时数据处理,涵盖机器学习、通知和反滥用 AI 模型等。拥有超过 9.5 亿会员,确保我们的平台平稳运行对于连接全球会员至关重要。
在本案例研究中,LinkedIn 的工程经理夏冰峰和高级软件工程师刘鑫宇阐述了 Apache Beam 编程模型的统一、可移植和用户友好的数据处理框架如何使多种复杂用例成为可能,以及如何彻底改变 LinkedIn 的流处理。这项技术已将服务成本降低了一倍,它通过 Apache Samza 和 Apache Spark 运行器统一了流式和批处理,实现了实时 ML 特征生成,将新管道从数月的生产时间缩短至数天,允许每秒处理超过 300 万个查询的时间序列事件,等等。对于我们的会员来说,这意味着我们能够提供更准确的职位推荐,改善信息流推荐,并更快地识别虚假资料等。
LinkedIn 开源生态系统和转向 Beam 的历程
LinkedIn 在积极贡献开源社区方面拥有悠久的历史,它通过创建、管理和利用各种开源软件项目来展示其承诺。LinkedIn 工程团队已开源了 75 个以上项目,涵盖多个类别,其中一些项目获得了广泛采用并成为Apache 软件基金会的一部分。
为了实现海量数据的摄取和实时处理,LinkedIn 构建了一个自定义流处理生态系统,主要使用内部开发的工具(随后开源)。2010 年,他们引入了Apache Kafka,这是 LinkedIn 实时基础设施的关键大数据摄取骨干。为了从面向批处理的处理方式转变并以分钟或秒为单位响应 Kafka 事件,他们构建了一个内部分布式事件流框架Apache Samza。这个框架与用于批处理的 Apache Spark 相结合,构成了 LinkedIn 的lambda 架构的基础,用于数据处理作业。随着时间的推移,LinkedIn 的工程团队通过更多专有工具(如Brooklin)扩展了流处理生态系统,方便跨多个存储和消息系统进行数据流式传输,以及Venice,作为摄取批处理和流处理作业输出的存储系统,等等。
虽然以 Apache Samza 为核心的流处理生态系统能够实现大规模有状态数据处理,但 LinkedIn 不断发展的需求需要更高的可扩展性和效率,以及更低的流式管道的延迟。lambda 架构方法导致了操作复杂性和低效率,因为它需要为批处理和流式数据维护两个不同的代码库和两个不同的引擎。为了解决这些挑战,数据工程师寻求更高级别的流式处理抽象,并开箱即用地支持高级聚合和转换。此外,他们需要能够以批处理模式实验流式管道。由于新兴的机器学习用例需要 Python,因此在以 Java 为主的团队中也越来越需要多语言支持。
2016 年发布的Apache Beam 证明了对 LinkedIn 来说是一个游戏规则的改变者。Apache Beam 提供了一个开源的、先进的统一编程模型,用于批处理和流处理,使跨各种应用程序创建大规模通用数据基础设施成为可能。支持 Python、Go 和 Java SDK,以及丰富多样的 API 层,Apache Beam 为构建复杂的跨语言管道并将其在任何引擎上运行提供了理想的解决方案。
当我们开始关注 Apache Beam 时,我们意识到它是一个非常有吸引力的数据处理框架,可以满足 LinkedIn 的需求:它不仅提供高级 API,还支持融合流式和批处理以及多语言支持。我们想要的一切,并且是开箱即用的。
认识到 Apache Beam 的统一数据处理 API、高级功能和多语言支持的优势,LinkedIn 开始将其第一个用例迁移到 Apache Beam,并在 2018 年开发了Apache Samza 的 Beam 运行器。到 2019 年,Apache Beam 管道为多个关键用例提供动力,该编程模型和框架在 LinkedIn 团队中得到了广泛采用。刘鑫宇在2019 年 Beam Summit Europe 上展示了迁移到 Apache Beam 管道的优势。
LinkedIn 中 Apache Beam 的用例
统一的流式和批处理管道
LinkedIn 迁移到 Apache Beam 管道的一些首批用例涉及实时计算和定期回填。一个例子是 LinkedIn 的标准化流程。标准化包括一系列使用复杂 AI 模型将 LinkedIn 用户输入(如职位、技能或教育背景)映射到预定义的内部 ID 的管道。例如,如果一个 LinkedIn 会员在其当前职位中列出“首席数据科学家”,则其职位会被标准化,以便进行相关的职位推荐。
LinkedIn 的标准化流程需要实时处理来反映用户的即时更新,以及定期回填在引入新的 AI 模型时刷新数据。在采用 Apache Beam 之前,将回填作为流式作业运行需要超过 5000 GB 小时的内存和近 4000 小时的总 CPU 时间。这种沉重的负载导致回填时间延长和扩展问题,使回填管道成为与其共同定位的流式管道的“噪音邻居”,无法满足延迟和吞吐量要求。虽然 LinkedIn 工程师考虑将回填逻辑迁移到批处理 Spark 管道,但他们放弃了这个想法,因为维护两个不同的代码库会导致不必要的开销。
我们提出了一个问题:是否可以只维护一个代码库,但能够将其作为批处理作业或流式作业运行?统一的 Apache Beam 模型就是解决方案。
Apache Beam API 使 LinkedIn 工程师能够在统一的 Apache Beam 管道中实现一次业务逻辑,该管道能够有效地处理实时标准化和回填。Apache Beam 提供了PipelineOptions,使各种方面的配置和定制成为可能,例如管道运行器和运行器特定的配置。Apache Beam 转换的可扩展性使 LinkedIn 能够创建自定义复合转换,以抽象化 I/O 差异,并根据数据源类型(有界或无界)动态切换目标处理。此外,Apache Beam 对底层基础设施的抽象以及“一次编写,随处运行”的能力使 LinkedIn 能够无缝地在数据处理引擎之间切换。根据目标处理类型(流式或批处理),统一的 Apache Beam 标准化管道可以通过 Samza 集群作为流式作业部署,也可以通过 Spark 集群作为批处理回填作业部署。
现在,数百个流式 Apache Beam 作业为实时标准化提供动力,全天候监听事件,用来自远程表的额外数据丰富流,执行必要的处理,并将结果写入输出数据库。每周运行一次批处理 Apache Beam 回填作业,以每秒超过 40000 个资料的速度有效地处理 9.5 亿个会员资料。Apache Beam 将数据点推断到复杂的 AI 和机器学习模型中,并连接复杂的 Daten,例如职位类型和工作经历,从而为搜索索引或运行推荐模型标准化用户数据。
将回填逻辑迁移到统一的 Apache Beam 管道并在批处理模式下执行,导致内存和 CPU 使用效率显著提高 50%(从约 5000 GB 小时和约 4000 CPU 小时降至约 2000 GB 小时和约 1700 CPU 小时),处理时间加速了 94%(从 7.5 小时降至 25 分钟)。有关此用例的更多详细信息,请参阅LinkedIn 的工程博客。
反滥用和近实时 AI 模型
LinkedIn 坚定致力于为其会员创造一个值得信赖的环境,这种奉献精神扩展到防范平台上各种类型的滥用。为了实现这一目标,LinkedIn 的反滥用 AI 团队在创建、部署和维护 AI 和深度学习模型方面发挥着至关重要的作用,这些模型可以检测和防止不同形式的滥用,例如虚假账户创建、会员资料抓取、自动垃圾邮件和账户接管。
Apache Beam 加强了 LinkedIn 的内部反滥用平台 Chronos,使近实时地检测和防止滥用成为可能。Chronos 依赖于两个流式 Apache Beam 管道:筛选管道和模型管道。筛选管道从 Kafka 读取用户活动事件,提取相关字段,聚合和筛选事件,然后生成筛选后的 Kafka 消息,以便进行下游 AI 处理。随后,模型管道会消耗这些筛选后的消息,在特定时间窗口内聚合会员活动,触发 AI 评分模型,并将生成的滥用分数写入各种内部应用程序、服务和存储,以便进行离线处理。
Apache Beam 的可插拔架构的灵活性以及各种 I/O 选项的可用性,使反滥用管道与 Kafka 和键值存储无缝集成。LinkedIn 显著减少了标记滥用行为所需的时间,将其从 1 天缩短至 5 分钟,并以每秒超过 300 万个查询的惊人速度处理时间序列事件。Apache Beam 支持近乎实时的处理,极大地增强了 LinkedIn 的反滥用防御能力。近线防御能够在刮取程序开始刮取后几分钟内将其捕获,这导致检测登录的刮取配置文件的效率提高了 6% 以上。
Apache Beam 实现了革命性的、惊人的性能提升——反滥用处理速度从 1 天缩短至 5 分钟。我们看到检测登录的刮取配置文件的效率提高了 6% 以上。
通知平台
作为社交媒体网络,LinkedIn 严重依赖即时通知来推动成员参与。为了实现这一点,Apache Beam 和 Apache Samza 共同为 LinkedIn 的大型通知平台提供支持,该平台生成通知内容,确定目标受众,并确保内容的及时、相关分发。
流式 Apache Beam 管道具有复杂的业务逻辑,并以近乎实时的速度处理海量数据。这些管道从超过 9.5 亿 LinkedIn 成员处消费、聚合、分区和处理事件,并将数据馈送到下游机器学习模型。这些 ML 模型基于接收成员的历史操作,以每秒数百万个候选通知的规模进行分布式目标定位和可扩展评分,并根据接收成员的实时操作对每个通知做出个性化的决策。因此,LinkedIn 成员通过合适的渠道收到及时、相关且可操作的基于活动的通知,例如连接邀请、工作推荐、每日新闻摘要以及其社交网络中的其他活动。
高级 Apache Beam API 提供开箱即用的复杂聚合和过滤功能,其编程模型允许创建可重用组件。这些功能使 LinkedIn 能够加快开发速度并简化通知平台的扩展,因为他们将更多通知用例从 Samza 迁移到 Beam 管道。
LinkedIn 的用户参与度在很大程度上取决于我们发送相关通知的及时性。Apache Beam 为这个关键的业务用例提供了可扩展的、近乎实时的基础设施。
实时 ML 特征生成
LinkedIn 的核心功能(如工作推荐和搜索提要)在很大程度上依赖于消费数千个与公司、职位发布和成员等各种实体相关的特征的 ML 模型。然而,在采用 Apache Beam 之前,最初的离线 ML 特征生成管道在成员操作与其操作对推荐系统的影响之间存在 24 到 48 小时的延迟。这种延迟导致错过机会,因为系统缺乏关于不常使用成员的足够数据,并且未能捕获常使用成员的短期意图和偏好。为了应对对可扩展的、实时的 ML 特征生成平台日益增长的需求,LinkedIn 转向 Apache Beam 来应对这一挑战。
使用托管 Beam 作为基础,LinkedIn 开发了一个用于 ML 特征生成的托管平台。ML 平台为 AI 工程师提供实时特征和高效的管道创作体验,同时抽象化了部署和操作复杂性。AI 工程师创建特征定义并使用托管 Beam 部署它们。当 LinkedIn 成员在平台上采取操作时,流式 Apache Beam 管道会通过实时过滤、处理和聚合发送到 Kafka 的事件来生成更新的机器学习特征,并将它们写入特征存储。此外,LinkedIn 引入了其他 Apache Beam 管道,负责从特征存储检索数据、处理数据并将其馈送到推荐系统。
强大的 Apache Beam 流式处理平台在消除成员操作与数据可用性之间的延迟方面发挥了关键作用,实现了仅几秒的端到端管道延迟。这一重大改进使 LinkedIn 的 ML 模型能够利用最新的信息并向我们的成员提供更个性化和及时的推荐,从而在业务指标方面取得了显著的收益。
托管流处理平台
随着 LinkedIn 的数据基础设施发展到包含超过 3000 个 Apache Beam 管道,以满足各种业务用例的需求,LinkedIn 的 AI 和数据工程团队发现自己不堪重负,需要全天候管理这些流式应用程序。在创建新的管道时,AI 工程师遇到了几个技术挑战,包括将多个流式工具和基础设施集成到其框架中的复杂性,以及在部署、监控和操作方面对底层基础设施的了解有限。这些挑战导致了耗时的管道开发周期,通常持续一到两个月。Apache Beam 使 LinkedIn 能够创建托管 Beam,这是一个托管的流式处理平台,旨在简化和自动化内部流程。该平台使团队更容易、更快地开发和操作复杂的流式应用程序,同时减轻了值班支持的负担。
Apache Beam SDK 使 LinkedIn 工程师能够创建自定义工作流组件作为可重用的子 DAG(有向无环图)并将其公开为标准 PTransforms。这些 PTransforms 充当新的管道的即用型构建块,显著加快了 LinkedIn AI 工程师的创作和测试流程。通过抽象化底层引擎和运行时环境的底层细节,Apache Beam 允许工程师专注于业务逻辑,进一步加快开发时间。
当管道准备部署时,托管 Beam 的中央控制平面发挥作用,提供部署 UI、操作仪表盘、管理工具和自动管道生命周期管理等基本功能。
Apache Beam 的抽象促进了用户代码在构建、部署和运行时与框架演化的隔离。为了确保运行器进程与用户定义函数 (UDF) 的分离,托管 Beam 将管道业务逻辑和框架逻辑打包为两个单独的 JAR 文件:无框架工件和框架工件。在 YARN 集群上执行管道时,这些管道工件在 Samza 容器中作为两个不同的进程运行,通过 gRPC 进行通信。这种设置使 LinkedIn 能够利用自动框架升级、可扩展的 UDF 执行、便于故障排除的日志分离以及多语言 API,从而提高灵活性和效率。
Apache Beam 还支持托管 Beam 的自动调整控制器工具,该工具自动执行硬件资源调整并为流式管道提供自动修复。流式 Apache Beam 管道以 Kafka 主题的形式自我报告诊断信息,例如指标和关键部署日志。此外,LinkedIn 的内部监控工具报告运行时错误,例如心跳故障、内存不足事件和处理延迟。Apache Beam 诊断处理器管道聚合、重新分区和窗口化这些诊断事件,然后将其传递给自动调整控制器并将其写入 Apache Pinot(LinkedIn 用于托管 Beam 的操作和分析仪表盘的 OLAP 存储)。根据预处理的和按时间窗口化的诊断数据,自动调整控制器生成调整操作或重启操作,然后将其转发给托管 Beam 控制平面。托管 Beam 控制平面随后扩展 LinkedIn 的流式应用程序和集群。
Apache Beam 有助于简化操作管理并启用全自动自动扩展,显著减少了引入新应用程序所需的时间。以前,引入需要大量的“试错”手动迭代以及对内部系统和指标的深入了解。
Apache Beam 的可扩展性、可插拔性、可移植性和抽象性构成了 LinkedIn 托管 Beam 平台的支柱。托管 Beam 平台将流式管道从创作、测试和稳定所需的时间从几个月缩短到几天,促进了快速实验,并且几乎完全消除了 AI 工程师的操作成本。
总结
Apache Beam 在革命化和扩展 LinkedIn 的数据基础设施方面发挥了关键作用。Beam 的强大流式功能支持针对关键业务用例的实时处理,每天通过超过 3000 个管道处理超过 4 万亿个事件。
Apache Beam 的多功能性使 LinkedIn 的工程团队能够优化其数据处理,以满足各种业务用例的需求。
- Apache Beam 的统一且可移植的框架使 LinkedIn 能够将流式处理和批处理合并到统一的管道中。这些统一的管道导致服务成本优化 2 倍,处理性能提高 2 倍,以及内存和 CPU 使用效率提高 2 倍。
- LinkedIn 的反滥用平台利用 Apache Beam 近乎实时地处理来自 Kafka 的用户活动事件,在标记滥用行为方面实现了从几天到几分钟的显著加速。近线防御能够在刮取程序开始刮取后几分钟内将其捕获,这导致检测登录的刮取配置文件的效率提高了 6% 以上。
- 通过采用 Apache Beam,LinkedIn 能够从具有 24 到 48 小时延迟的离线 ML 特征生成管道过渡到具有毫秒或秒级端到端管道延迟的实时平台。
- Apache Beam 的抽象和强大的编程模型使 LinkedIn 能够创建一个完全托管的流式处理平台,从而简化了创作、测试和部署,并将新管道的生产时间从几个月缩短到几天。
Apache Beam 拥有无缝的即插即用功能,可以与 Apache Kafka、Apache Pinot 和 LinkedIn 的其他核心技术无缝集成,同时确保规模化的最佳性能。随着 LinkedIn 继续尝试新的引擎和工具,Apache Beam 的可移植性使我们的生态系统免受底层基础设施任何变化的影响。
通过为关键业务用例提供可扩展的、近乎实时的基础设施,Apache Beam 使 LinkedIn 能够利用最新数据并实时处理这些数据,从而创建及时的推荐和个性化体验,最终造福全球超过 9.5 亿 LinkedIn 成员的庞大网络。
这些信息有用吗?