1.Flink 相比传统的 Spark Streaming 区别
Fink 是标准的实时处理引擎,基于事件驱动。而 Spark Streaming 是微批(Micro-Batch)的模型。
- 架构模型 Spark Streaming 在运行时的主要角色包括:Master 、Worker、Driver 、Executor,Flink 在运行时主要包含:Jobmanager、Taskmanager 和 Slot。
- 任务调度 Spark Streaming 连续不断的生成微小的数据批次,构建有向无环图 DAG,Spark Streaming 会依次创建 DStreamGraph、JobGenerator、JobScheduler。Flink 根据用户提交的代码生成 StreamGraph,经过优化生成 JobGraph,然后提交给 JobManager 进行处理,JobManager 会根据 JobGraph 生成 ExecutionGraph,ExecutionGraph 是 Flink 调度最核心的数据结构,JobManager 根据 ExecutionGraph 对 Job 进行调度。
- 时间机制 Spark Streaming 支持的时间机制有限,只支持处理时间。 Flink 支持了流处理
程序在时间上的三个定义:处理时间、事件时间、注入时间。同时也支持 watermark 机制来处理滞后数据。 - 容错机制对于 Spark Streaming 任务,我们可以设置 checkpoint,然后假如发生故障并重启,我们可以从上次 checkpoint 之处恢复,但是这个行为只能使得数据不丢失,可能会重复处理,不能做到恰好一次处理语义。Flink 则使用两阶段提交协议来解决这个问题。
2.Flink 的组件栈有哪些
自下而上,每一层分别代表:Deploy 层:该层主要涉及了 Flink 的部署模式,在上图中我们可以看出,Flink 支持包括 local、Standalone、Cluster、Cloud 等多种部署模式。Runtime层:Runtime 层提供了支持 Flink 计算的核心实现,比如:支持分布式 Stream 处理、JobGraph到 ExecutionGraph 的映射、调度等等,为上层 API 层提供基础服务。API 层:API 层主要实现了面向流(Stream)处理和批(Batch)处理 API,其中面向流处理对应 DataStream API,面向批处理对应 DataSet API,后续版本,Flink 有计划将 DataStream 和 DataSet API 进行统一。Libraries 层:该层称为 Flink 应用框架层,根据 API 层的划分,在 API 层之上构建的满足特定应用的实现计算框架,也分别对应于面向流处理和面向批处理两类。面向流处理支持:CEP(复杂事件处理)、基于 SQL-like 的操作(基于 Table 的关系操作);面向批处理支持:FlinkML(机器学习库)、Gelly(图处理)。
3.Flink 的运行必须依赖 Hadoop 组件吗
Flink 可以完全独立于 Hadoop,在不依赖 Hadoop 组件下运行。但是做为大数据的基础设施,Hadoop 体系是任何大数据框架都绕不过去的。Flink 可以集成众多 Hadooop 组件,例如 Yarn、Hbase、HDFS 等等。例如,Flink 可以和 Yarn 集成做资源调度,也可以读写 HDFS,或者利用 HDFS 做检查点。
4.Flink 集群有哪些角色?各自有什么作用
Flink 程序在运行时主要有 TaskManager , JobManager , Client 三种角色。其中
JobManager 扮演着集群中的管理者 Master 的角色,它是整个集群的协调者,负责接收 Flink
Job,协调检查点,Failover 故障恢复等,同时管理 Flink 集群中从节点 TaskManager 。
TaskManager 是实际负责执行计算的 Worker ,在其上执行 Flink Job 的一组 Task ,每个
TaskManager 负责管理其所在节点上的资源信息,如内存、磁盘、网络,在启动的时候将资
源的状态向 JobManager 汇报。Client 是 Flink 程序提交的客户端,当用户提交一个 Flink 程
序时,会首先创建一个 Client,该 Client 首先会对用户提交的 Flink 程序进行预处理,并提
交到 Flink 集群中处理,所以 Client 需要从用户提交的 Flink 程序配置中获取 JobManager 的
地址,并建立到 JobManager 的连接,将 Flink Job 提交给 JobManager。
5.Flink 资源管理中 Task Slot
Flink 架构角色中我们提到,TaskManager 是实际负责执行计算的 Worker,TaskManager
是一个 JVM 进程,并会以独立的线程来执行一个 task 或多个 subtask。为了控制一个
TaskManager 能接受多少个 task,Flink 提出了 Task Slot 的概念。简单的说,TaskManager
会将自己节点上管理的资源分为不同的 Slot:固定大小的资源子集。这样就避免了不同 Job
的 Task 互相竞争内存资源,但是需要主要的是,Slot 只会做内存的隔离。没有做 CPU 的
隔离。
6.Flink 的基础编程模型
Flink 程序的基本构建是数据输入来自一个 Source,Source 代表数据的输入端,经过 Transformation 进行转换,然后在一个或者多个 Sink 接收器中结束。数据流(stream)就是一组永远不会停止的数据记录流,而转换(transformation)是将一个或多个流作为输入,并生成一个或多个输出流的操作。执行时,Flink 程序映射到 streaming dataflows,由流(streams)和转换操作(transformation operators)组成
.
7.Flink 集群规模
Flink 可以支持多少节点的集群规模?在回答这个问题时候,可以将自己生产环节中的集群规模、节点、内存情况说明,同时说明部署模式(一般是 Flink on Yarn),除此之外,用户也可以同时在小集群(少于 5 个节点)和拥有 TB 级别状态的上千个节点上运行 Flink任务。