1.什么是flink?
Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。Flink被设计在所有常见的集群环境中运行,以内存执行速度和任意规模来执行计算。
2.sparktreaming 和 strom 有啥区别?
Strom是实时计算
sparkStreaming是微批处理。
容错性和事务性 storm容错非常好。sparkstring和fink需要checkpoint
相比于storm ,spark和flink两个都支持窗口和算子,减少了不少的编程时间
flink可以流式计算 也可以使用sql只是没有开发完全
对于spark而言他的优势就是机器学习,如果我们的场景中对实时要求不高可以考虑spark,但是如果是要求很高就考虑使用flink,比如对用户异常消费进行监控,如果这个场景使用spark的话那么等到系统发现开始预警的时候(0.5s),罪犯已经完成了交易,可想而知在某些场景下flink的实时有多重要。
3.flink 和 sparktreaming 有啥区别?
在spark中,所有不同的API,例如DStream,Dataframe都是基于RDD抽象的。但是在flink中,Dataset和DataStream是同一个公用的引擎之上两个独立的抽象。所以你不能把这两者的行为合并在一起操作。
4.Flink 的重要特点?
事件驱动型
是一类具有状态的应用,它从一个或多个事件流提取数据,并根据到来的事件触发计算、状态更新或其他外部动作。比较典型的就是以kafka为代表的消息队列几乎都是事件驱动型应用。
流与批的世界观。
批处理的特点是有界、持久、大量,非常适合需要访问全套记录才能完成的计算工作,一般用于离线统计。
流处理的特点是无界、实时,无需针对整个数据集执行操作,而是对通过系统传输的每个数据项执行操作,一般用于实时统计。
分层api
最底层级的抽象仅仅提供了有状态流,它将通过过程函数被嵌入到DataStreamApi中。底层过程函数与DataStream API相集成,使其可以对某些特定的操作进行底层的抽象,它允许用户可以自由地处理来自一个或多个数据流的事件,并使用一致的容错的状态。除此之外,用户可以注册事件时间并处理时间回调,从而使程序可以处理复杂的计算。
实际上,大多数应用并不需要上述的底层抽象,而是针对核心 API(Core APIs) 进行编程,比如 DataStream API(有界或无界流数据)以及 DataSet API(有界数据 集)。这些API为数据处理提供了通用的构建模块,比如由用户定义的多种形式的转换(transformations),连接(joins),聚合(aggregations),窗口操作(windows) 等等。DataSetAPI为有界数据集提供了额外的支持,例如循环与迭代。这些API处理的数据类型以类(classes)的形式由各自的编程语言所表示。 Table API 是以表为中心的声明式编程,其中表可能会动态变化(在表达流数据 时)。Table API 遵循(扩展的)关系模型:表有二维数据结构(schema)(类似于 关系数据库中的表),同时 API 提供可比较的操作,例如 select、project、join、group-by、 aggregate 等。Table API程序声明式地定义了什么逻辑操作应该执行,而不是准确地确定这些操作代码的看上去如何。尽管TableAPI可以通过多种类型的用户自定义函数(UDF)进行扩展,其仍不如核心API更具表达能力,但是使用起来却更加简洁(代码量更少)。除此之外, Table API 程序在执行之前会经过内置优化器进行优化。 你可以在表与 DataStream/DataSet 之间无缝切换,以允许程序将 Table API 与 DataStream 以及 DataSet 混合使用。 Flink提供的最高层级的抽象是SQL。这一层抽象在语法与表达能力上与TableAPI类似,但是是以SQL查询表达式的形式表现程序。SQL 抽象与 Table API交互密切,同时 SQL 查询可以直接在 Table API 定义的表上执行。 目前 Flink 作为批处理还不是主流,不如 Spark 成熟,所以 DataSet 使用的并不 是很多。Flink Table API和 Flink SQL 也并不完善,大多都由各大厂商自己定制。所以我们主要学习DataStreamAPI的使用。实际上Flink作为最接近GoogleDataFlow模型的实现,是流批统一的观点,所以基本上使用 DataStream 就可以了。
5.什么是有界流和无界流?
无界数据流:有一个开始但是没有结束,它们不会在生成时终止并提供数据,必须连续处理无界流,也就是说必须在获取后立即处理event。对于无界数据流我们无法等待所有数据都到达,因为输入时无界的,并且在任何时间点都不会完成。处理无界数据通常要求以特定顺序获取event。以便能够推断结果完整性。
有界数据流:有明确的定义的开始和结束,可以在执行任何计算之前通过获取所有数据来处理有界流,处理有界流不需要有序获取,因为可以始终对有界数据集进行排序,有界流的处理也称为批处理。
6.Flink的其他特点?
支持事件事件和处理时间语义
精确一次的状态一致性保证
低延迟,每秒处理数百万个时间,毫秒级延迟。
与众多常用存储系统的连接
高可用,动态扩展,实现7*24小时全天候运行
7.Flink 组件?
作业管理器
任务管理器
资源管理器
分发器
8.jobManager作用?
- 控制一个应用程序执行的主进程,也就是说,每个应用程序都会被一个不同的JobManager所控制执行。
- jobManager会先接收到要执行的应用程序,每个应用程序会包括:作业图、逻辑数据流图和打包乐所有的类、库和其他资源的jar包。
- jobManager会把jobGraph转换成一个物理层面的数据流图,这个图被叫做执行图,包含了所有可以并发执行的任务。
- jobManager会向资源管理器请求执行任务必要的资源,也就是任务管理器上的插槽。一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的taskManager上。而在运行过程中,jobmanager会负责所有需要中央协调的操作,比如说检查点的协调
9.jobManager收到的应用程序包含哪些?
作业图、逻辑数据流图和打包了所有的类、库和其他资源的JAR包。
10.taskManager作用?
- flink中的工作进程中。通常在flink中会有多个taskManager运行,每一个taskManager都包含了一定数量的插槽(slots)。插槽的数量限制了TaskManager能够执行的任务数量。
- 启动之后,taskmanager会向资源管理器注册它的插槽;收到资源管理器的指令后,taskmanager就会将一个或者多个插槽提供给jobmanager调用。jobmanager就可以向插槽分配任务(tasks)来执行了。
- 在执行过程中,一个taskmanager可以跟其他运行同一应用程序的taskmanager交换数据。
11.taskManager执行任务的数量由什么来决定的?
slots
12.resourceManager作用?
- 主要负责管理任务管理器的插槽,TaskManager插槽是Flink中定义的处理资源单元。
- flink为不同的环境和资源管理工具提供了不同资源管理器,比如YARN、Mesos、K8s,以及standalone部署。
- 当jobManager申请插槽资源时,ResourceManager会将有空闲插槽的TaskManager分配给JobManager。如果ResourceManager没有足够的插槽来满足JobManager的请求,它还可以向资源提供平台发起会话,以提供启动TaskManager进程的容器。
13.flink的资源单元? taskManager的slot
taskmanager的slot
14.分发器的作用? - 可以跨作业运行,它为应用提交提供了REST接口。
- 当一个应用被提交执行时,分发器就会启动并将应用移交给一个JobManager。
- Dispatcher也会启动一个Web Ui,用来方便地展示和监控作业执行的信息。
- Dispatcher在架构中可能并不是必需的,这取决于应用提交运行的方式。
15.总结任务提交流程? - 提交应用(app ->dispatcher)
- 启动并提交任用(dispatcher -> jobmanager)
- 请求slots(jobmanager -> ResourceManager)
- 启动(resoucemanager -> taskmanager)
- 注册slots(taskmanger -> resourcemanager)
- 发出提供slot的指令( resoucemanger -> taskmanager)
- 提供slots( taskmanager -> jobmanager )
- 提交要在slots中执行的任务( jobmanager -> taskmanager)
- 交换数据()
16.flink的应用程序包含几部分?
所有的flink程序都是由三部分的:source、transformation和sink
source负责读取数据源,transformation利用各种算子进行处理加工,sink负责输出
17.flink的执行图分为几层?
streamGraph ->JobGraph -> ExecutionGraph ->物理执行图 - streamGraph:
是根据用户通过streamAPI编写的代码生成的最初的图。用来表示程序的拓扑结构。 - jobGraph:
StreamGraph经过优化后生成了JobGraph,提交给JobManager的数据结构。主要的优化为,将多个符合条件的节点缠在一起作为一个节点 - ExecutionGraph:jobManager根据JobGraph生成ExecutionGraph。ExecutionGraph是JobGraph的并行化版本,是调度层最核心的数据结构。
- 物理执行图:JobManager根据ExecutionGraph对Job进行调度后,在各个TaskManager上部署Task后形成的“图”,并不是要给具体的数据结构。
18.算子之间数据传输的形式? - One-to-one:stream维护者分区以及元素的顺序(比如source和map之间)。这就意味着map算子的子任务看到的元素的个数以及顺序跟source算子的子任务生产的元数的个数、顺序相同。map、fiter、flatmap等算子都是one-to-one的对应关系
- Redistributing:stream的分区会发生改变。每一个算子的子任务依据所选择的transformation发送数据到不同的目标任务。例如:keyby基于hashCode重分区、而broadcast和rebalance会随即重新分区,这些算子都会引起redistribute过程,而redistribute过程类似于spark中的shuffle过程。
19.flink的任务链? 任务链的要求?
flink采用了一种称为任务链的优化技术,可以在特定条件下减少本地通信的开销。为了满足任务链的要求,必须将两个或多个算子设为相同的并行度,并通过本地转发的方式(local forward)进行连接。
相同并行度的one-to-one操作,flink这样相连的算子链接在一起形成一个task,原来的原子成为里面的subtask。
并行度相同、并且是one-to-one操作,两个条件缺一不可