https://flink.apache.org/flink-architecture.html
本期会从flink官方网站同步进行翻译学习。
Apache Flink 是一个分布式处理引擎,在有界或无界数据流上进行有状态的计算。flink可以在所有通用的集群环境上运行,并且可以以内存级的速度进行大批量的计算。
1.处理有界和无界的数据
任何数据都可以看做事件流,银行交易、传感器测量、机器日志或者用户在网站或手机上的交互行为,所有这些数据都是作为流产生的。
数据可以被当做有界或无界的流进行处理。
- 无界流有开始但是没有结束,他们不会结束,并且会事实提供所产生的数据。无界流必须连续的被处理,也就是事件被注入的时候必须被处理。他不太可能等待所有输入数据的到来,因为这种输入是无界的,并且将来也不会再任意时刻结束。处理无界的数据常常需要被注入的事件是按照某一顺序的,比如按照事件发生的顺序,并且和前面完成的结果是有关联的。
- 有界流有确定的开始和结束,有界流可以在计算之前注入全部的数据,处理有界数据流,不需要有序的注入,因为有界的数据集总是有序的,最为熟知的处理有界数据就是批处理。
flink擅长处理有界或无界的数据集。精确控制时间和状态可以使flink运行在任何种类的无界流应用程序上,有界流内部通过算法和数据结构被处理,这些数据结构有固定的大小,并且有出色的性能。
2.在任何地方部署应用
flink是一个分布式系统,并且需要计算资源才能进行计算,flink集成了通用的集群管理方案,例如 Hadoop YARN, Apache Mesos, 以及 Kubernetes ,也可以离线的方式安装。
对于上述列举的资源管理器,flink都能良好的工作,这得益于flink面向资源管理的部署模式,使得flink以特有的方式和任何资源管理进行交互。
当部署flink应用的时候,它会基于应用的配置自动识别必须的资源,并从资源管理器获取他们。如果失败,flink会重新申请资源并替换他们,所有通讯或者控制应用全是通过REST调用,这就减轻了flink集成的难度。
3.在任何范围内运行程序
flink设计的初衷是为了运行又状态的流应用程序,应用程序被拆分成几千个并行的任务,这些任务在一个集群中分布式的同时执行,因此,应用程序可以支持无限数量的 CPU、内存、磁盘以及IO资源。flink可以很容易维持他们的状态,它的异步性以及递增的检查指标算法对处理延迟有最小的影响,最终连续的保证了exactly-once的状态。
由用户列举了在生产环境中,flink可观的扩展性,例如:
- 每天处理几百万的事件;
- 维持着几个T的状态;
- 在数以千计的内核上运行;
4.提升内存级性能
有状态的flink应用常常为了存取本地状态进行优化,任务状态常常放在内存中,如果大小超出了可用内存,也会存在磁盘上。因此通过使用本地的内存,有很低的处理延迟,来执行任务。如果发生失败,flink通过周期性的、异步的检测指标(checkpointing),并连续存储,保证exactly-once。