前言
Flink 是一种流式计算框架,为什么我会接触到 Flink 呢?
目前在做的项目是平台业务的告警部分,负责告警这边需要从 kafka topic 里面实时读取到终端数据,并将读取到的终端数据做一些 聚合/转换/计算 等操作,然后将计算后的结果与告警规则的阈值进行比较,然后做出相应的告警措施。画了个简单的图如下:
Flink是什么?
- 批处理 (处理历史数据集)
- 流处理 (处理实时数据流)
- 事件监控 (监控事件的服务)
- Flink APIS
- Flink 基石 (CheckPoint\State\Sindow\Time)
Flink 数据流编程模型
抽象级别
程序与数据流
1、Source: 数据源,Flink 在流处理和批处理上的 source 大概有以下4类:基于本地集合的 source、基于文件的 source、基于网络套接字的 source、自定义的 source。自定义的 source 常见的有 Apache kafka、RabbitMQ、Twitter Streaming API、Redis 等,也可以自己定义 source。
2、Transformation Operators:数据转换的各种算子,有 Map / FlatMap / Filter / KeyBy / Reduce / Fold / Aggregations / Window / WindowAll / Union / Window join / Split 等,算子很多,可以将数据转换计算成你需要的数据。
3、Sink:接收器,Flink 将转换计算后的数据发送的地点 ,你可能需要存储下来,Flink 常见的 Sink 大概有如下几类:写入文件、打印出来、写入 socket 、自定义的 sink 。自定义的 sink 常见的有 Apache kafka、Redis、RabbitMQ、MySQL、ElasticSearch、Apache Cassandra、Hadoop FileSystem 等,也可自己定义 sink。
窗口
窗口主要有两种,一种基于时间(Time-based Window),一种基于数量(Count-based Window)
- 滚动窗口
- 滑动窗口
- 会话窗口
一个Flink窗口应用的大致结构如下图:
为什么选择 Flink?
前言有说到,做的是平台业务的告警,需要对实时数据进行流处理,flink相对于spark更适合实时流计算(Spark的技术理念是使用微批来模拟流的计算,基于Micro-batch,数据流以时间为单位被切分为一个个批次,通过分布式数据集RDD进行批量处理,是一种伪实时。
而Flink是基于事件驱动的,它是一个面向流的处理框架, Flink基于每个事件一行一行地流式处理,是真正的流式计算. 另外他也可以基于流来模拟批进行计算实现批处理,所以他在技术上具有更好的扩展性)
Flink 基本工作原理(分布式运行)
Flink在运行中主要有三个组件组成,JobClient,JobManager 和 TaskManager。主要工作原理如下图:
用户首先提交Flink程序到JobClient,经过JobClient的处理、解析、优化提交到JobManager,最后由TaskManager运行task。