这是我参与「第四届青训营 」笔记创作活动的第二天
流计算与批计算的比较
| 特性 | 批计算 | 流计算 |
|---|---|---|
| 数据范围 | 有界数据 | 无界数据 |
| 任务执行 | 分批执行、有终止 | 全部执行、无终止 |
| 延时 | 小时级、天级 | 秒级、分钟级 |
| 数据场景 | 数据量超大数据、无法以流的形式交付 | 数据以流的形式交付 |
| 资源消耗 | 大 | 小 |
| 数据质量 | 要求低 | 要求高 |
| 业务场景 | 清算对账、报表生成、特征生成 | 欺诈检测、实时风控、实时推荐 |
| 关注点 | 可扩展性、吞吐、容错 | 可扩展性、延迟、容错、消息一致性、消息持久性 |
| 处理语义 | 仅有一次 | 至少一次、至多一次、仅有一次 |
| 代表引擎 | MR SPARK | Storm Spark streaming Flink Kafka streaming |
Flink核心理念
Flink与其他流计算引擎的最大区别,就是状态管理。
Flink提供了内置的状态管理,可以把工作时状态存储在Flink内部,而不需要把它存储在外部系统。这样做的好处:
- 降低了计算引擎对外部系统的依赖,使得部署、运维更加简单;
- 对性能带来了极大的提升。
Flink核心概念- DataStream
DataStream: Flink用类DataStream来表示程序中的流式数据。用户可以认为它们是含有重复数据的不可修改的集合(collection),DataStream中元素的数量是无限的。从图中我们可以发现,对DataStream可以使用一些算子,例如KeyBy这样的算子,对它进行处理转换之后,它会转换成另外一种数据流,也称为keyedstream。那么基于keyedstream,我们进一步可以使用窗口算子,这主要是Flink程序设计中对数据流的一些处理方式。
Flink核心概念- DataSet
DataSet : Flink系统可对数据集进行转换(例如,过滤,映射,联接,分组),数据集可从读取文件或从本地集合创建。结果通过接收器( Sink)返回,接收器可以将数据写入(分布式)文件或标准输出(例如命令行终端)
Flink程序
Flink程序由Source、Transformation和Sink三部分组成,其中Source主要负责数据的读取,支持HDFS、kafka和文本等;Transformation主要负责对数据的转换操作; Sink负责最终数据的输出,支持HDFS、kafka和文本输出等。在各部分之间流转的数据称为流( stream ) 。
Flink程序运行图
Flink是一种master-Slave架构,它在启动的时候就会产生了JobManger以及TaskManager。事实上在Flink程序中还包含两个组件,这两个组件一个叫resource manager,主要负责了资源的调度与管理,另外一个称为Dispatcher。主要是用来进行client,要把JobManager进行分发公布。 首先是用户提交Flink程序,这个Flink程序就会转换成逻辑数据流图。客户端接收到逻辑数据流图之后,然后连同jar包以及一些依赖包就会提交给了JobManger,JobManger接收到逻辑数据流图之后会转成物理数据流图,这个物理数据流图是真实的可执行的,能够具体的将任务放置在TaskManager上,在TaskManager中会将它所拥有的资源划分成一个一个的TaskSlot。每个TaskSlot实际上就相当于是jvm,它的一个具体的线程。每个TaskSlot占用了TaskManager的一部分资源,这里的资源主要是以内存进行划分的,TaskSlot不对cpu的资源进行划分,因此没有对cpu的资源进行隔离。