T
traeai
登录
返回首页
Towards Data Science

Batch or Stream? The Eternal Data Processing Dilemma

8.5Score
Batch or Stream? The Eternal Data Processing Dilemma

TL;DR · AI 摘要

文章探讨了批处理与流处理的选择,强调了数据新鲜度的重要性及成本和复杂性的权衡。

核心要点

  • 数据新鲜度决定了处理方式
  • 流处理通常比批处理更昂贵
  • 流处理比批处理更复杂

结构提纲

按章节快速跳转。

  1. 介绍批处理与流处理的常见辩论。

  2. 强调数据新鲜度对决策的影响。

  3. 比较流处理和批处理的成本差异。

  4. 分析流处理和批处理的复杂性差异。

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • 批处理与流处理

金句 / Highlights

值得收藏与分享的关键句。

  • “Should we process our data in batches or in real-time?” And if you’re anything like me, you’ve noticed that the answer usually starts with: “Well, it depends…”

    第 1 段

    ⬇︎ 下载 PNG𝕏 分享到 X
  • The first question isn’t “batch or stream?” The first question is: “how quickly does someone (or something) need to act on this data for it to matter?”

    第 2 段

    ⬇︎ 下载 PNG𝕏 分享到 X
  • streaming infrastructure is almost always more expensive than batch processing for the same volume of data.

    第 3 段

    ⬇︎ 下载 PNG𝕏 分享到 X
#数据处理#批处理#流处理
打开原文

标题:批量处理还是流处理?永恒的数据处理难题

来源网址:https://towardsdatascience.com/batch-or-stream-the-ethernal-data-processing-dilemma/

发布时间:2026-05-10T15:00:00+00:00

Markdown 内容:

任何时间在数据工程领域,你可能至少遇到过一次这个争论。也许两次。好吧,可能是几十次!😉“我们应该以批处理还是实时处理我们的数据?”如果你像我一样,你可能会注意到答案通常会开始:“嗯,这取决于……”

这是正确的。确实取决于。但是,“这取决于”只有当你真正知道它依赖什么时才有用。这就是我想通过这篇文章填补的空白。不是另一个关于批处理与流处理的理论比较(我希望你已经了解基础知识)。相反,我想给你一个实用的框架来决定哪种方法适合你的特定场景,然后展示这两种路径在微软 Fabric 中实现的样子。

不是批处理还是流处理:而是“答案何时重要?”

让我跳过枯燥的定义,直接进入这两个方法实际区别的地方:数据的新鲜度价值

图2

作者提供的图片

每条数据都有其保质期。不是说它会过期变得无用,而是它的商业价值会随时间变化。在200毫秒内检测到欺诈性信用卡交易?无价之宝——你刚刚防止了一笔损失。同样的欺诈行为在6小时后在一个夜间批处理作业中被发现?对报告有用,但钱已经流失了。

另一方面,昨天的数据生成的月度销售报告与3分钟前的数据相比呢?在大多数组织中,没有人能分辨出区别(可能也没有人关心)。基于该报告所做的业务决策发生在提前几天安排的会议中,而不是在数据到达后的几毫秒内。

所以,第一个问题不是“批处理还是流处理?”第一个问题是:有人(或某物)需要多快采取行动才能使数据变得重要?

如果答案是“几秒或更少”,你就在流处理领域。如果答案是“几小时或几天”,批处理可能是你的朋友。如果答案是“介于两者之间”……恭喜你,你处于最有趣(也是最常见的)灰色地带,我们稍后将深入探讨。

权衡

你知道流处理最令人不安的事实是什么吗?在纸上听起来很棒。谁不想拥有实时数据呢?这就像问“您希望现在喝咖啡还是6小时后再喝?”但现实比这复杂得多。让我们逐步分析在做这个决定时真正重要的权衡。

成本

我知道你在想什么:“尼古拉,流处理贵多少?”不幸的是,我没有一个具体的数字可以告诉你,但模式是一致的:对于相同的数据量,流处理基础设施几乎总是比批处理处理更昂贵。为什么?因为流处理需要资源始终在线,监听、处理和持续写入。而批处理则是在运行时启动、完成工作并关闭。你只在作业运行时支付计算费用。

