目录
1、Flink是什么
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。Flink以数据并行和流水线方式执行任意流数据程序,Flink的流水线运行时系统可以执行批处理和流处理程序。此外,Flink的运行时本身也支持迭代算法的执行。从部署上讲,Flink支持local模式、集群模式(standalone集群或者Yarn集群)、云端部署。
-----------------Flink官网
Flink提供了多种抽象数据Api:
DataSet API, 对静态数据进行批处理操作,将静态数据抽象成分布式的数据集,用户可以方便地使用Flink提供的各种操作符对分布式数据集进行处理,支持Java、Scala和Python。
DataStream API,对数据流进行流处理操作,将流式的数据抽象成分布式的数据流,用户可以方便地对分布式数据流进行各种操作,支持Java和Scala。
Table API,对结构化数据进行查询操作,将结构化数据抽象成关系表,并通过类SQL的DSL对关系表进行各种查询操作。Flink 与 Hive 集成的功能会在 1.9.0 版本中作为试用功能发布,用户可以通过 Table API 或者 SQL Client 的模式与 Hive 进行交互。10版本在写这篇文章时发布不久,完善了hive的部分,但是大多数公司生产中使用hive还是sparksql更加稳妥,期待未来Flink这方面做得更好。
2、Flink的特性、优点
- 流式模型,高吞吐、低延时
- 丰富的时间语义,支持 Event Time
- 良好的乱序数据处理能力
- 高度灵活的窗口,Flink 支持滚动窗口,滑动窗口,统计窗口,session 窗口,以及数据驱动的窗口
- exactly-once 语义
- 带反压的连续流模型,Flink streaming 在运行时有着天然的流控:慢的数据 sink 节点会反压(backpressure)快的数据源(sources)
- 完善的容错机制
- 批流api统一,且Api设计合理功能强大
- 完善的状态编程
- 内存管理,Flink在 JVM 中实现了自己的内存管理。
2.1、流式模型,高吞吐、低延时
我们知道spark所有的高级api都是基于RDD的,而RDD本质上是批处理,SparkStreaming严格上来说是微批处理更合适,而Flink是严格的流式处理,基于事件驱动的,理论上来说可以每个event都触发逻辑计算;因此它具有更高的吞吐和更低的延迟,在反欺诈、异常检测、金融风控防盗刷等要求延时极低的业务场景非常适用。
2.2、丰富的时间语义,支持 Event Time
在流处理中,时间是一个非常核心的概念,是整个系统的基石。事件发生时有触发时间、该事件到达Flink时有数据到达的时间、数据被真正处理时有处理时间。这几个时间往往都是有延时的不可能是同一个时间点。
Flink支持三种时间语义:
- Event Time:事件发生的时间,如用户点击某个按钮时的时间
- Processing Time:事件被真正处理的时间,Flink的Task线程处理该数据的时间
- Ingestion Time:事件到达Flink Souce的时间,用户点击行为发送到kafka,kafka数据到达Flink的时间
Flink默认是ProcessingTime,如果想使用eventTime可以进行如下设置:
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
2.3、良好的乱序数据处理能力
这一部分请参考我之前的博客:Flink之watermark和allowedLateness区别
2.4、高度灵活的窗口
Flink 中 Window 可以将无限流切分成有限流,是处理有限流的核心组件,现在Flink 中 Window 可以是时间驱动的(Time Window),也可以是数据驱动的(Count Window)
- 滚动窗口:
翻滚时间窗口的窗口是固定的,比如设定一个1分钟的时间窗口,该时间窗口将只计算当前1分钟内的数据,而不会管前1分钟或后1分钟的数据。
- 滑动窗口
滑动窗口,顾名思义,该时间窗口是滑动的 - 计数窗口
Apache Flink 还提供计数窗口功能。如果计数窗口设置的为 100 ,那么将会在窗口中收集 100 个事件,并在添加第 100 个元素时计算窗口的值。 - session窗口
主要是根据活动的事件进行窗口化,他们通常不重叠,也没有一个固定的开始和结束时间。一个session window关闭通常是由于一段时间没有收到元素。在这种用户交互事件流中,我们首先想到的是将事件聚合到会话窗口中(一段用户持续活跃的周期),由非活跃的间隙分隔开。
2.5、exactly-once 语义
这一部分内容较多,请参考我得下面两篇博客
Flink状态一致性保证 checkpoint
Flink 状态一致性 exactly-once
2.6、带反压的连续流模型
3、标题
友情链接:
Flink之slot、并行度、graph优化
Flink之ProcessFunction API
Flink之聚合、WindowFunction
Flink之Trigger与Evictor
Flink之侧输出流和流的拆分