sparkstreaming和flink的区别

参考 https://blog.csdn.net/b6ecl1k7BS8O/article/details/81350587

组件:

sparkstreaming:
Master:主要负责整体集群资源的管理和应用程序调度;
Worker:负责单个节点的资源管理,driver 和 executor 的启动等;
Driver:用户入口程序执行的地方,即 SparkContext 执行的地方,主要是 DGA 生成、stage 划分、task 生成及调度;
Executor:负责执行 task,反馈执行状态和执行结果。

flink:
Jobmanager: 协调分布式执行,他们调度任务、协调 checkpoints、协调故障恢复等。至少有一个 JobManager。高可用情况下可以启动多个 JobManager,其中一个选举为 leader,其余为 standby;
Taskmanager: 负责执行具体的 tasks、缓存、交换数据流,至少有一个 TaskManager;
Slot: 每个 task slot 代表 TaskManager 的一个固定部分资源,Slot 的个数代表着 taskmanager 可并行执行的 task 数。

运行模型:

Spark Streaming 是微批处理。
Flink 是基于事件驱动的。它会从一个或者多个流中注入事件,通过触发计算更新状态。

代码编写流程:

sparkstreaming

  1. 设置批处理时间
  2. 创建数据流
  3. 编写transform
  4. 编写action
  5. 启动执行

Flink

  1. 注册数据 source
  2. 编写运行逻辑
  3. 注册数据 sink
  4. 调用 env.execute
    相比于 Spark Streaming 少了设置批处理时间,还有一个显著的区别是 flink 的所有算子都是 lazy 形式 的,调用 env.execute 会构建 jobgraph,client 端负责 Jobgraph生成并提交它到集群运行;而 Spark Streaming的操作算子分 action 和 transform ,其中仅有transform 是 lazy 形式,而且 DGA 生成、stage 划分、任务调度是在 driver 端进行的,在 client模式下 driver 运行于客户端处。

任务调度原理

Spark 任务调度

Spark Streaming 任务如上文提到的是基于微批处理的,实际上每个批次都是一个 Spark Core 的任务。对于编码完成的 Spark Core 任务在生成到最终执行结束主要包括以下几个部分:

  1. 构建 DGA 图;
  2. 划分 stage;
  3. 生成 taskset;
  4. 调度 task。

flink任务调度

  1. 对于 flink 的流任务客户端首先会生成 StreamGraph,
  2. 接着生成 JobGraph
  3. 然后将 jobGraph 提交给 Jobmanager 由它完成 jobGraph 到 ExecutionGraph 的转变
  4. 最后由 jobManager 调度执行。

时间机制

处理时间:程序执行处理的时间。
事件时间:指事件在其设备上发生的时间,这个时间在事件进入 flink 之前已经嵌入事件
注入时间:是事件注入到 flink 的时间。

Spark 时间机制:
Spark Streaming 只支持处理时间,Structured streaming 支持处理时间和事件时间,同时支持 watermark 机制处理滞后数据。
Flink 时间机制:
flink 支持三种时间机制:事件时间,注入时间,处理时间,同时支持 watermark 机制处理滞后数据。

_

kafka动态分区检测

sparkstreaming:
Spark Streaming 与 kafka 0.10 版本结合支持动态分区检测。
flink:
flink 可以动态发现 kafka 新增分区。不过与 Spark 无需做任何配置不同的是,flink 动态发现 kafka 新增分区,这个功能需要被使能的。也很简单,需要将 flink.partition-discovery.interval-millis 该属性设置为大于 0 即可。

_

容错机制及处理语义

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