目录
一,Apache Flink 是什么?
Apache Flink 是一个分布式流批一体化的开源平台。Flink 的核心是一个提供数据分发、通信以及自动容错的流计算引擎。Flink 在流计算之上构建批处理,并且原生的支持迭代计算,内存管理以及程序优化。
二,Apache Flink的组件栈
1,API&Libraries层
作为分布式数据处理框架,Flink同时提供了支撑流计算和批量计算的接口,同时在此基础上抽象不同的应用类型的组件库,如基于流处理的CEP(复杂事件处理库)、SQL&Table库和基于批处理的FlinkML(机器学习库)等、Gelly(图处理库)等。API层包括构建流计算应用的DataStream API 和批计算应用的 DataSet API,两者都提供给用户丰富的数据处理高级API,例如Map,FlatMap操作等,同时也提供比较低级的Process Function API,用户可以直接操作状态和时间等底层数据。
2 , Runtime核心层(Core)
改层主要负责对上层不同接口提供基础服务,也是flink分布式计算框架的核心实现层,支持分布式Stream作业的执行、JobGraph到ExecutionGraph的映射转换、任务调度等。将DataStream和DataSet转成统一的可执行的Task Operator,到到在流式引擎下同时处理批量计算和流式计算的目的。
3,物理部署层
该层主要涉及Flink的部署模式,目前Flink支持多种部署模式:本地、集群(Standalone/YARN)、云(GCE/EC2)、kubenetes、Flink通过该层能够支持不同平台的部署,用户可以根据需要选择使用对应的部署模式。
三,Apache Flink的基础架构
Flink系统架构设计如下图所示,整个系统由两个组件,分别为JobManager和TaskManager,Flink架构也是遵循Master-Slave架构设计原则,JobManager为Master节点,TaskManager为Worker(Slave)节点。所有组件之间的通信都是借助于Akka Framework,包括任务的状态以及Checkpoint触发等信息。
1,Client客户端
客户端负责将任务提交到集群,与JobManager构建Akka连接,然后将任务提交到JobManager,通过和JobManager之间进行交互获取任务执行状态。客户端提交任务可以采用CLI方式或者通过使用Flink webUI提交,也可以在应用程序中指定JobManager的RPC网络端口构建ExecutionEnvironment提交Flink应用。
2,JobManager
JobManager负责整个Flink集群任务的调度以及资源的管理,从客户端中获取提交的应用,然后根据集群中TaskManager上TaskSlot的使用情况,为提交的应用分配相应的TaskSlots资源并命令TaskManager启用从客户端中获取应用。JobManager相当于整个集群的Master节点,且整个集群中有且仅有一个活跃的JobManager,负责整个集群的任务管理和资源管理。JobManager和TaskManager之间通过Actor System进行通信, 获取任务执行的情况并通过 Actor System 将应用的任务执行情况发送给客户端。同时在任务执行过程中, Flink JobManager会触发Checkpoints操作,每个TaskManager节点收到Checkpoints触发指令后,完成Checkpoints操作,所有的Checkpoints协调过程都是在Flink JobManager中完成。当任务完成后,Flink会将任务执行的信息反馈给客户端,并释放掉taskManager中的资源以提供下一次提交任务使用。
3,TaskManager
Taskmanager相当于整个集群的Slave节点,负责具体的任务执行和对应任务在每个节点上的资源申请与管理。客户端通过将编写好的flink应用编译打包,提交到job manager,然后jobmanager会根据已经注册在jobmanager中task manager的资源情况,将任务分配给有资源的task manager节点,然后启动并运行任务。Task manager从job manager接收,需要部署的任务,然后使用slot资源启动task,建立数据接入的网络节点,接收数据并开始数据处理。同时taskmanager之间的数据交互,都是通过数据流的方式进行的。
可以看出,flink,的任务运行其实是采用多线程的方式,这和mapReduce多Jvm进程的方式有很大的区别,flink,能够极大提高CPU使用效率,在多个任务和task之间通过taskslot,方式共享系统资源,每个taskManager中,通过管理多个taskSlot,资源池进行对资源进行有效管理。
四,Apache Flink 的编程接口
DataSet API
对静态数据进行批处理作业,将静态数据抽象成分布式的数据集,用户可以方便的使用Flink提供的各种操作符对分布式数据集进行处理,支持Java,Scala和python;
DataStream API
对数据流进行流处理作业,将流式的数据抽象成分布式的数据流,用户可以方面的对分布式数据流进行各种操作,支持Java,scala和python;
Table API
对结构化数据进行查询操作,将结构化数据抽象成关系表,并通过SQL的DSL对关系表进行各种查询操作,支持Java和Scala;
SQL
SQL查询是使用TableEnvironment的sqlquery()方法执行的,该方法以SQL的形式返回SQL查询的结果。Table可以在后续的SQL和Table API查询中使用,可以转换诶DataSet和DataStream,也可以写入TableSink。SQL和Table API可以无缝的整合,进行整体优化并转换为单个程序。要访问SQL中查询的表,必须在TableEnvironment中注册他,可以从TableSource,Table,DataStream和DataSet注册表,用户也可以在TableEnvironment中注册外部目录以制定数据源的位置。Blink开源后,将使Flink SQL更加完善稳定。
StateFul Stream Processing
最低级抽象只提供有状态流,通过Process Function嵌入到DataStream API中,它允许用户自由处理来自一个或者多个流的时间,并使用一致的容错状态,此外用户可以注册event time和processing time回调,允许程序实现复杂的计算。