Apache Flink 是一个分布式处理引擎,用于对无界和有界数据流有状态计算。
Flink可以运行在各种常见的资源管理器中,在内存中快速计算各种规模的数据。
数据模型
Flink所有数据都看成事件流。事件流被分成有界流和无界流。
- 有界流:有定义好的开始和结束边界。Flink在将所有数据加载上来之后一起处理,这些数据不需要保证有效,可以在处理之后进行排序。这就是Flink中的批处理。
- 无界流:数据流只有开始没有结束,数据会源源不断进来。由于没有结束,所以需要持续对数据进行处理,并且数据符合特定的顺序。这就是Flink中的实时处理。
Flink把批处理看成是一种特殊的流处理。所以批流可以使用同一的处理。
时间处理
Flink中支持三种时间:
- Event Time: 数据生成时间
- Ingestion Time: 数据进入摄入时间
- Processing Time: Flink机器时间
Flink支持基于EventTime的时间处理,并且支持Watermarks过滤迟到数据。
Flink APIs
Flink提供了不同等级的API:
- Stateful Stream Processing: 允许用户自由处理流的事件,并提供一致的容错状态。可以做一些复杂的自定义处理。
- Core APIs: 提供了转换,连接,聚合,窗口以及状态等API。
- Table API: 类似于数据库中的表,抽象了许多对表处理的API。
- SQL: 可以使用标准的SQL处理数据。
集群架构
- Client: 将代码生成dataflow graph,并提交给JobManager。
- JobManager: 管理集群,分配资源,实现高可用
- TaskManager: 运行Task
运行模式
DataFlows
Source: Collections/Socket/File(hdfs local)/GenerateSequence/ES/Kafka…
Transformation:
- 基于单挑记录: filter/map/flatmap
- 基于窗口:
- 非keyedStream: timeWindowAll/countWindowAll/windowAll
- keyedStream: timeWindow/countWindow/window
- 合并多条流:
- 非keyedStream: union/join/connect/coGroup
- keyedStream: interval join
- 拆分单条流: split/sideOutput
- 物理分组操作:目的是为了做数据分发分配
dataStream.global(): 将上游的数据全部发送到下游一个task中
dataStream.broadcast(): 将上游的数据全部发送到下游所有的task中
dataStream.forward(): 当上下游的并发度一致的时候,一对一的发送数据
dataStream.shuffle(): 随机打乱数据发送
dataStream.rebalance(): 采用轮训的方式发送数据
dataStream.recale(): 本地轮训的方式发送数据
dataStream.partitionCustom(): 自定义发送
复制代码
Sink: File/ES/Kafka…
DataFlows计算模型是事件触发,在一个分区中,某一个节点计算完一个事件之后,事件就可以发送到下一个节点计算,不用等上一个节点全部计算完才能计算下一个节点。相较于这个,Spark的RDD在一个分区中的上游RDD所有数据全部计算完毕,才能进入下一个RDD的计算。
并行计算
有状态计算
Flink各个分区计算会在本地生成状态数据,计算的时候会获取状态并更新。
状态始终在本地访问,这有助于Flink实现高吞吐量和低延迟。可以选择将状态保留在JVM堆上,或者如果状态太大,则保留在磁盘上。
Snapshots
Flink能够通过状态快照和流重放的组合提供容错的、仅一次的语义。
这些快照捕获分布式计算的整个状态,将偏移量记录到输入队列中,以及在整个作业图中记录到该点为止由于摄取数据而产生的状态。 当发生故障时,可以从snapshot中恢复数据。
基于JVM的内存管理
- 应用可以超过主内存的大小限制,减少垃圾回收的开销
- 对象系列化二进制存储
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END