“Lyft 市场团队的目标是通过对现实世界动态做出敏捷反应来提高我们的业务效率。Apache Beam 使我们能够实现拥有一个健壮且可扩展的 ML 基础设施的目标,从而通过实时特征来提高模型准确性。这些实时特征支持诸如预测、黄金时段和调度之类的关键功能。”

Ravi Kiran Magham
Lyft 软件工程师

Lyft 使用 Beam 进行实时机器学习

背景

Lyft, Inc. 是一家美国移动出行服务提供商,提供打车、汽车和电动滑板车租赁、自行车共享、食品配送和商务运输解决方案。Lyft 总部位于加利福尼亚州旧金山, 美国 644 个城市和加拿大 12 个城市运营。

正如您对 Lyft 这样的大公司所期望的那样,在如此大规模的情况下将司机和乘客连接起来需要强大的实时流式基础设施。Lyft 软件工程师 Ravi Kiran Magham 分享了 Apache Beam 如何成为 Lyft 的一项关键任务和不可或缺的实时数据处理技术的故事,它通过支持大规模流式数据处理和机器学习管道来实现这一目标。

民主化流处理

Lyft 最初构建了流式 ETL 管道,以使用 Amazon KinesisApache Flink 将应用程序服务生成的事件转换为、丰富并下沉到其 AWS S3 中的数据湖。Apache Flink 是 Lyft 流式架构的基础,它优于 Apache Spark,因为它为分布式有状态流处理、完全一次处理和各种 I/O 连接器提供了强大、容错和直观的 API。

Lyft 的普及和增长给数据流式基础设施带来了新的需求:拥有不同编程语言偏好的更多团队希望探索事件驱动的流式应用程序,并为实时机器学习模型构建流式特征,以提高业务效率、增强客户体验并提供及时合规操作。数据平台团队研究了如何改进市场团队的黄金时段(动态定价)计算,该团队有一个服务来协调一组 ML 模型,通过 Redis 交换数据。团队的目标是降低代码复杂度并提高延迟(从 5 分钟到不到 1 分钟的端到端延迟)。由于 Python 是市场团队的先决条件,而 Java 被数据平台团队大量使用,因此 Lyft 开始在 2019 年探索 Apache Beam可移植性框架,以使所有团队都能使用流式处理。

Apache Beam 的可移植性和多语言功能是我们以更大规模开始探索 Beam 的关键原因。

Ravi Kiran Magham
Lyft 软件工程师

Apache Beam 为编程语言和数据处理引擎难题提供了解决方案,因为它提供各种 运行器(包括 Beam Flink 运行器 用于 Apache Flink)和 各种编程语言 SDK。Apache Beam 以其“一次编写,随处运行”的概念及其创建 多语言管道 - 数据管道 的能力,提供了最终级别的可移植性,这些管道使用来自多种编程语言的转换。

利用 Apache Beam 对我们来说是一个“双赢”的决定,因为我们的数据基础设施团队使用 Java,但我们可以为我们的产品团队提供 Python SDK,因为它一直是他们更喜欢的默认语言。我们可以轻松自在地编写流式管道,并在 Beam Flink 运行器上运行它们。

Ravi Kiran Magham
Lyft 软件工程师

数据平台团队构建了一个内部服务的控制平面和 FlinkK8sOperator,用于在 Kubernetes 集群上管理 Flink 应用程序并部署流式 Apache Beam 和 Apache Flink 作业。Lyft 在关键管道上使用蓝绿部署策略,以最大程度地减少任何停机时间,并使用自定义宏来改进可观察性和 CI/CD 部署的无缝集成。为了提高开发人员的生产力,数据平台团队提供了一个轻量级的基于 YAML 的 DSL 来抽象源和接收器配置,并为传入事件的过滤和丰富提供了可重用的 Apache Beam PTransforms。

为实时机器学习管道提供动力

Lyft 市场在优化车队供需预测、动态定价、预计到达时间计算等方面发挥着至关重要的作用。Apache Beam Python SDK 和 Flink 运行器使团队能够敏捷地应对变化,并支持对实时 ML 的需求——流式特征生成和模型执行。数据平台团队扩展了流式基础设施,以支持持续学习用例。Apache Beam 为 ML 模型的持续训练提供支持,使用实时数据跨越更大的时间窗口(2 小时)来识别和微调成本和预计到达时间的偏差。

Apache Beam 特征生成和 ML 模型执行 Apache Beam 特征生成和 ML 模型执行

