Apache Flink是一个框架和分布式处理引擎,用于在无界和有界数据流上进行有状态计算。Flink被设计为在所有常见的集群环境中运行,以内存速度和任何规模执行计算。
在这里,我们解释Flink’s架构重要的各个方面。
任何类型的数据都是以事件流的形式产生的。信用卡交易、传感器测量、机器日志或网站或移动应用程序上的用户交互,所有这些数据都以流的形式生成。
数据可以作为无界流或有界流进行处理。
无界流有起点,但没有定义的终点。它们不会在生成数据时终止并提供数据。无界流必须持续处理,即事件被摄入后必须立即处理。不可能等待所有输入数据到达,因为输入是无限的,在任何时间点都不会完成。处理无界数据通常需要按照特定的顺序接收事件,例如事件发生的顺序,以便能够对结果的完整性进行推理。
有界流有一个定义的起点和终点。在执行任何计算之前,可以通过摄取所有数据来处理有界流。处理有界流不需要有序摄取,因为有界数据集总是可以排序的。有界流的处理也称为批处理。
Apache Flink擅长处理无界和有界数据集。对时间和状态的精确控制使Flink的运行时能够在无限流上运行任何类型的应用程序。有界流由专门为固定大小的数据集设计的算法和数据结构进行内部处理,从而产生优异的性能。
通过探索建立在Flink之上的用例来说服自己。
Apache Flink是一个分布式系统,需要计算资源才能执行应用程序。Flink与所有常见的集群资源管理器(如Hadoop Thread、Apache Mesos和Kubernetes)集成,但也可以设置为作为独立集群运行。
Flink的设计目的是让之前列出的每一位资源经理都能很好地工作。这是通过特定于资源管理器的部署模式实现的,这些模式允许Flink以其惯用的方式与每个资源管理器交互。
部署Flink应用程序时,Flink会根据应用程序配置的并行性自动识别所需的资源,并从资源管理器请求这些资源。如果失败,Flink会通过请求新资源来替换失败的容器。提交或控制应用程序的所有通信都是通过REST调用进行的。这简化了Flink在许多环境中的集成。
Flink旨在以任何规模运行有状态的流媒体应用程序。应用程序被并行化为数千个任务,这些任务在集群中分布并并发执行。因此,应用程序可以利用几乎无限量的CPU、主内存、磁盘和网络IO。此外,Flink很容易维护非常大的应用程序状态。它的异步和增量检查点算法确保了对处理延迟的最小影响,同时保证了一次状态的一致性。
用户报告称,在他们的生产环境中运行的Flink应用程序的可扩展性数量令人印象深刻,例如:
有状态的Flink应用程序针对本地状态访问进行了优化。任务状态始终保持在内存中,如果状态大小超过可用内存,则保持在访问效率高的磁盘数据结构中。因此,任务通过访问本地(通常在内存中)状态来执行所有计算,从而产生非常低的处理延迟。Flink通过定期、异步地将本地状态检查点设置为持久性存储,在出现故障时确保一次状态的一致性。