Flink 简介
# Flink 简介
# 初识 Flink
- Google: Google File System; BigTable; MapReduce
- Apache: HDFS; HBase; Hadoop
Apache Beam 写一套代码,可以运行在 Spark 和 Flink 的引擎上面

Apache Flink is a framework and distributed processing engine for stateful computations over unbounded and bounded data streams.
Apache Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行状态计算。
# 为什么选择 Flink
- 流数据更真实地反映了我们的生活方式
- 传统的数据架构是基于有限数据集的
- 我们的目标
- 低延迟(Spark Streaming 的延迟是秒级,Flink 延迟是毫秒级)
- 高吞吐(阿里每秒钟使用 Flink 处理 4.6PB,双十一大屏)
- 结果的准确性和良好的容错性(exactly-once)
# 哪些行业需要处理流数据
- 电商和市场营销
- 数据报表、广告投放、业务流程需要
- 物联网(IOT)
- 传感器实时数据采集和显示、实时报警,交通运输业(自动驾驶)
- 电信业
- 基站流量调配
- 银行和金融业
- 实时结算和通知推送,实时检测异常行为(信用卡盗卡)
# 传统数据处理架构
事务处理(OLTP)

分析处理(Hive) MySQL -> Sqoop -> Hive
- 将数据从业务数据库复制到数仓,再进行分析和查询(解耦)

# 有状态的流式处理

- 无状态的流式处理:Apache Kafka,不保存状态,FIFO 开窗口操作,缓存一段时间的数据的 offset
- 幂等性:无状态的,函数内部不保存状态
- 全局变量:有状态的
- web app 的 session,有状态
函数式编程,要求尽量无状态,纯函数(没有副作用)(如一些 IO 操作,分配内存)
纯函数:输入不变,无论运行多少次,输出都不变相当于幂等性
# 流处理的演变
lambda 架构(批处理 + 流处理,由 Twitter 提出) Do not Repeat Yourself:DRY
- 用两套系统,同时保证低延迟和结果准确
- 批处理:保证结果的准确性
- 流处理:保证低延迟

- 用两套系统,同时保证低延迟和结果准确
为何选择 Flink

事件时间,数据湖,实时数仓,docker,k8s
# Flink 的主要特点
事件驱动(Event-driven)
spark streaming 是 event-driven 吗?micro-batch
来一条数据(事件),触发一次算子的计算,才算事件驱动
后端的事件驱动的代表:netty,akka,goroutine,协程...
Spark SQL,Spark RDD前端:RxJs
基于流的世界观(流 / 批统一)
- 在 Flink 的世界观中,一切都是由流组成的,离线数据是有界的流; 实时数据是一个没有界限的流:这就是所谓的有界流和无界流

分层 API
- 越顶层越抽象,表达含义越简明,使用越方便
- 越底层越具体,表达能力越丰富,使用越灵活

# Flink 的其它特点
- 支持事件时间(event-time)和处理时间(processing-time)语义
- 精确一次(exactly-once)的状态一致性保证
- 低延迟,每秒处理数百万个事件,毫秒级延迟(实际上就是没有延迟)
- 与众多常用存储系统的连接(ES,HBase,MySQL,Redis...)
- 高可用(Zookeeper),动态扩展,实现 7*24 小时全天候运行
# Flink 支持的时间
- 事件时间:事件真实发生的时间,要求数据中包含时间戳
- 处理时间:事件到达节点时当前节点的机器时间
spark streaming 只支持处理时间(机器时间) flink 支持事件时间和处理时间
Log file 第一个事件:2019 年 1 月 1 日 00:00:01 第二个事件:2019 年 1 月 2 日 00:00:01 数据计算程序运行时间:2020 年 6 月 8 日 - 10:15:00
滚动窗口:大小是 1 分钟
spark streaming:[2020-06-08:10:15,2020-06-08:10:16]
Flink: [2019-01-01:00:00:00,2019-01-01:00:01:00][2019-01-02:00:00:00,2019-01-02:00:01:00]
2
# Flink vs Spark Streaming
流(stream)和微批 (micro-batching:500msx 整数倍)


stream:1->map(r=>r+1)->1+1=2 mini-batch:rdd(1,2,3)->map(r=>r+1)->rdd(2,3,4)1
2数据模型
- spark 采用 RDD 模型,spark streaming 的 DStream 实际上也就是一组 组小批数据 RDD 的集合
- flink 基本数据模型是数据流,以及事件(Event)序列 (Int、String、Long、Case Class)
运行时架构
- spark 是批计算,将 DAG 划分为不同的 stage,一个 stage 完成后才可以计算下一个 stage
- flink 是标准的流执行模式,一个事件在一个节点处理完后可以直接发往下一个节点进行处理
