06Flink基础(1)/构建大数据平台
Apache Flink是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。
01 Flink架构
Flink运行时由一个JobManager和一个或者多个TaskManager组成,Client不是运行时和程序执行的一部分,用于准备数据流并将其提交给 JobManager。
./bin/flink run /path/to/WordCount.jar
JobManager
JobManager负责协调Flink应用程序的执行,如何时调度下一个task(或一组 task)、对完成的task或执行失败做出反应、协调checkpoint、并且协调从失败中恢复等。
TaskManager
也称为worker,执行作业流的task,并且缓存和交换数据流。至少有一个TaskManager,TaskManager中资源调度的最小单位slot,所有TaskManager中slot的数量之和表示并发处理task的数量。
Flink应用程序从代码编写、到提交JobManager,到TaskManager调度执行涉及到四种不同的图
stream graph
Flink应用程序的原始算子执行链,可在execute之前通过打印env.getExecutionPlan()输出stream graph(JSON),并将JSON串拷贝到_https://flink.apache.org/visualizer/_ 查看 stream graph,考虑如下代码
通过Flink Plan Visualizer查看
stream graph
job graph
也称为logical graph或dataflow graph,Client端完成,在stream graph的基础上做了一个很重要的优化:operator chain(算子链)
算子链由两个或多个连续的operator组成,两者之间没有任何的重新分区。同一算子链内的算子可以彼此直接传递record,减少线程间切换,无需通过序列化或Flink的网络栈。
job graph
execution graph
JobManager将Client提交的job graph转化为execution graph,这是并行化,可调度的执行图。
physical graph
JobManager根据execution graph进行调度后,在各个TaskManager上部署 Task 后形成的运行时图
02 算子
用户通过算子能将一个或多个 DataStream 转换成新的 DataStream,在应用程序中可以将多个数据转换算子合并成一个复杂的数据流拓扑。如map、flatMap、filter是一种forward(保持元素的顺序和分区不变)算子,source、sink也是特殊的算子。实际上dataflow graph中的一个节点就是算子(或算子链)。
每个算子都有属于自己的并行度,每个并行度会产生一个在execution graph中对应的结点。
算子链将多个算子链接在一起能使得它们在同一个线程中执行,从而提升性能。Flink默认会将能链接的算子尽可能地进行链接(如两个map转换操作)。
===========================================================================
03 Task与subTask
向JobManager提交的任务是一个Job,比如SocketWordCount就是一个Job。
-
Task是逻辑概念,一个operator就代表一个Task(operator chain算一个operator)
-
运行时,Task会按照并行度分成多个subtask,subtask是执行/调度的基本单元
-
每个subtask由一个线程执行
**04 Slot
**
每个worker(TaskManager)都是一个JVM进程,可以在单独的线程中执行一个或多个 subtask,为了控制一个TaskManager中接受多少个subtask,于是有了task slots。
subtask是执行的基本单元,slot则是资源分配的基本单元,slot只隔离内存,不隔离CPU。
Flink默认允许同一个Job中不同Task的subtask运行在一个Slot中。结果就是一个slot 可以持有整个作业管道。允许slot 共享有两个主要优点:
-
Flink集群所需的task slot和作业中使用的最大并行度(算子并行度)一样
-
容易获得更好的资源利用。如果没有slot共享,非密集subtask(source/map)将阻塞和密集型subtask(window) 一样多的资源