Last updated on June 27, 2020
本文介绍流处理的概念,流处理引擎环境和Apache Spark Streaming概述。
流处理
批数据处理是指通过固定的输入数据集运行计算逻辑,并在结束时产生结果。这意味着处理将在到达数据集末尾时停止。
相比之下,流处理是关于通过无界数据集运行计算逻辑,因此处理是连续且长时间运行的。
虽然批处理数据与流数据的区别主要在于有限性,但由于流数据的无界数据性质、实时数据的传入顺序、
数据到达的不同速率以及面对机器故障时对正确性和低延迟的期望,流数据处理要比批数据处理复杂得多,也更具挑战性。
流处理的挑战
流数据处理有它自己的一组独特的挑战,这些挑战是处理连续和无界数据的结果。
在开始构建长时间运行的流数据处理应用程序或评估特定的流处理引擎时,务必牢记这些挑战。挑战如下:
- 以可靠的方式为数据流应用维护潜在的大状态。
-
高效、快速地为应用程序提供要处理的消息。
-
处理无序到达的流数据。
-
与批量数据连接以丰富传入的流数据。
-
端到端、只需一次即可保证即使在出现故障的情况下也能交付数据。
-
处理不均匀的数据到达率
流处理的概念
-
数据传递语义。
-
时间观念。
-
窗口
数据传递语义
当一条数据进入流处理引擎时,它有责任将其传送到流应用程序进行处理。即使在故障情况下,流处理引擎也可以提供三种类型的保证。
– 至多一次:这意味着流处理引擎保证一段数据不会超过一次传送到应用程序,但可以是零次。
– 至少一次:这意味着流处理引擎保证将一条数据传送到应用程序一次或多次。在这种情况下不会丢失数据;但是,存在重复或三重计数的可能性。
– 只有一次:这意味着流处理引擎保证一段数据只会被传递给应用程序一次,而不会更多也不会更少。在这种情况下,不会丢失数据,也不会重复计数。大多数现代和流行的流处理引擎都提供了这种保证。在这三个保证中,这一个是构建关键业务流应用程序最理想的保证。
大多数现代流处理引擎使用检查点和预写日志技术的组合来提供恰好一次的保证。
时间观念
在流数据处理领域,时间的概念很重要,因为它使您能够了解时间方面正在发生的事情。例如,在实时异常检测应用程序的情况下,时间的概念可以让您深入了解在过去五分钟或一天中的特定时间内发生的可疑交易的数量。
有两种重要的时间类型:事件时间和处理时间。
要真正了解传入数据流背后的情况,必须能够根据事件时间处理传入数据,因为事件时间表示数据创建的时间点。
在理想状态下,数据将在创建后不久到达并进行处理,因此事件时间和处理时间之间的差距很小。实际上,情况往往并非如此,因此延迟随时间而变化,具体取决于阻止数据在创建后立即到达的条件。延迟越大,就越需要能够使用事件时间而不使用处理时间来处理数据。
为了处理无限传入数据流,流数据处理领域中的一种常见实践是通过使用开始时间和结束时间作为边界将传入数据划分为块。很明显,使用事件时间作为时间边界更有意义。
窗口
考虑到流数据的无界性质,拥有传入流数据的全局视图是不可行的。因此,要从传入数据中提取任何有意义的值,需要对其进行分块处理。
这里的块就是窗口。
窗口是一种常见的流数据处理模式,其中基于时间边界将无限传入数据流划分为块,这些块可以是事件时间或处理时间。
其中基于事件时间划分窗口更常用。
三种不同的窗口类型:
– 固定窗口。
固定窗口将传入的数据流划分为固定大小的段。这种情况下每一个数据只会划分到一个窗口中。
- 滑动窗口。
滑动窗口包含窗口长度和滑动间隔。如果滑动间隔的大小与窗口长度相同,则它与固定/翻滚窗口的大小相同。
这种情况下一个数据可能会被划分到多个窗口中。 -
会话窗口
会话窗口类型通常用于分析网站上的用户行为。与固定/翻滚和滑动窗口不同,它没有预定的窗口长度。相反,它通常是由大于某个阈值的不活动间隔决定的。例如,Facebook上会话窗口的长度由用户进行的活动(如浏览用户提要、发送消息等)的持续时间决定。
流处理引擎环境
-
Apache Storm
Apache Storm是流数据处理领域的先驱之一,它的流行主要与Twitter所做的大规模流处理有关。
Apache Storm的首次发布是在2011年,并在2014年成为Apache的顶级项目。2015年,推特放弃了Apache Storm,转而使用下一代的Apach Heron。
Heron的资源效率比Apache Storm高得多,吞吐量也比Apache Storm好得多。 -
Apache Samza
Apache Samza是LinkedIn创建的,目的是帮助解决其流媒体处理需求,并于2013年开源。
它被设计成与Kafka紧密合作,并在Hadoop YARN上运行,以实现进程隔离、安全性和容错。
Apache Samza设计用于处理流,流由有序的、分区的、可重放的和容错的不可变消息集组成。 -
Apache Flink
它在2015年成为Apache的顶级项目,从那时起,它作为一个高吞吐量和低延迟的流媒体引擎一直在稳步受到欢迎。
Apache Flink与Apache Storm和Apache Samza之间的一个关键区别是,Apache Flink在同一引擎中同时支持批处理和流处理。 -
Apache Kafka Streams
Apache Kafka已经从分布式发布-订阅消息传递系统演变为分布式流媒体平台。它是由LinkedIn创建的,并于2012年成为Apache的顶级项目。
与其他流媒体处理引擎不同的是,Kafka的流媒体处理能力被打包成轻量级的库,这使得编写实时流媒体应用变得很容易。 -
Apache Apex
Apache Apex在这个领域是一个相对较新的参与者。它是由一家名为DataTorrent的公司开发的,该公司决定在2016年将其开源。
Apache Apex被认为是一个统一了流和批处理的Hadoop YARN原生平台。 -
Apache Beam
Apache Beam是谷歌在2016年推出的一个相当有趣的项目。
该项目背后的主要思想是为流和批处理提供一个功能强大且易于使用的模型,
该模型可以跨各种运行时平台移植,例如Apache Flink、Apache Spark和Google Cloud DataFlow。
换句话说,可以将Apache Beam视为大数据的超API。
流处理中的两种标准数据模型
之前的流处理引擎(Apache Beam除外)都订阅了其中的一种。
– Record at a time
它在输入数据到达时立即处理每一段输入数据。因此,此模型可提供尽可能最低的延迟。
- Micro Batch
微批处理模型根据可配置的批处理间隔等待并累积一小批输入数据,然后并行处理每批数据。很明显,微批处理模型不能提供与其他模型相同的延迟级别.
很明显,微批处理模型不能提供与其他模型相同的延迟级别。然而,就吞吐量而言,微批处理的速率要高得多,
因为一批数据是以优化的方式处理的,因此与其他模型相比,每条数据的成本较低。
一个有趣的侧面说明是,在时间记录模型之上构建微批处理模型相当容易。
在列出的所有流处理引擎中,只有Apache Spark使用微批处理模型。
Apache Spark Streaming
Apache Spark统一数据处理平台受欢迎的原因之一是能够执行流数据处理和批处理数据。
目前为止Spark Streaming 有两代流处理引擎:第一代DStream 和第二代 Structed Streaming。
- DStream
DStream 又叫 discretized stream。 它的工作方式是使用微批处理模型将传入的数据流划分为批,然后由Spark批处理引擎进行处理。
当RDD是主要的编程抽象模型时,这很有意义。每个批次都由一个RDD在内部表示。批次中的数据段数由传入数据速率和批次间隔决定。
可以从来自Kafka、AWS Kinesis、文件或套接字等源的输入数据流创建DStream。创建DStream时需要的关键信息之一是批处理间隔,它可以以秒或毫秒为单位。
使用DStream,您可以在传入数据流上应用高级数据处理函数,如map、filter、Reduce或ReduceByKey。此外,还可以通过提供窗口长度和滑动间隔来执行窗口操作,例如在固定/翻滚或滑动窗口上减少和计数。
一个重要的注意事项是窗口长度和滑动间隔必须是批处理间隔的倍数。例如,如果批处理间隔是3秒,并且使用固定/翻滚间隔,则窗口长度和滑动间隔可以是6秒。
DStream支持在跨批数据执行计算时维护任意状态,但这是一个手动过程,并且有点麻烦。
使用DStream可以做的一件很酷的事情就是将它与另一个DStream或表示静态数据的RDD连接起来。在完成所有处理逻辑之后,您可以使用DStream将数据写出到外部系统,如数据库、文件系统或HDFS。
- Structed Streaming
Structed Streaming是Spark的第二代流媒体引擎。它被设计成更快、更具伸缩性和更强的容错性,并解决了第一代流引擎中的缺点。
它是为开发人员设计的,用于使用简单的编程模型构建端到端流应用程序,该应用程序可以实时响应数据,该模型建立在Spark SQL引擎的优化和坚实基础之上。
Structed Streaming的一个独特之处在于,它为工程师提供了一种构建流应用程序的独特而简单的方法。
Structed Streaming引擎旨在帮助应对这些挑战:
– 处理端到端可靠性并保证正确性。
– 对各种传入数据执行复杂的转换。
– 基于事件时间处理数据,轻松处理无序数据。
– 与各种数据源和数据接收器集成。
更多关于Spark Structed Streaming的内容,放在下一篇文章中单独说明。
Be First to Comment