Flink系列问题
针对Flink的一些知识问答
简单介绍一下Flink
1 | Apache Flink是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态计算。可部署在各种集群环境,对各种大小的数据规模进行快速计算。 |
Flink相比传统的Spark Streaming有什么区别?和Spark中的Structured Streaming相比呢?Flink相比Spark Streaming和Storm有什么优势?
1 | # Flink相比传统的Spark Streaming有什么区别? |
Flink的组件栈是怎么样的?
1 | # API & Libraries 层 |
Flink的基础编程模型了解吗?
1 | Flink 程序的基础构建单元是流(streams)与转换(transformations)。DataSet API 中使用的数据集也是一种流。数据流(stream)就是一组永远不会停止的数据记录流,而转换(transformation)是将一个或多个流作为输入,并生成一个或多个输出流的操作。 |
说说Flink架构中的角色和作用?
1 | Flink是主从架构模式,Flink集群中有主节点和从节点,另外在集群之外还有客户端节点,在这些节点 |
说说Flink中常用的算子?用过哪些?
1 | map |
Flink中的分区策略有哪几种?
1 | GlobalPartitioner,GLOBAL分区。将记录输出到下游Operator的第一个实例。 |
Flink的并行度有了解吗?Flink中设置并行度需要注意什么?
1 | Flink程序由多个任务(Source、Transformation、Sink)组成。任务被分成多个并行实例来执行,每个并行实例处理任务的输入数据的子集。任务的并行实例的数量称之为并行度。 |
Flink支持哪几种重启策略?分别如何配置?
1 | 重启策略种类: |
Flink的分布式缓存有什么作用?如何使用?
1 | Flink提供了一个分布式缓存,类似于hadoop,可以使用户在并行函数中很方便的读取本地文件,并把它放在taskmanager节点中,防止task重复拉取。 |
Flink中的广播变量,使用广播变量需要注意什么事项?
1 | 在Flink中,同一个算子可能存在若干个不同的并行实例,计算过程可能不在同一个Slot中进行,不同算子之间更是如此,因此不同算子的计算数据之间不能像Java数组之间一样互相访问,而广播变量Broadcast便是解决这种情况的。 |
Flink中对窗口的支持包括哪几种?说说他们的使用场景
1 | # 窗口类型 |
Flink 中的 State Backends是什么?有什么作用?分成哪几类?说说他们各自的优缺点?
1 | Flink流计算中可能有各种方式来保存状态: |
Flink中的时间种类有哪些?各自介绍一下?
1 | Flink中的时间与现实世界中的时间是不一致的,在flink中被划分为事件时间,摄入时间,处理时间三种。 |
WaterMark是什么?是用来解决什么问题?如何生成水印?水印的原理是什么?
1 | Watermark是Apache Flink为了处理EventTime 窗口计算提出的一种机制,本质上也是一种时间戳。 |
Flink的table和SQL熟悉吗?Table API和SQL中TableEnvironment这个类有什么作用?
1 | TableEnvironment是Table API和SQL集成的核心概念。它负责: |
Flink如何实现SQL解析的呢?
1 | StreamSQL API的执行原理如下: |
Flink是如何做到批处理与流处理统一的?
1 | Flink设计者认为:有限流处理是无限流处理的一种特殊情况,它只不过在某个时间点停止而已。Flink通过一个底层引擎同时支持流处理和批处理。 |
Flink中的数据传输模式是怎么样的?
1 | 在一个运行的application中,它的tasks在持续交换数据。TaskManager负责做数据传输。 |
Flink的容错机制知道吗?
1 | Flink基于分布式快照与可部分重发的数据源实现了容错。用户可自定义对整个Job进行快照的时间间隔,当任务失败时,Flink会将整个Job恢复到最近一次快照,并从数据源重发快照之后的数据。 |
Flink中的分布式快照机制是怎么样的?
1 | Flink容错机制的核心就是持续创建分布式数据流及其状态的一致快照。这些快照在系统遇到故障时,充当可以回退的一致性检查点(checkpoint)。Lightweight Asynchronous Snapshots for Distributed Dataflows 描述了Flink创建快照的机制。此论文是受分布式快照算法 Chandy-Lamport启发,并针对Flink执行模型量身定制。 |
Flink是如何实现Exactly-once的?
1 | Flink通过状态和两次提交协议来保证了端到端的exactly-once语义。 |
Flink的Kafka-connector是如何做到向下兼容的呢?
1 | 在新的连接器中,Flink提供了一个基础connector模块,它是实现所有connector的核心模块,所有的connector都依赖于基础connector。 |
Flink中的内存管理是如何做的?
1 | Flink 并不是将大量对象存在堆上,而是将对象都序列化到一个预分配的内存块上,这个内存块叫做 MemorySegment,它代表了一段固定长度的内存(默认大小为 32KB),也是 Flink 中最小的内存分配单元,并且提供了非常高效的读写方法。每条记录都会以序列化的形式存储在一个或多个MemorySegment中。 |
Flink中的序列化是如何做的?
1 | Flink实现了自己的序列化框架,Flink处理的数据流通常是一种类型,所以可以只保存一份对象Schema信息,节省存储空间。又因为对象类型固定,所以可以通过偏移量存取。 |
Flink中的RPC框架选型是怎么样的?
1 | 对于Flink中各个组件(JobMaster、TaskManager、Dispatcher等),其底层RPC框架基于Akka实现。 |
Flink在使用Window时出现数据倾斜,你有什么解决办法?
1 | 注意:这里window产生的数据倾斜指的是不同的窗口内积攒的数据量不同,主要是由源头数据的产生速度导致的差异。 |
Flink SQL在使用Groupby时出现热点数据,如何处理?
1 | 数据倾斜: |
现在我有Flink任务,delay极高,请问你有什么调优策略?
1 | 首先要确定问题产生的原因,找到最耗时的点,确定性能瓶颈点。 |
Flink是如何处理反压的?和Spark有什么区别?Storm呢?
1 | Flink 没有使用任何复杂的机制来解决反压问题,因为根本不需要那样的方案!它利用自身作为纯数据流引擎的优势来优雅地响应反压问题。 |
Operator Chains(算子链)这个概念你了解吗?Flink是如何优化的?什么情况下Operator才会chain在一起?
1 | 为了更高效地分布式执行,Flink会尽可能地将operator的subtask链接(chain)在一起形成task。每个task在一个线程中执行。将operators链接成task是非常有效的优化:它能减少线程之间的切换,减少消息的序列化/反序列化,减少数据在缓冲区的交换,减少了延迟的同时提高整体的吞吐量。 |