Flink 常见面试题
1、Flink 的四大特征(基石)
checkpoin基于Chandy-Lamport算法实现了分布式一致性快照提供了一致性的语义
state丰富的StateAPI
time实现了Watermark机制,乱序数据处理,迟到数据容忍
window开箱即用的滚动,滑动会话窗口,以及灵活的自定义窗口
2、Flink 中都有哪些 Source,哪些 Sink,哪些算子(方法)
预定义的Source
基于本地的Source(Collection-based-source)
基于文件的Source(File-based=source)
基于网络套接字(socketTextStream)
自定义的Source
实现接口
SourceFunction并行度只能=1
ParallelSourceFunction并行度可以>=1
实现类
RichSourceFunction多功能非并行数据源,并行度只能=1
RichParallelSourceFunction多功能并行数据源(并行度能够>=1) --类 【建议使用的】
Flink中常见的Sink
Print打印到控制台
WriteAsText以文本格式输出
WriteAsCsv以csv格式输出
writeUsingOutputFormat 以指定的格式输出
writeToSocket 输出到网络端口
自定义连接器(addSink)
继承RichSinkFunction类
调用FlinkKafkaProducer
调用JdbcSink
算子(方法)
map,flatmap、keyby、reduce、filter、CountWindow、aggregate、sum、min、max、apply、process
3、什么是侧道输出流,有什么用途
侧输出可以看作是操作符的一个额外的输出通道,除了主输出流之外,操作符还可以产生一个或多个侧输出流。这些侧输出流可以被路由到不同的下游操作符,用于进一步处理。侧输出是通过 OutputTag 来实现的。OutputTag 是一个类,它用于标记一个特定的侧输出。使用时,你需要为每个侧输出创建一个 OutputTag 实例,并在操作符中使用它来指定数据流向哪个侧输出。
4、Flink 中两个流如何合并为一个流
Union可以合并多个同类型的流(合并的datastream的类型必须是一致的,不会去重)
Connect可以连接两个不同类型的流(最后需要吃力后再输出,不同类型的数据可以分开处理)map(new CoMapFunction<String, Long, String>() {})和process(new CoProcessFunction<String, Long, String>() {})
5、Flink 中两个流如何 join
join
滚动/滑动窗口join
coGroup
可以在apply方法中实现左右连接,内连接
intervalJoin
6、Flink 中都有哪些 window,什么是滑动,滚动窗口
不分组窗口Non-Keyed Window(windowAll不对数据流进行分组)它们的原理和操作与Keyed Window类似,唯一的区别在于所有数据将发送给下游的单个实例,或者说下游算子的并行度为1。
分组窗口Keyed Window
CountWindow:按照指定的数据条数生成一个Window,与时间无关。
滚动计数窗口,每隔N条数据,统计前N条数据
滑动计数窗口,每隔N条数据,统计前M条数据
TimeWindow:按照时间生成Window。(重点)
滚动时间窗口,每隔N时间,统计前N时间范围内的数据,窗口长度N,滑动距离N
滑动时间窗口,每隔N时间,统计前M时间范围内的数据,窗口长度M,滑动距离N
什么是滑动什么是滚动
滚动:窗口长度= 滑动距离
滑动:窗口长度>滑动距离
7、flink 中都有哪些时间语义,对于 event_time 中数据迟到的处理(数据乱序)
EventTime:事件(数据)时间,是事件/数据真真正正发生时/产生时的时间
IngestionTime:摄入时间,是事件/数据到达流处理系统的时间
ProcessingTime:处理时间,是事件/数据被处理/计算时的系统的时间
数据迟到的处理
通过 assignTimestampsAndWatermarks 来设置水位线时间,让短时间内大量迟到的数据可以进入对应的窗口,当水位线时间漫过窗口时间,开始触发窗口操作。
通过 allowedLateness 来设置延迟时间,让在延迟时间内迟到的数据可以进入窗口计算。
通过 sideOutputLateData 来设置侧输出流进行兜底,让更晚到的数据进入侧输出流中。
8、flink 中的状态指的是什么?有哪些状态,你使用过哪些状态,哪个项目使用到了状态
状态指的就是历史数据(有状态计算和无状态计算)
状态分为托管状态(Managed State)和原生状态(Raw State),对Managed State继续细分,它又有两种类型:Keyed State和Operator State。
使用过Managed State下的keyed State 套牌车
9、flink 中 checkpoint 是什么,如何设置。
State:状态,是Flink中某一个Operator在某一个时刻的状态,如maxBy/sum,注意State存的是历史数据/状态,存在内存中。
Checkpoint:快照点, 是Flink中所有有状态的Operator在某一个时刻的State快照信息/存档信息。
一句话概括: Checkpoint就是State的快照。
代码中手动设置
集群跑jar包运行命令设置
手动保存checkPoint
1、使用 ctrl+c是不能停止flink任务的,需要在8081界面进行canle job
2、使用命令手动保存checkPoint 此时保存快照且不会停止任务
flink savepoint 79f53c5c0bb3563b6b6ed3011176c411 hdfs://bigdata01:9820/flink/checkpoint
3、停止的时候,保存一次快照
flink stop --savepointPath hdfs://bigdata01:9820/flink/checkpoint c81bb1546866566ce4e16181d0c52be8
4、停止一个任务
flink stop 152e493da9cdeb327f6cbbad5a7f8e41 job编号
79f53c5c0bb3563b6b6ed3011176c411 job编号
手动保存时,不需要在代码中设置有关checkpoint相关的配置
手动保存和自动保存的结果文件是不一样的
flink run -c com.bigdata.day06._01CheckPointDemo -s hdfs://bigdata01:9820/flink/checkpoint/bf416df7225b264fc34f8ff7e3746efe/chk-603 /opt/app/FlinkDemo-1.0-SNAPSHOT.jar
-s 表示checkPoint的文件地址
10、flink 中的重启策略 (流式计算中的重启策略)
重启策略的意义:流式数据是不可能停止的,假如有一条错误数据导致程序直接退出,后面的大量数据是会丢失的,对公司来讲,意义是重大的,损失是惨重的。
11、什么是维表 join,如何实现,你在哪个项目中使用过维表 join
所谓的维表Join: 进入Flink的数据,需要关联另外一些存储设备的数据,才能计算出来结果,那么存储在外部设备上的表称之为维表,可能存储在mysql也可能存储在hbase 等。维表一般的特点是变化比较慢。
预加载维表
通过定义一个类实现RichMapFunction,在open()中读取维表数据加载到内存中,在kafka流map()方法中与维表数据进行关联。(如果表经常变化,而且表的数据量比较大的话,这个就不太ok,还可以不在open()中读取数据只建立查询的连接,在map()中再执行查询,可以适应表数据变化的情况)
将维表数据存储在Redis、HBase、MySQL等外部存储中,实时流在关联维表数据的时候实时去外部存储中查询
优点:维度数据量不受内存限制,可以存储很大的数据量。
缺点:因为维表数据在外部存储中,读取速度受制于外部存储的读取速度;另外维表的同步也有延迟。
热存储维表
使用缓存来存储一部分常访问的维表数据,以减少访问外部系统的次数,比如使用Guava Cache。
相当于把数据按照一定数量和一定的时间间隔来查询更新和存储到缓存中,每次需要用到的时候先去缓存查找如果没有在去数据库查找,
12、flinksql 如何读取 kafka 或者 mysql 的数据。
table转stream和stream转table