本节是Flink的一个简单入门介绍,主要focus在四点:
- continuous processing of streaming data
- event time
- stateful stream processing
- state snapshots
1. Stream Processing
数据总是以流的形式产生的,但分析的时候我们可以选择处理有界的数据流,也可以选择处理无界的数据流。批处理是处理有界流的一种方式,在分析之前需要输入完整的数据集。而流处理的输入和处理过程是没有结束的。在Flink里,流数据从一个或多个数据源通过用户定义的operator, 流出到一个或多个sink。

通常一个transformation会对应一个operator,但有时一个transformation也需要多个operator共同完成。
parallel dataflows
flink里的程序一般都是分布式的并发的。在执行过程中,一个stream被分成多个stream partitions, 而一个operator会有一个或多个operator subtask, subtasks之间彼此独立,在不同的线程甚至是机器上运行。subtasks的数量就是一个operator的并发数量,一个程序里不同的operator有不同的并发数。

两个operator之间传输stream有两种方式:
- one-to-one: source到map就是这种模式,流的分区和元素的顺序都会保持不变
- redistributing: map到keyBy是这种模式,流会被重新分区,每个operator会根据transformation的逻辑把数据传输到对应的目标subtask上去。只有同一个partition中到同一个目标subtask中的数据会保持顺序一致。如都是来源于map[1]且都到keyBy[1]的数据顺序不会改变。
2. Timely Stream Processing
有时候我们会希望像处理当前的数据一样处理历史数据,或者希望按照数据产生的时间进行处理而不是事件到达程序的时间,这时候我们需要用到数据流中标记事件时间的时间戳。
3. Stateful Stream Processing
Flink是有状态的,这意味着Flink可以基于累计的状态值对一个事件进行不同的逻辑处理。而Flink里一个operator的subtask是并发独立地运行的,所以一个stateful operator的并发实例应该共享一个state的key-value store, 而每个实例可能还需要维护自己的特定key的state, 这些state存储在本地。
4. Fault Tolerance via State Snapshots
Flink通过state快照和stream重播来实现容错。需要记住整个application的state, 已经当前处理到stream的什么位置,以便回到特定点重新开始运行。