从疑问入手了解Flink
Flink网上的资料比起Spark来说是少很多的,我在学习的过程中有一些疑问,然后从疑问入手学习并参考官网文档和阿里的云栖社区总结。
批处理和流处理的区别?
最大的区别就是二者对流计算认知的不同。微批处理模式Micro-Batching计算模型可以理解成是"流是批的特例",而纯流处理模式Native Streaming则是“批是流的特例”。MapReduce是批处理、Spark是为微批处理、Flink是纯流式处理。当然Flink支持的批处理是在Native Streaming模式的框架上实现的。
Flink会在什么地方触发容错机制?
在有大量机器的集群中,其中一个节点计算错误或者宕机可能会导致程序执行失败,或者得到错误的结果。目前Flink支持两种数据容错机制分别是:At Least Once至少消费一次,可能存在重复消费和Exactly Once:精确一次。同时Flink容错可以归纳为三种场景
-
系统内部容错时 自身算子
Flink基于自身的CheckPointing机制实现了刚提到的两种容错模式。
-
读取外部数据源时 Source
一般外部Source都支持 At Least Once模式,如果希望有Exactly Once模式那么就需要对应外部数据源有记录position的支持,可以记录当前读取位置,并且支持根据位置进行读取类似Kafka。
-
落地到外部数据源时 Sink
同外部数据源Source
Flink什么时候用批处理什么时候用流处理
Flink在网络传输层上有两种模式:PIPELINED模式即一条数据处理完立刻传输给下一个节点处理和BATCH模式即将数据缓存起来等所有数据处理完后在传输到下个节点处理。
我认为一般情况如Map和Count为了更低的延迟和性能都是PIPELINED模式更加高效,但如果要有Sort、Merge、Join这类操作批处理会使用BATCH模式。
Flink中的Table/SQL api到底是如何转换成DataStream和DataSet的呢?
Flink是使用的Apache开源的Calcite项目做SQL解析的。入门可参考文章
Calcite通过Java CC将SQL解析成AST树,经过校验、优化后进行执行,将物理执行计划转化成Flink可执行的程序。
引用云栖社区的一张图
算子如何分类?
看完官网有很多概念比如Scalar Function、Table Function、Aggregate Function、UDF、UDTF、UDAF等等,他们的关系需要缕一下,其实指的都是不同层面上的相同意思。
可以先把Flink的算子分为单流操作和多流操作。
多流操作 - 可以分为UNION-将字段一致的数据流合并和 JOIN-将数据类型不一致的的数据流连接成一个数据流。多流操作的目的都是将多个数据流合并成一个数据流再进行操作。
单流操作 - 按输入输出归类
类型 | 输入 | 输出 | Table/SQL算子 | DataStream/DataSet算子 |
---|---|---|---|---|
Scalar Function | 1 | 1 | Built-in & UDF | Map |
Table Function | 1 | N(N>=0) | Built-in & UDTF | FlatMap |
Aggregate Function | N(N>=0) | 1 | Built-in & UDAF | Reduce |
Flink的时间类型有什么?
- ProcessingTime 算计开始计算的时间,Flink默认时间类型,效率最高,延迟最低,因为是算子执行的时间所以在分布式数据中多次运行会每次都不一致。
- IngestionTime 是数据进入Flink框架时间,相对于ProcessingTime来说较为稳定,因为数据源进入只记录一次。
- EventTime 数据在生产后并在进入Flink之前记录的时间,如果要防止window中的出现的乱序问题用Watermark解决时,必须设定时间为Event time。