一、什么是Flink
flink是数据流上的有状态计算,可以用来处理有界和无界数据(实时和批次)。
1、应用的场景:
• 事件驱动的应用
• 数据管道 & ETL
• 流式、批次数据分析
二、概念及运行流程
1、概念
1.1、flink的组件堆栈
Programs and Dataflows
1、DataFlow的基本套路:
构建运行环境-》Source(一个或多个)-》转换(算子) -》Sink(一个或多个)
多个DataFlow组成DAG。
2、并行化DataFlow(Distributed Streaming DataFlow)
-
一个Stream会有多个Stream Partition
-
一个Operator会还有多个Operator subtasks.Operator subtasks的数据就是这个Operator的并行度
-
Operator(算子)间数据的传递模式:
- One-to-one streams保持元素的分区和顺序,如mao()
- Redistributing streams 改变流的分区
-
重新分区策略取决于使用的算子
- KeyBy() (re-partitions by hashing the key)
- broadcast()
- rebalance() (which re-partitions randomly)
1.2、Flink的API分层架构
越底层API越灵活,越上层的API越轻便
1、Stateful Stream Processing (有状态的流式处理)
位于最底层, 是core API 的底层实现,主要通过ProcessFunction实现。 灵活性高,但开发比较复杂.
ProcessFunction是一个低阶的流处理操作,它可以访问流处理程序的基础构建模块如:event,state,timers
2、CoreAPIs:
• DataStreamAPI:批处理API • DataSetAPI:流处理API
3、Table API&SQL
• SQL 构建在Table 之上,都需要构建Table 环境 • 不同的类型的Table 构建不同的Table 环境 • Table
可以与DataStream或者DataSet进行相互转换 • Streaming SQL不同于存储的SQL,最终会转化为流式执行计划 •
Table API 程序在执行前有优化器基于优化规则对其进行优化
1.3、核心概念
1、Window(Stream特有)
主要是解决聚合(count,sum)等操作的问题,因为流是无边界的,所以无法对一个流做聚合操作(永远无法输出结果)
但是流可以在一定边界内进行聚合操作,而这个边界就由window给出。
Window可以由
• 数据驱动,例如每100个元素. --CountWindow
• 时间驱动,例如每30s
Tumbling Window(翻滚窗口,无重叠)
Sliding Window(滑动窗口,有重叠)
Session Window(类似于Web编程里的Session,以不活动间隙作为分隔)
• 自定义Window
2、Time
- Event Time:记录产生的时间
- Ingestion Time:记录进入source的时间
- Processing Time:记录被处理的时间
常用:ProcessTime和EventTime