想象一下餐厅厨房。批处理厨房在特定时间段开放——员工到达、准备、烹饪、清理并回家。流处理厨房则是24/7全天候开放,员工随时待命,一有订单就立即准备。即使在凌晨3点这种安静时段,当没有人订餐时,仍然有人在那里等待。这种等待会消耗成本。

这是否意味着流处理总是更昂贵?不一定。如果你的数据是连续到达的,并且你需要连续处理它,那么成本差异会缩小。但如果数据是以可预测的突发方式到达(例如每日文件传输、每小时API调用),批处理处理允许你将计算支出与这些突发对齐。

复杂性

批处理处理在概念上更简单。你有一个明确的输入、一个明确的转换和一个明确的输出。如果某个步骤失败,你可以重新运行作业。数据不会消失,它只是静静地躺在文件或表中,耐心等待。

流处理?事情变得更加棘手。你处理的是连续到达的数据,可能顺序混乱、可能有重复记录,也可能有缺失记录。传感器离线5分钟后一次性倾倒所有缓冲读数会发生什么?两个事件顺序错误时会发生什么?处理引擎在流处理过程中崩溃时会发生什么?从头开始重播?从检查点重播?如何确保恰好一次处理?

这些都是可解决的问题,现代流处理平台很好地解决了大多数问题。但这确实是批处理处理中不存在的额外问题。复杂性并不是避免流处理的理由,这只是确保你在承诺使用流处理之前真正需要流处理的一个理由。

正确性

批处理处理在正确性方面具有天然优势,因为它操作的是完整的数据集。当你的批处理作业在凌晨2点运行时,它可以访问前一天的所有数据。每个迟到的记录、每个更正、每个更新,都在那里。作业可以针对完整画面计算聚合、连接和转换。

流处理按定义操作的是不完整的数据。你是在数据到达时处理记录,这意味着你的结果总是临时的。你在午夜前11:59计算的日收入数字?到午夜钟声敲响时,一些迟到的交易可能会改变它。窗口策略和水印有助于管理这一点,但它们又增加了一层决策。

再次强调,这并不是避免使用流处理的理由。相反,这是理解流处理结果和批处理结果可能会有所不同,并且你的架构需要考虑到这一点的原因。

时延与吞吐量

批处理优化了吞吐量。这意味着在最短的时间内处理最大数量的数据。流处理则优化了时延,尽量减少事件发生到结果可用之间的时间。

这两个目标经常相互冲突。一个批处理作业在15分钟内处理1亿条记录是非常高效的,大约每秒处理111,000条记录。而一个流处理管道以每次一条的方式处理相同的数据,可能每条记录需要50毫秒,但每条记录的开销显著更高。你是在用吞吐量换取响应速度。

问题在于:你的应用场景是更看重响应速度还是效率?

那么,我应该在什么时候使用什么?

让我们来看一些具体的场景以及每个选择背后的理由。不仅仅是“为X使用流处理”——而是为什么

图3

作者提供的图片

当...时,批处理是最好的选择

  • 你的数据以可预测的时间间隔到达。来自SFTP服务器的日文件传输、每小时的API导出、每周从供应商上传的CSV文件。这些数据不是时间敏感的,并且源本身也不支持连续流。将流处理架构强加于每天只来一次的数据上,就像雇佣一个全天候快递服务来递送一周只来一次的邮件。
  • 你需要对整个数据集进行复杂的转换。想想训练机器学习模型、计算同比比较、在事实表和缓慢变化维度之间运行大规模连接操作。这些操作需要完整的视图,因为它们不能有意义地分解成逐条记录的流处理逻辑。
  • 成本优化是优先考虑的事项。如果你的预算紧张,并且对数据新鲜度的要求不高(小时级,而不是秒级),批处理可以让你按需运行密集计算并在完成后关闭。你只需支付实际使用的费用,而不是可能使用的费用。
  • 数据准确性比速度更重要。财务对账、监管报告、审计跟踪……这些场景中正确性比速度更重要。批处理让你有处理完整数据集的奢侈,并且如果出现问题可以重新运行作业。

