原文翻译如下
Apache Flink是一个能在有界和无界数据流上进行有状态计算的框架和分布式处理引擎。Flink被设计为在所有常见的集群环境中运行,在超大规模中仍能以内存速度执行计算。
下面,我们会向您介绍Flink架构中重要的概念。
处理有界和无界的数据
任何类型的数据都可以看作是事件流。信用卡交易,传感器的测量,机器的日志,或者一个用户在手机应用或网站上的交互数据,所有这些数据都可以生成流。
数据可以根据是有界流还是无界流来进行相应的处理。
- 无界数据流 有起点但是没有终点。它不会中断,并且随数据的产生而一直持续下去。无界数据流必须持续地进行处理,例如,事件必须在它被获取到后立即处理。等到所有的输入数据都到达后再处理是不可能的,因为输入流是无界的数据流,且在任何时间都不会结束。处理无界数据流一般会要求获取到的数据以一种特定的方式进行排序,例如按事件发生的顺序排序,这样才能够保证计算结果的完整性。
-
有界数据流 既有起点也有终点。有界数据流可以等待所有数据都加载完之后再进行计算处理。处理有界数据流不会要求获取的数据是排好序的,这是因为一个有界的数据集可以在加载后随时被排序。处理有界数据流也被称作批处理。
无论是有界数据集还是无界数据流,Apache Flink都很擅长处理。对时间与状态的精确控制,使得Flink的运行时能够在无界数据流上运行各种类型的应用。有界流通过算法和数据结构进行内部处理同样表现优异,这些算法和数据结构是专为固定大小的数据集设计的。
在任何地方都能部署应用程序
Apache Flink 是一个分布式系统,为了执行应用程序Flink需要有计算资源。Flink能够很好的与常见的集群资源管理器集成,如:Hadoop YARN, Apache Mesos, 与Kubernetes,同时也可以设置为stand-alone集群模式来启动。
Flink被设计为能够很好的与上面所列的资源管理器共同工作,这是通过资源管理器特定的部署模式实现的,该模式允许Flink以其惯用的方式与每个资源管理器交互。
当部署一个Flink应用时,Flink能根据应用所配置的并发数(parallelism )自动的识别所需资源,并向资源管理器请求这些资源。一旦发生故障,Flink会请求一个新的容器来替换出故障的容器。提交或控制应用程序都是通过REST请求完成的,这使得Flink能够很容易集成在其他环境中。
以任何规模运行应用
Flink被设计为在任何规模下都能够运行有状态的流应用。应用可能被分解到数千个并行的task中,这些task在集群中是分布式且并发执行的。因此一个应用实际上可以利用无限的cpu,内存,硬盘以及网络I/O资源。不仅如此,Flink也可以很容易的维持一个非常大的应用状态。它的异步且增量的检查点算法,在保证每个数据恰好处理一次且维持状态的一致性的基础上,将其对处理延迟的影响降到最小。
有用户报告说,在他们的生产环境中运行这数量客观的Flink应用。例如:
- 应用每天处理万亿级别的事件
- 应用维持着几TB的状态
- 在数千内核上运行应用程序
利用内存性能
有状态的Flink应用针对本地状态访问做了优化。task的状态总是先在内存中存储,如果状态的大小超过了可用内存容量,则会以具有高效访问的数据格式存储到磁盘。因此task通过访问本地,更多的是内存中的状态来进行计算以达到更低的处理延迟。周期性且异步的将本地状态保存到持久存储如数据库中,使得Flink能够在遇到故障时,也能够保证数据恰好仅处理一次且状态连续。