Flink 架构

Flink是一个分布式的、有状态的计算框架,它可以处理无限的和有限的数据流。Flink原本设计的就是可以在所有的通常的集群环境,在内存中进行任意规模的计算。

 

一、处理无边界的和有边界的数据流

任何种类的数据都是以事件流的形式产生的,比如信用卡交易、传感器测量、机器日志或者用户在网站或者移动应用上的交互等,所有的这些数据都是以流的形式产生的。

 

数据可以以有边界的或者无边界的流的形式被处理。

 

 1、无边界的数据流

无边界的数据流有一个开始但是没有定义好的结束。只要数据在生产并且在提供,那么它就不会中断。

无边界的数据流必须被持续地处理,也就是说在flink接收到数据以后必须迅速处理。因为数据是无边界的,并且在任何时候它都不是完整的,所以,不可能等待所有的数据都到达。处理无边界的数据,通常要求事件以特定的顺序接收,比如事件发生的顺序,以便可以对结果的完整性进行推理。

 

2、有边界的数据流

有边界的数据流有一个定义好的开始和结束。有边界的数据可以在接收到所有的数据以后才开始执行计算。在接收有边界的数据流时是不要求有序的,因为它总是可以被排序的。有边界的数据流处理也通常被称为批处理。

 

 

 

Apache Flink 擅长处理有边界的和无边界的数据集。精确的时间和状态的控制让Flink可以运行无边界流的任意类型应用程序。有边界的流由内部的算法和专门为固定大小数据集设计的数据结构来处理,这种设计为优秀的性能做出来让步。

 

你可以探索基于Flink的用例来说服自己。

 

 

二、在任意地方部署应用

Apache Flink是分布式的系统,并且需要计算自言来执行应用。Flink与常用的集群管理系统天然的兼容,比如Hadoop YARN, Apache Mesos, 以及Kubernetes,但是它也可以作为一个独立的集群运行。

 

Flink设计本身就使其能够与前面提到的资源管理器非常好的工作。这是通过资源管理特定的部署部署模式实现的,这种模式允许Flink以其管用的方式与每一个资源管理器交互。

 

当部署Flink应用的时候,Flink根据应用配置的并发自动的识别需要的资源,并且向资源管理器申请资源。假如某个容器失败,那么Flink则会请求新的资源来替代失败的容器。所有的提交或者控制应用都是通过REST调用。这简化了Flink在多种环境中的集成。

 

三、运行任意规模的应用

Flink本身设计就是要运行任意规模的有状态的流式应用。应用是并行的运行数千个任务,这些任务是分布式的并且在集群中并发地执行。因此,一个应用几乎能够使用无限数量的CPU、内存(main memory)、磁盘以及网络IO。此外,Flink也可以很轻易的维护非常大量的应用状态。它的异步和增量的检查点(checkpointing)在保证仅仅一次(exactly-once)状态一致性的同时,也确保了对运行延迟最小的影响。

 

有用户上报了他们生产环境中的令人印象深刻的Flink应用程序的大规模数量,比如:

 

  • 每天运行几万亿的事件;
  • 保存了几TB的状态信息;
  • 同时运行了成千上万的内核;

 

四、利用内存性能

 

有状态的Flink应用是充分利用本地的状态访问。任务的状态总是保存在内存中的,如果状态的大小超过了可用的内存,则以一个可高效访问的数据结构存储在磁盘上。因此,任务通过访问本地的(通常是内存中的)状态信息来执行计算,这使得计算延时非常低。Flink通过异步的保存本地状态到稳定的存储中来防止失败的情况发生,通过这种方式来保证exactly-once。

 

 

参考文档:http://flink.apache.org/flink-architecture.html

 

Flink简介请查看:Apache Flink 概览 - 有状态的流式计算

 

 

 打个广告,个人网站,查看全站的最新热点,请访问:领航榜单