当...时,流处理是更好的选择

  • 有人(或某物)需要立即对数据采取行动。欺诈检测、异常监控、物联网警报、运营团队的实时仪表板……数据的价值会随着时间迅速衰减。如果业务对过时数据的反应是“那现在没用了”,那么你需要流处理。
  • 数据是自然连续的。点击流、传感器遥测、应用程序日志和社会媒体推送都是“批处理”不自然的数据源。它们持续产生事件,而以批处理方式处理它们意味着人为地持有已经可用的数据。为什么要等待?
  • 你在构建事件驱动的架构。通过事件总线通信的微服务、订单处理系统、实时个性化引擎——这种架构本质上就是流处理。引入批处理会破坏事件驱动的契约。
  • 你需要检测时间窗口内的模式。“如果CPU使用率超过90%超过连续5分钟,则提醒我。”“标记任何在2分钟窗口内尝试超过10次失败登录的用户。”这些都是自然的流处理问题,需要针对事件滑动窗口不断评估条件。

那灰色地带呢?

很好!现在你知道何时使用什么了。但是,猜猜怎么着?大多数组织不会完全落入一个阵营。你会有需要流处理的用例,而这些用例恰好可以完美地由批处理服务。这没问题,这不是一个非此即彼的组织层面决策。这是一个针对每个用例的决策。

事实上,许多成熟的数据架构同时实现这两种方法。这种模式有时被称为Lambda架构(批处理和流处理并行运行,生成的结果合并)或Kappa架构(一切都是流,批处理只是有限流的一个特例)。这些架构有自己的权衡,但关键点是:你不必为整个数据平台选择一种范式。我可能会在未来的文章中介绍Lambda和Kappa架构模式,但这超出了本文的范围。

图4

作者提供的图片

更实际的问题是:你的平台是否支持两条路径,而不需要你构建和维护两个完全独立的堆栈?这就是微软Fabric变得有趣的地方……

这在微软Fabric中如何体现?

我真正欣赏微软Fabric的一点是,它不会强迫你进入单一的处理范式。批处理和流处理在这平台上都是第一类公民,并且更重要的是,它们共享相同的存储层(OneLake)和相同的消费模型(容量单位)。这意味着你无需维护两个孤立的世界。

让我带你了解一下每种方法在Fabric中的实现方式。

Fabric中的批处理

对于批处理工作负载,Fabric根据你的技能水平和需求提供了多种选项:

  • 数据管道是编排的支柱。如果你之前使用过类似 Azure 数据工厂的东西,这会感觉很熟悉。你可以安排管道在特定时间运行或基于事件触发它们。管道协调源与目标之间的数据流,包括复制数据、数据流和笔记本执行等活动。
  • Fabric 笔记本是处理繁重工作的地方。你可以编写 PySpark、Spark SQL、Python 或 Scala 代码来对大型数据集进行复杂转换。笔记本非常适合我们之前讨论过的“跨越整个数据集的复杂转换”场景,例如大规模连接、聚合和机器学习特征工程。它们会在完成时启动、处理并释放计算资源。
  • Dataflows Gen2 提供了一种低代码/无代码替代方案,使用熟悉的 Power Query 界面。最近的性能改进(如现代评估器和分区计算)使它们从成本/性能角度来看成为更具竞争力的选择。如果你的批处理转换相对简单,Dataflows 可以节省你编写和维护 Spark 代码的开销。
  • Fabric 数据仓库为那些喜欢关系方法的人提供了基于 T-SQL 的体验。你可以运行计划存储过程、创建视图以抽象层,并利用 SQL 分析端点进行临时查询。

所有这些都会将输出作为 OneLake 中的 Delta 表写入,这意味着结果可以立即供下游的任何 Fabric 引擎使用,无论是 Power BI 语义模型、另一个笔记本还是一个 SQL 查询。

Fabric 中的流处理

