0%

Spark VS Flink

JobManager,相当于Spark 中的ApplicationMaster中的Driver
作业管理器,是一个JVM进程,接收作业
分发执行图到taskManager

TaskManager,相当于Spark 中的Executor
任务管理器,是一个JVM进程,执行作业,它可能会在独立的线程上执行一个或多个subtask
Flink中会有多个TaskManager
每个TaskManager都包含一定数量的插槽slots

Slots,相当于Spark Executor中的cpu core,相当于工作线程。但不同的是Slots是静态的,Spark中的Executor是动态的
插槽,推荐值是就当前节点的CPU CORES核心数
主要是隔离内存
为了控制一个TaskManager能接收多少个task,TaskManager通过task slot来进行控制(一个TaskManager至少有一个slot)

最大并行度
Spark: Executor数 * 每个Executor 中的cpu core
Flink: TaskManager数 * 每个TaskManager 中的Task Slot

ResourceManger
资源管理器

Dispatcher,在yarn模式下不会创建生成
分发器,为应用提交提供了REST接口
提供一个Web UI,展示作业流程

Flink中的执行图可以分成四层:
StreamGraph -> JobGraph -> ExecutionGraph -> 物理执行图
StreamGraph: 是根据用户通过Stream API编写的代码生成的最初的图。用来表示程序的拓扑结构。
JobGraph: 【Client上生成】StreamGraph经过优化生成了JobGraph,提交给JobManager的数据结构。主要的优化为,将多个符合条件的节点chain在一起作为一个节点
ExecutionGraph: 【JobManager上生成】JobManager根据JobGraph生成ExecutionGraph。ExecutionGraph是JobGraph的并行化版本,是调度最核心的数据结构。
物理执行图:【TaskManager运行】
JobManager根据ExecutionGraph对Job进行调度后,在各个TaskManager上部署Task后形成的 “图”,并不是一个具体的数据结构

Flink的Task和SubTask-划分的依据(叫redistribute,相当于spark中的shuffle(宽依赖)):
1.并行度发生变化;比如:之前并行度为4,现在并行度为2,叫:rebalance
2.发生keyBy算子,叫HASH
3.广播 brodcast
4.算子后面调用了 startNewChain/disableChaining

Flink支持数据类型:
1、基础数据类型,Java和Scala基础数据类型
2、Java和Scala元组(Tuples)
3、Scala样例类(case classes)
4、Java简单对象(POJOs)
5、其它(Arrays, Lists, Maps, Enums,等等

Flink支持时间语义:
1、Event Time: 事件创建的时间
2、Ingestion Time: 数据进入Flink的时间
3、Processing Time: 执行操作算子的本地系统时间,与机器无关

Spark Streaming Flink
DStream DataStream
Transformation Transformation
Action Sink
Stage Task
Task SubTask
Pipline Oprator chains
DAG DataFlow Graph
Master+Driver JobManager
Worker+Executor TaskManager

以Yarn集群为例,必须要启动的节点(进程):ResourceManager、NodeManager
Flink 客户端提交作业的时候会在 NodeManager 里启动一个 ApplicationManager,AM 加载 Jar 包和配置构建环境,然后启动 JobManager,AM 向 RM 申请资源来启动 TaskManager,申请到资源后由 AM 通知对应的 NodeManager 启动 TaskManager,NodeManager 加载 Jar 包和配置构建环境来启动 TaskManager,TaskManager 启动后等待 JobManager 分配任务

Spark 部署的时候,master 和 worker 是常驻的,同时 master 可以和 worker 在同一个节点上。
在客户端提交作业的时候向 Master 提交,通过 ActorSelection(master的actor引用)给 Master 发送注册 Driver 请求(RequestSubmitDriver),Master 来通知 Worker 来启动一个 Driver,可以在任意一个结点上,只要有资源就行。Driver 启动后向 Master 返回注册成功信息,同时

向 RM 申请资源,会在各个 Worker 中分配一定数量的 Executor,每个 Executor 会占一定的 cores 和 memory。分配好 Executor 之后,Driver 会解析程序到 DAG,然后根据算子宽窄依赖划分 stage,每个 Stage 里面 Task 的数量是由该 Stage 中输入文件的 partition 数量决定的。

Spark 中的 Driver 即运行 Application 的 main() 函数并创建SparkContext,创建 SparkContext 的目的是为了准备 Spark 应用程序的运行环境。在 Spark 中由 SparkContext 负责与 RM 通信,进行资源的申请、任务的分配和监控等。当 Executor 部分运行完毕后,Driver 同时负责将 SparkContext 关闭。通常用 SparkContext 代表 Driver