Flink框架学习 (1)
Apache Flink是什么?
Apache flink是一个框架和分布式处理引擎,用于在无边界和有边界的数据流上进行有状态的计算。Flink能在所有常见的环境中运行,并能以内存速度和任意规模进行计算。
接下来我们介绍一下Flink架构中的重要方面:
处理无界和有界数据:
任何类型的数据都可以形成一种事件流。信用卡交易、传感器测量、机器日志、网站或移动应用程序上的用户交互记录,所有这些数据流都能形成一种流。
数据可以被作为无界或者有界流来处理。
1. 无界流 有定义流的开始,但是没有定义流的结束。它们会无休止地产生数据。无界流的数据必须持续处理,即数据被摄取后需要立刻处理。不能等到所有的数据都到达再处理,因为输入是无限的,任何时候输入都不会完成。处理无界数据通常要求以特定的顺序摄取事件,例如事件发生的顺序,以便推断结果的完整性。
2. 有界流 有定义流的开始,也有定义流的结束。有界流可以在摄取所有数据后再进行计算。有界流数据可以被排序,所以不需要有序摄取。有界流处理通常被称为批处理。
Apache Flink擅长处理无界和有界数据 精确的时间控制和状态话使得Flink的运行时(runtime)能够运行任何处理无界流的应用。有界流则由一些专为固定大小数据集特殊设计的算法和数据结构进行内部处理,产生了出色的性能。
应用场景
Apache Flink功能强大,支持开发和运行多种不同种类的应用程序。它的主要性能包括:批流一体化、精密的状态管理、事件时间支持以及精确一次的状态一致性保障等。Flink不仅可以运行在包括YARN、Mesos、Kubernetes在内的多种资源管理框架上,还支持在裸机集群上独立部署。在启用高可用选项的情况下,它不存在单点失效问题。事实证明,Flink可以扩展到数千核心,状态可以达到TB级别,且仍能保持高吞吐、低延迟的特性。世界各地有很多要求严苛的流处理应用都运行在Flink上。
接下来我们将介绍几种常见的Flink应用:
事件驱动型应用
事件驱动型应用是一类具有状态的应用。它从一个或多个事件流提取数据,并根据到来的事件触发计算、状态更新或其他外部动作。
事件驱动型应用是在计算存储分离的传统应用基础上进化而来的。在传统架构中,应用需要读写远程事务性数据库。
相反,事件驱动型应用是基于状态流处理来完成的。在该设计中,数据和计算不会分离,应用只需访问本地(内存或磁盘)即可获取数据。系统容错性的实现依赖于定期向远程持久化存储写入checkpoint。下图描述了传统应用和事件驱动型应用架构的区别。
部署应用到任意地方
Apache是一个分布式系统,需要计算资源来执行应用程序。Flink继承了所有常见的集群资源管理器,例如Hadoop YARN、Apache Mesos和Kubernetes,但同时也可以作为独立集群运行。
Flink被设计为能够很好地工作在上述每个资源管理器中,这是通过资源管理器特定(resource-manager-specific)的部署模式实现的。Flink可以采用与当前资源管理器相适应的方式进行交互。
部署Flink应用程序时,Flink会根据应用程序配置的并行性自动标识所需的资源,并从资源管理器请求这些资源。在发生故障的情况下,Flink通过请求新资源来替换发生故障的容器。提交或控制应用程序的所有通信都是通过REST调用进行的,这可以简化Flink与各种环境中的集成。
运行任意规模应用
Flink旨在任意规模上运行有状态的流式应用。因此,应用程序被并行化为可能数千个任务,这些任务分布在集群中并发执行。所以应用程序能够被充分利用无尽的CPU、内存、磁盘和网络IO。而且Flink很容易维护非常大的应用程序状态。其异步和增量的检查点算法对处理延迟产生最小的影响,同时保证精确一次状态的一致性。
Flink用户报告了其生产环境中一些令人印象深刻的扩展性数字:
- 每天处理数万亿的事件
- 应用维护几TB大小的状态
- 应用在数千个内核上运行
利用内存性能
有状态的Flink程序针对本地状态访问进行了优化。任务的状态始终保留在内存中,如果状态大小超过可用内存,则会保存在能高效访问的磁盘数据结构中。任务通过访问本地(通常在内存中)状态来进行所有的计算。从而产生非常低的处理延迟。Flink通过定期和异步对本地状态进行持久化存储来保证故障场景下精确一次的状态一致性。