对于实时工作负载,Fabric 的实时智能是关键所在。如果你想了解 Microsoft Fabric 中实时智能的基础知识,我已在这篇文章中进行了详细介绍。

  • 事件流是流数据的摄取层。你可以连接到诸如 Azure 事件中心、Azure IoT 中心、Kafka、自定义应用程序甚至数据库更改数据捕获 (CDC) 流等源。事件流处理连续的事件流并将它们路由到 Fabric 内的不同目的地。
  • [事件屋](https://data-mozart.com/the-new-house-on-the-block-why-you-need-a-smoke-alarm-not-just-a-newspaper/)(由 KQL 数据库支持)是实时数据的存储和计算引擎。数据进入 KQL 表并立即可使用 Kusto 查询语言进行查询。如果你已经阅读了我对更新策略的文章,你已经知道这些功能在数据摄取时如何强大——无需单独的处理层。
  • 实时仪表板让你能够可视化流数据,并具有自动刷新功能。这样,运营团队就可以实时查看正在发生的事情,而不是昨天发生了什么。
  • 激活器允许你根据实时数据定义条件并触发操作。“如果温度超过 80°C,则发送 Teams 通知。”“如果订单数量低于阈值,则触发警报。”这是我们之前提到的“立即对数据采取行动”的能力。

这里需要记住的关键一点:实时智能数据也存在于 OneLake 中。这意味着你的流数据和批处理数据共存于同一存储层。一个 Spark 笔记本可以从 KQL 数据库读取数据。一个 Power BI 报告可以结合批处理的数据仓库表和实时事件屋数据。批处理和流处理之间的界限开始模糊,而这正是我想强调的重点。

两者兼得的最佳选择

现在,让我们来看一个具体的例子,展示批处理和流处理如何在 Fabric 中协同工作。

想象一家零售公司监控其电子商务平台。在流处理方面,点击流数据通过事件流进入事件屋,在那里更新策略实时解析和路由事件。运营仪表板显示实时指标:活跃用户数、购物车放弃率、错误率。当结账失败率超过 2% 时,激活器会触发警报。

作者图片

在批处理方面,每晚的管道会提取当天的交易数据,使用 Spark 笔记本将其与产品目录信息和客户细分相结合,并将结果写入湖仓。基于这些 Delta 表构建的 Power BI 语义模型驱动着周一上午会议中审查的高管仪表板。

两条路径都从 OneLake 中获取和输出数据。流数据可用于批处理增强。批处理处理的维度可用于实时查找(还记得我们在上一篇文章中提到的更新策略连接吗?)。两种处理范式,一个统一的平台。

实用决策框架

最后,这里有一套简单的问题,你可以针对每个用例问自己。把它当作你的“流处理 vs. 批处理 vs. 两者皆有”的决策树:

作者图片

  1. 有人需要多快采取行动处理这些数据?如果是以秒为单位 -> 使用流处理。如果是以小时或天为单位 -> 使用批处理。如果“这取决于场景” -> 请继续阅读!图片7: 😊
  2. 数据是如何到达的?连续事件 -> 流处理很自然。定期文件传输 -> 批处理很自然。不要违背数据的自然节奏。
  3. 数据转换有多复杂?逐条记录解析和过滤 -> 两种方法都可以。大规模连接、机器学习训练、全数据集聚合 -> 批处理更有优势。
  4. 你的预算容忍度如何?流处理的持续计算 vs. 批处理的按需计算。计算两者成本并进行比较。
  5. 数据完整性有多重要?如果你需要在做决策前获得完整的视图 -> 使用批处理。如果临时结果可以接受 -> 流处理也可以。
  6. 你的平台是否支持两者?如果支持(Fabric 支持)-> 对于每个用例使用合适的工具,而不是强迫所有东西通过一种范式。

最佳的数据架构不是纯粹的批处理或纯粹的流处理。它们是在最合理的地方使用每种方法,并且有一个平台使得这两种路径都感觉自然。

感谢您的阅读!

备注:本文中的可视化内容是使用 Claude 和 NotebookLM 创建的。

AI 可能会生成不准确的信息,请核实重要内容

Batch or Stream? The Eternal Data Processing Dilemma | Towards Data Science | traeai