在实践中(不是理论上),小批量与实时流之间有什么区别?
What is the difference between mini-batch vs real time streaming in practice (not theory)?
在实践中(不是理论上),小批量与实时流有什么区别?从理论上讲,我理解小批量是在给定时间范围内进行批处理的东西,而实时流更像是在数据到达时做某事,但我最大的问题是为什么不使用 epsilon 时间范围(比如一毫秒)的小批量或者我想了解为什么一个解决方案比其他解决方案更有效?
我最近遇到一个示例,其中小批量 (Apache Spark) 用于欺诈检测,实时流 (Apache Flink) 用于欺诈预防。有人还评论说小批量不是防止欺诈的有效解决方案(因为目标是防止交易在发生时发生)现在我想知道为什么这对小批量(Spark)不是那么有效? 为什么 运行 延迟为 1 毫秒的小批处理无效? 批处理是一种无处不在的技术,包括 OS 和内核 TCP/IP磁盘或网络上的数据确实被缓冲的堆栈,那么在这里说一个比另一个更有效的令人信服的因素是什么?
这是我经常思考的问题,因为技术人员和非技术人员的答案总是难以表述。
这部分我会尽量回答:
Why is it not effective to run mini-batch with 1 millisecond latency?
我认为问题不在于模型本身,而在于 Spark 如何实现它。经验证据表明,将 mini-batch window 减少太多会导致性能下降。事实上,有人建议至少 0.5 秒或更长时间来防止这种退化。在大卷上,即使这个 window 大小也太小了。我从来没有机会在生产中测试它,但我从来没有强烈的实时要求。
我比 Spark 更了解 Flink,所以我不太了解它的内部结构,但我相信如果您的批处理至少需要几秒钟才能处理,那么在设计批处理过程中引入的开销是无关紧要的但如果它们引入固定延迟并且您不能低于该延迟,则会变得很重。要了解这些开销的性质,我认为您必须深入研究 Spark 文档、代码和未解决的问题。
业界现在承认需要不同的模型,这就是为什么许多 "streaming-first" 引擎现在正在增长,其中 Flink 是领跑者。我不认为这只是流行语和炒作,因为这种技术的用例,至少目前,是极其有限的。基本上,如果您需要对大而复杂的数据实时做出自动化决策,则需要一个实时快速数据引擎。在任何其他情况下,包括近实时、实时流式传输都是一种矫枉过正的做法,小批量就可以了。
免责声明:我是 Apache Flink 的提交者和 PMC 成员。熟悉Spark Streaming的整体设计,但不了解其内部细节。
Spark Streaming实现的mini-batch流处理模型工作原理如下:
- 流的记录收集在缓冲区中(小批量)。
- 定期使用常规 Spark 作业处理收集的记录。这意味着,对于每个小批量,都会安排并执行一个完整的分布式批处理作业。
- 作业 运行 秒时,将收集下一批的记录。
那么,为什么每 1 毫秒 运行 一个 mini-batch 无效?仅仅是因为这意味着每毫秒安排一个分布式批处理作业。尽管 Spark 在调度作业方面非常快,但这有点太多了。它还会显着降低可能的吞吐量。如果批处理变得太小,操作系统或 TCP 中使用的批处理技术也无法正常工作。
我知道一个答案被接受了,但我认为必须再说一个才能完整地回答这个问题。我认为像 "Flink's real time is faster/better for streaming" 这样的答案是错误的,因为它在很大程度上取决于你想做什么。
Spark mini-batch 模型有一个缺点——正如在之前的回答中所写的那样——缺点是每个 mini-batch 都必须创建新的作业。
但是,Spark Structured Streaming 默认处理时间触发器设置为 0,这意味着尽可能快地读取新数据。
这意味着:
- 一个查询开始
- 数据到达,但第一个查询没有结束
- 第一个查询结束,因此数据将被立即处理。
在这种情况下延迟非常小。
相对于 Flink 的一大优势是 Spark 统一 APIs 用于批处理和流处理,因为这种 mini-batch 模型。您可以轻松地将批处理作业转换为流处理作业,将流处理数据与批处理中的旧数据结合起来。用 Flink 做这件事是不可能的。 Flink 也不允许您对收到的数据进行交互式查询。
如前所述,微批处理和实时流的用例不同:
- 对于非常非常小的延迟,Flink 或一些计算网格(如 Apache Ignite)会很好。它们适用于延迟非常低的处理,但不适用于非常复杂的计算。
- 对于中等和较大的延迟,Spark 将具有更统一的 API,这将允许以与完成批处理作业相同的方式进行更复杂的计算,正因为这种统一
有关结构化流的更多详细信息,请查看this blog post
在实践中(不是理论上),小批量与实时流有什么区别?从理论上讲,我理解小批量是在给定时间范围内进行批处理的东西,而实时流更像是在数据到达时做某事,但我最大的问题是为什么不使用 epsilon 时间范围(比如一毫秒)的小批量或者我想了解为什么一个解决方案比其他解决方案更有效?
我最近遇到一个示例,其中小批量 (Apache Spark) 用于欺诈检测,实时流 (Apache Flink) 用于欺诈预防。有人还评论说小批量不是防止欺诈的有效解决方案(因为目标是防止交易在发生时发生)现在我想知道为什么这对小批量(Spark)不是那么有效? 为什么 运行 延迟为 1 毫秒的小批处理无效? 批处理是一种无处不在的技术,包括 OS 和内核 TCP/IP磁盘或网络上的数据确实被缓冲的堆栈,那么在这里说一个比另一个更有效的令人信服的因素是什么?
这是我经常思考的问题,因为技术人员和非技术人员的答案总是难以表述。
这部分我会尽量回答:
Why is it not effective to run mini-batch with 1 millisecond latency?
我认为问题不在于模型本身,而在于 Spark 如何实现它。经验证据表明,将 mini-batch window 减少太多会导致性能下降。事实上,有人建议至少 0.5 秒或更长时间来防止这种退化。在大卷上,即使这个 window 大小也太小了。我从来没有机会在生产中测试它,但我从来没有强烈的实时要求。
我比 Spark 更了解 Flink,所以我不太了解它的内部结构,但我相信如果您的批处理至少需要几秒钟才能处理,那么在设计批处理过程中引入的开销是无关紧要的但如果它们引入固定延迟并且您不能低于该延迟,则会变得很重。要了解这些开销的性质,我认为您必须深入研究 Spark 文档、代码和未解决的问题。
业界现在承认需要不同的模型,这就是为什么许多 "streaming-first" 引擎现在正在增长,其中 Flink 是领跑者。我不认为这只是流行语和炒作,因为这种技术的用例,至少目前,是极其有限的。基本上,如果您需要对大而复杂的数据实时做出自动化决策,则需要一个实时快速数据引擎。在任何其他情况下,包括近实时、实时流式传输都是一种矫枉过正的做法,小批量就可以了。
免责声明:我是 Apache Flink 的提交者和 PMC 成员。熟悉Spark Streaming的整体设计,但不了解其内部细节。
Spark Streaming实现的mini-batch流处理模型工作原理如下:
- 流的记录收集在缓冲区中(小批量)。
- 定期使用常规 Spark 作业处理收集的记录。这意味着,对于每个小批量,都会安排并执行一个完整的分布式批处理作业。
- 作业 运行 秒时,将收集下一批的记录。
那么,为什么每 1 毫秒 运行 一个 mini-batch 无效?仅仅是因为这意味着每毫秒安排一个分布式批处理作业。尽管 Spark 在调度作业方面非常快,但这有点太多了。它还会显着降低可能的吞吐量。如果批处理变得太小,操作系统或 TCP 中使用的批处理技术也无法正常工作。
我知道一个答案被接受了,但我认为必须再说一个才能完整地回答这个问题。我认为像 "Flink's real time is faster/better for streaming" 这样的答案是错误的,因为它在很大程度上取决于你想做什么。
Spark mini-batch 模型有一个缺点——正如在之前的回答中所写的那样——缺点是每个 mini-batch 都必须创建新的作业。
但是,Spark Structured Streaming 默认处理时间触发器设置为 0,这意味着尽可能快地读取新数据。 这意味着:
- 一个查询开始
- 数据到达,但第一个查询没有结束
- 第一个查询结束,因此数据将被立即处理。
在这种情况下延迟非常小。
相对于 Flink 的一大优势是 Spark 统一 APIs 用于批处理和流处理,因为这种 mini-batch 模型。您可以轻松地将批处理作业转换为流处理作业,将流处理数据与批处理中的旧数据结合起来。用 Flink 做这件事是不可能的。 Flink 也不允许您对收到的数据进行交互式查询。
如前所述,微批处理和实时流的用例不同:
- 对于非常非常小的延迟,Flink 或一些计算网格(如 Apache Ignite)会很好。它们适用于延迟非常低的处理,但不适用于非常复杂的计算。
- 对于中等和较大的延迟,Spark 将具有更统一的 API,这将允许以与完成批处理作业相同的方式进行更复杂的计算,正因为这种统一
有关结构化流的更多详细信息,请查看this blog post