专业的编程技术博客社区

网站首页 > 博客文章 正文

阿里一面:说一下Flink跟Spark Streaming的区别

baijin 2024-09-29 08:59:13 博客文章 210 ℃ 0 评论

当提及大数据时,我们无法忽视流式计算的重要性,它能够完成强大的实时分析。而说起流式计算,我们也无法忽视最强大的数据处理引擎:Spark和Flink。

Apache Spark自2014年以来迅速普及。它提供了一个适用常见数据处理场景的统一引擎,如批处理、流处理、交互式查询和机器学习。在某些情况下,它的性能是前一代Hadoop MapReduce的数百倍。凭借其高性能的处理和广泛的场景支持,它在大数据开发方面受到早期用户的长期青睐。

在Spark出现后不久,Apache Flink就作为强劲对手进入公众视野,并在2016年左右名声大噪。当Spark早期用户在实时流处理等场景中面临可用性问题时,Flink提供了一个支持各种场景的高级流处理引擎,Flink的优势还不仅仅于此,现在带大家对比了解Flink与Spark Streaming都作为流式计算框架他们之间的异同。

一、设计理念

Spark的技术理念是使用微批来模拟流的计算,基于Micro-batch,数据流以时间为单位被切分为一个个批次,通过分布式数据集RDD进行批量处理,是一种伪实时。

Flink是基于事件驱动的,是面向流的处理框架, Flink基于每个事件一行一行地流式处理,是真正的流式计算. 另外他也可以基于流来模拟批进行计算实现批处理。

二、架构运行时角色

Spark Streaming 运行时的角色(standalone 模式)主要有:

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

Flink 运行时的角色(standalone 模式)主要有:

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

三、任务调度

Spark Streaming 连续不断的生成微小的数据批次,构建有向无环图DAG,根据DAG中的action操作形成job,每个job有根据窄宽依赖生成多个stage。

上图流程如下:

  • 构建 DGA 图
  • 划分 stage
  • 生成 taskset
  • 调度 task

Flink 根据用户提交的代码生成 StreamGraph,经过优化生成 JobGraph,然后提交给 JobManager进行处理,JobManager 会根据 JobGraph 生成 ExecutionGraph,ExecutionGraph 是 Flink 调度最核心的数据结构,JobManager 根据 ExecutionGraph 对 Job 进行调度。

四、时间机制

Spark Streaming 支持的时间机制有限,只支持处理时间。使用processing time模拟event time必然会有误差, 如果产生数据堆积的话,误差则更明显。

flink支持三种时间机制:事件时间,注入时间,处理时间,同时支持 watermark 机制处理迟到的数据,说明Flink在处理乱序大实时数据的时候,更有优势。

Flink流处理程序三个时间概念如下:

处理时间

处理时间是指每台机器的系统时间,当流程序采用处理时间时将使用运行各个运算符实例的机器时间。处理时间是最简单的时间概念,不需要流和机器之间的协调,它能提供最好的性能和最低延迟。然而在分布式和异步环境中,处理时间不能提供消息事件的时序性保证,因为它受到消息传输延迟,消息在算子之间流动的速度等方面制约。

事件时间

事件时间是指事件在其设备上发生的时间,这个时间在事件进入 flink 之前已经嵌入事件,然后 flink 可以提取该时间。基于事件时间进行处理的流程序可以保证事件在处理的时候的顺序性,但是基于事件时间的应用程序必须要结合 watermark 机制。基于事件时间的处理往往有一定的滞后性,因为它需要等待后续事件和处理无序事件,对于时间敏感的应用使用的时候要慎重考虑。

注入时间

注入时间是事件注入到 flink 的时间。事件在 source 算子处获取 source 的当前时间作为事件注入时间,后续的基于时间的处理算子会使用该时间处理数据。

五、总结

来咱们总结一下吧!

  • Spark Streaming和Flink都支持实时计算,且都可基于内存计算。
  • Spark最重要的核心组件仍然是Spark SQL,而在未来几次发布中,除了性能上更加优化外(包括代码生成和快速Join操作),还要提供对SQL语句的扩展和更好地集成。
  • Flink对于时间语义上的支持更加完善,Spark Streaming缺少事件时间的支持。
  • Flink任务调度上有着更严格的解耦。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表