Continuous Processing for Unbounded Datasets
在详细介绍Flink之前,让我们在更高的层次回顾一下当处理数据时可能遇到的 types of datasets 和可以选择的types of execution models。这两种观念经常被合并在一起,其实分开它们很有必要。
First, 2 types of datasets
- 无界数据集:不断追加的无限数据集
- 有界数据集:有限的,不变的数据集
许多传统上认为有界或“批”的数据集实际上是无界的。无论数据存储在HDFS上的目录中还是像Apache Kafka这样的基于日志的系统中,这都是正确的。
无界的数据集示例包括但不限于:
- 终端用户与移动或者web应用的交互数据
- 物理传感器提供的测量数据
- 金融市场的数据
- 机器的日志数据
Second, 2 types of execution models
- 流式计算:只要数据生成,就可以连续的执行
- 批处理:处理操作被执行,并且在有限的时间内完成,当完成时释放计算资源
虽然不一定是最优的,但是可以使用任意一种执行模式来处理这两种类型的数据集。例如,尽管存在窗口,状态管理和无序数据等潜在问题,批处理长期以来一直被应用于无界数据集。
Flink基于直观的处理无界数据集的流式计算模型,流式计算会持续处理不断生成的数据。数据集类型和执行模式类型之间的匹配,不论是在准确性还是性能上都有很大优势。
Features: Why Flink?
Flink是一个开源的分布式流式处理框架:
- 产出精确的结果,即便是在乱序或者数据延迟到达的情况下
- 在运行精确一次的应用下,提供有状态的,容错的并且能够从故障处无缝恢复的能力
- 大规模部署能力,在数千个节点上运行,也具有非常好的吞吐量和延迟特性
前面我们讨论了数据集类型(有界vs无界)和执行模型类型(批处理和流式计算)的匹配问题。Flink的许多特性,如状态管理,处理无序数据,灵活的窗口,对于在无界数据集上计算精确的结果都是至关重要的,并且都是由Flink的流式计算模型锁提供。
-
Flink对于有状态的计算提供了精确一次的语义。“有状态”意味着引用可以维护一段时间内处理的数据的聚合或汇总,并且Flink的checkpoint机制使得在应用遇到故障的情况下,也能保证精确一次的语义。
-
Flink支持基于事件时间的流式计算和窗口。事件时间使得在事件无序到达和事件延迟达到的情况下更容易计算出精确的结果。
-
Flink支持灵活的数据驱动窗口机制,可以基于时间,数量或者session。也可以定制灵活的窗口触发机制来支持复杂的流模式。Flink的窗口机制使得我们可以模拟数据生成的实际环境。
-
Flink的容错能力是轻量级的,并且允许系统保持高吞吐率,同时提供精确一次的一致性保证。Flink可以从失败处零数据丢失的恢复,而且可靠性和延迟之间的权衡可以忽略。
-
Flink具备高吞吐量和低延迟的能力(快速处理大量数据)。下图展示了Apache Flink与Apache Storm在处理分布式的计算任务的性能对比。
-
Flink的savepoint提供带版本号的状态机制,使得更新应用或者重新处理历史数据不会丢失状态,并且有最短的停机时间。
-
Flink被设计成能运行在数千节点的大规模集群上,除了一个独立的集群模式之外,Flink还支持YARN和Mesos。
Flink, the streaming model, and bounded datasets
如果你已经看过Flink的文档,可能已经发现存在处理无界数据集的DataStream API和处理有界数据集的DataSet API。
在文章的前面,我们介绍了对无界数据集的直观适应的流失计算模型(持续的执行处理,一次一个事件)。那么有界数据集如何与流式计算范例相关呢?
在Flink中,这种关系是十分自然的。有界数据集可以简单的看做无界数据集的一个特例,因此可以将前面所述的所有流式概念应用到有界数据上。
Flink的DataSet API实际上也是这样执行的。在Flink内部,有界数据集被当做“有限流”处理。Flink如何管理有界和无界的数据集之间,只有一些细微的差异。
因此,可以使用Flink来处理有界和无界的数据,两种api都在同一个分布式流执行引擎上运行,这是一个简单而强大的架构。
The “What”: Flink from the bottom-up
![](https://img.haomeiwen.com/i8031348/0504e8e707ae2dbb.png)
Deployment modes
Flink可以在云端或在一个独立的集群上运行,或者在一个由YARN或Mesos管理的集群上运行。
Runtime
Flink的核心是分布式流式数据引擎,意味着数据以一次一个事件的形式被处理,这跟批次处理有很大不同。这个保证了上面说的那些Flink弹性和高性能的特性。
APIs
- Flink的DataStream API适用于对数据流进行转换的程序(例如,过滤、更新状态、定义窗口、聚合)。
- DataSet API适用于对数据集进行转换的程序(例如,过滤、映射、连接、分组)。
- Table API是一个相关流和批处理的类SQL表达式语言,它可以很容易的嵌入到DataStream API和Table API中(Java和Scala)。
- Streaming SQL使得可以在流和批处理表上执行SQL查询。语法是基于* Apache Calcite。
Libraries
Flink还包括用于复杂事件处理,机器学习,图形处理和Apache Storm兼容性的专用代码库。
Flink and other frameworks
从最基本的水平上看,一个Flink程序由下面几部分组成:
- 数据源:Flink处理的输入数据
- 转换:Flink修改输入数据时的处理步骤
-
接收器:处理完成后,Flink发送数据的地方
一个发展挺好的生态系统对于进出一个Flink程序的数据作高效移动是非常必要的,Flink支持范围广泛的用于数据源和连接器的第三方系统的连接。如果想学习更多,这里收集了Flink生态系统的信息。
Key Takeaways and Next Steps
总而言之,Apache Flink是一个开源流处理框架,可以消除通常与开源流引擎相关联的“性能与可靠性”折衷,并在两个类别中始终保持一致。 接下来介绍,我们建议您尝试我们的快速入门,下载最新的稳定版本的Flink,或查看文档。
我们鼓励您加入Flink用户邮件列表,并与社区分享您的问题。 我们在这里帮助您充分利用Flink。
![](https://img.haomeiwen.com/i8031348/349d286fcb717b35.png)
网友评论