Apache Flink 是一个分布式处理引擎及框架,用以对无限数据和有限数据流做有状态计算。Flink 被设计成在所有常见的集群环境中运行,以内存速度和任何规模执行计算。
在这里,我们会解释Flink 架构的几个重要方面。
处理有限/无限数据
任何类型的数据,都被当成事件流处理。信用卡交易、传感器数据、机器日志、用户与网站的交互数据以及手机应用,所有这些数据都被生成为一个流。
数据可以被处理成有限数据流和无限数据流。
- 无限数据流:有开始没结束。他们一旦开始就不会种植。无限数据流必须持续产生,一旦产生,就必须被即使处理。想要等所有数据都到达之后再处理是不可能的,此类数据不会在任何时间任何地点完成。处理无限数据流通常需要按照特定的顺序(如事件发生的顺序)接收事件,以便能够推断结果的完整性。
-
有限数据流:有始有终。有限数据流可以在获取所有数据之后在着手处理,在获取数据时,也不要求按照某种顺序,因为有限数据集通常能够被排序。有限数据流的处理也被称为批处理。
对时间和状态的精确控制使Flink的运行时能够在无限数据流上运行任何类型的应用程序。有限流由专门为固定大小的数据集设计的算法和数据结构进行内部处理,从而产生优异的性能。
想要了解更多的话,请参考这些基于Flink 的用户实例。
部署应用:适配各种环境
Apache Flink 是一个分布式系统,需要计算资源来执行应用。Flink 可以集成到任何常见的集群资源管理器中,如:Hadoop YARN、Apache Mesos 以及Kubernetes,同时也可以运行为一个单独的集群。
Flink 可以和前面提到的这些资源管理器很好的协作,这是通过一个被称为"资源管理器部署模式"的设计来实现的,通过这个设计,Flink 可以适配各种资源管理器。
当部署Flink 应用时,Flink 会基于应用的配置自动识别所需要的资源,并从资源管理器中获取。当出现故障时,Flink 会请求新的资源并替换那些失败了的容器。所有提交、控制应用的请求都是通过REST调用。这大大简化了Flink 在很多场景下的集成工作。
运行应用:随意变更规模
Flink 在设计上支持运行任意规模的有状态流应用。应用程序被并行化为数千个任务,这些任务在集群中分布并并发执行。因此,应用程序可以利用几乎无限量的CPU、主内存、磁盘和网络IO。而且,Flink很容易维护非常大的应用程序状态。它的异步和增量检查点算法确保对处理延迟的影响最小,同时保证一次状态的一致性。
以下是用户的使用心得,关于在正式环境运行Flink 应用程序的表现:
- 应用程序每天处理数万亿事件
- 应用程序维护TB量级的状态
- 应用程序在数千个CPU上运行
利用内存性能
有状态的Flink 应用程序针对本地状态访问进行了优化。任务状态通常保存在内存中,或者,如果状态大小超过可用内存,则保存在访问效率较高的磁盘数据结构上。因此,任务通过访问本地(通常在内存中)的状态执行所有计算,从而产生非常低的处理延迟。Flink通过定期和异步地检查本地状态到持久存储,从而确保在发生故障时的状态一致性。