Lyft 将特征生成和 ML 模型执行分离成多个流式管道。流式 Apache Beam 管道实时生成特征并将它们写入 Kafka 主题,供模型执行管道使用。根据用户配置,特征会被复制并按模型 ID 键入到 有状态 ParDo 转换中,这些转换利用 计时器 和/或数据(特征)可用性来调用 ML 模型。特征存储在全局窗口中,并且 状态 会被明确清理。ML 模型作为模型服务基础设施的一部分运行,其输出可以作为另一个 ML 模型的输入特征。为了支持此 DAG 工作流,Apache Beam 管道将输出写入 Kafka 并将其提供给模型执行流式管道进行处理,此外还将其写入 Redis。

复杂的实时特征生成涉及每分钟处理约 400 万个 1KB 事件,延迟低于一秒,在空间和时间粒度(1 分钟和 5 分钟)上生成约 100 个跨越多个事件属性的特征。Apache Beam 使 Lyft 市场团队能够将延迟降低 60%,显著简化代码,并将许多团队和用例引入流式处理。

市场团队是 Apache Beam 的重度用户,用于实时特征计算和模型执行。使用低于一秒的延迟实时处理事件使我们的 ML 模型能够尽早了解市场动态并做出明智的决策。

Ravi Kiran Magham
Lyft 软件工程师

扩大用例

Lyft 已将 Apache Beam 用于 60 多个用例,并使他们能够完成关键的业务承诺并改善实时用户体验。

例如,Lyft 的地图数据交付团队从批处理过程迁移到流式管道,以便实时识别道路封闭。他们的路线引擎使用此信息来确定最佳路线,改进预计到达时间并提供更好的司机和客户体验。该作业每秒处理约 400k 个事件,融合来自第三方道路封闭和实时交通数据的流式数据流,以确定实际封闭情况并将它们作为事件发布到 Kafka。自定义 S3 PTransform 允许作业定期发布封闭的快照,以供下游批处理处理。

Apache Beam 使 Lyft 能够优化与报告机场接送相关的非常具体的用例。机场要求移动应用程序报告每次接送,并将它们与车队进出时间相匹配。未能做到这一点会导致合规性评分降低,甚至会面临处罚的风险。最初,Lyft 使用 KCL 库 来实现复杂的操作,以使用事件并将它们存储在 Redis 中。Python 工作进程定期运行以使用来自 Redis 的数据,使用服务 API 调用来连接和丰富数据,并将输出发送到机场应用程序。使用这种实现,延迟更新和乱序事件会极大地影响完整性评分。Lyft 将用例迁移到一个流式 Apache Beam 管道,该管道使用状态和计时器来将事件保存在全局窗口中并管理会话。Apache Beam 帮助 Lyft 通过将事件报告的延迟从 5 秒提高到 2 秒并将丢失的进出数据减少到 1.3% 来实现最佳合规性评分。

与许多颠覆标准商业模式的公司一样,Lyft 依赖于开源软件,并希望回馈社区。Lyft 开发的许多大数据框架、工具和实现都在他们的 GitHub 上开源。自 2018 年以来,Lyft 一直是 Apache Beam 的大量贡献者,Lyft 工程师在各种活动中展示了他们的 Apache Beam 集成,例如 Beam Summit 北美柏林 BuzzwordsO'Reilly Strata 数据与人工智能 等等。

结果

Apache Beam 模型的可移植性是分布式执行的关键。它使 Lyft 能够在基于 JVM 的运行器上运行用非 JVM 语言编写的关键任务数据管道。因此,他们避免了代码重写,并避开了许多 API 样式和运行时环境的潜在成本,从而将管道开发时间从几天减少到几小时。用户代码的完全隔离和本机 CPython 执行(没有库限制)导致轻松的接入和采用。Apache Beam 的多语言和跨语言功能解决了 Lyft 的编程语言难题。使用统一的编程模型,Lyft 不再绑定到特定的技术堆栈。

Apache Beam 使 Lyft 能够从批处理 ML 模型训练切换到实时 ML 训练,并使用窗口对数据新鲜度进行细粒度控制。他们的数据工程和产品团队可以使用 Python 和 Java,具体取决于特定任务的适用性或他们的偏好。Apache Beam 已帮助 Lyft 成功构建和扩展了 60 多个流式管道,以非常低的延迟近乎实时地处理事件。新的用例不断涌现,Lyft 计划利用 Beam SQLGo SDK 为他们的团队提供全面的 Apache Beam 多语言功能。

这些信息有用吗?