- 基本概念
flink程序执行时包含两个主要的进程,master和worker。主要分为:Job Client 、JobManager、TaskManager.
job manager
master进程是job manager,协调和管理着程序的执行,主要职责:调度任务、管理checkpoints、故障恢复等
job manager包含如下组件:
-
Actor system
-
Scheduler
-
Check pointing
scheduler
flink的执行者叫做 task slots,每个taskmanger需要管理一个或者多个 task slots
Check pointing
check pointing 是flink实现一致性容错方案的支撑。它维持了分发的数据流和执行者状态的一致性快照。在出错的时,flink停止执行者、重置它们并且从最新可用的checkpoint开始执行。
stream barriers 是flink快照的核心元素:
Task Manager
task manager是工作节点(worker nodes),负责任务在JVM中的一个或者多个线程下执行。任务执行的并行度(parallelism)由每个task manager中可用的task slots决定。每个任务代表了分配给task slot的一系列的资源。例如一个task manager有四个slots,,然后它将分配给每个task slot 25%的内存。一个task slot里可能会有一个或者多个线程运行。在相同slot里的线程分享相同的虚拟机。在相同jvm里的tasks分享了tcp 连接和心跳信息:
job client
job client 不是flink程序内部的部分,但是是执行的开始节点,job client职责是从用户那里接受程序,然后创建一个数据流,把数据流提交给job manager 以备将来执行,一旦任务执行完成,jobclient 提供一个结果给用户。
例如下边编写一个简单的word count 程序:
val text = enc.readTextFile("input.txt"); //source
val count = text.flatMap(_.toLowerCase.split("\\W+") filter (_.nonEmpty).map{(_,1)}
.groupBy(0)
.sum(1) //Transformation
counts.writeAsCsv("output.txt","\n"," ") //Sink
如果一个客户端接受了用户提交的程序,他将转换成一个data flow,data flow 看起来如下:
Flink数据流默认是并行分布的。 对于并行数据处理,Flink分割运算符和流。 操作员分区被称为子任务。 流可以以一对一或重新分布的方式分发数据。
数据直接从源流向map运算符,因为不需要混洗数据。 但是对于GroupBy操作,Flink可能需要通过keys重新分配数据才能获得正确的结果:
以上基本展示了flink的基本架构和执行模块儿。