一、什么是Flink
Apache Flink官网的描述:
Apache Flink is a framework and distributed processing engine for stateful computations over unbounded and bounded data streams. Flink has been designed to run in all common cluster environments, perform computations at in-memory speed and at any scale.
翻译成中文就是说:Apache Flink是一个对有界或无界数据流进行有状态计算的分布式处理引擎框架。
二、Flink架构
1、基本组件栈
从下至上:
- 1>、部署:Flink 支持本地运行、能在独立集群或者在被 YARN 或 Mesos 管理的集群上运行, 也能部署在云上;
- 2>、运行:Flink 的核心是分布式流式数据引擎,意味着数据以一次一个事件的形式被处理;
- 3>、API:DataStream、DataSet、Table、SQL API;
- 4>、扩展库:Flink 还包括用于复杂事件处理,机器学习,图形处理的专用代码库。
2、基本架构
Flink架构也遵循了Master-Slave架构设计原则,主要由两个组件构成:JobManager和TaskManager。JobManager为Master节点,TaskManager为Worker节点(slave).。所有组件之间的通信都是借助于Akka Framework。
- Client:与JobManager构建Akka连接,然后将任务提交到JobManager。通过和JobManager之间进行交互获取任务执行状态。提交方式:客户端提交任务可以采用CLI方式或者通过使用Flink WebUI提交,也可以在应用程序中指定JobManager的RPC网络端口构建ExecutionEnvironment提交Flink应用。
- JobManager:JobManager负责申请资源、协调以及控制整个job的执行过程,具体包括调度任务、处理checkpoint、容错等等。从客户端中接收提交的JobGraph,进行包装转换成ExecutionGraph(physical dataflow graph,并行化),然后根据集群中TaskManager上TaskSlot的使用情况(注册到Master节点上的TaskManager的slot使用情况),资源准备就绪之后就调度任务到TaskManager启动并运行任务。JobManager相当于整个集群的Master节点,且整个集群中有且只有一个活跃的JobManager。JobManager和TaskManager之间通过Actor System进行通信,获取任务执行的情况、维持心跳等工作。同时在任务执行过程中,JobManager会协调TaskManager进行CheckPoints 操作,所有的Checkpoint协调过程都是在FLink JobManager中完成,当任务完成后Flink会将任务执行的信息反馈给客户端,并且释放掉TaskManager中的资源以提供下一次提交任务使用。
- TaskManager:负责具体的任务执行和相应任务在每个节点上的资源申请与管理。TM从JM接收到分配的任务,使用Slot资源启动Task,建立数据接入的网络连接(TM间底层使用Netty进行数据交换),接收数据并开始处理数据。一个TM中Slot之间内存隔离,slots间均分内存,但是共享CPU,所以提高了CPU的使用效率。
三、Flink编程模型
1、Flink根据数据集类型的不同将核心数据处理接口分为两大类:DataStream API与DataSet API。同时Flink将数据处理接口抽象成四层(如下图),用户可以根据需要选择任意一层抽象接口来开发Flink应用。
- SQL API:SQL API是Flink提供给用户完成流处理或批处理的高层抽象接口,通过SQL API可以让数据分析人员与开发人员跟快速上手,帮助其更专注于业务本身而不是受限于复