这是我参与「第四届青训营 」笔记创作活动的第2天
流/批/OLAP一体的Flink引擎介绍
消息队列:消息传输过程中保存信息的容器。
消息队列是一种异步的服务间通信方式,使用无服务和微服务架构。消息在被处理和删除之前一直存储在队列上。每条消息仅可被同一用户处理一次。消息队列可被用于分离重量级处理、缓存或批处理工作以及缓解高峰期工作负载。在现代云架构中,应用程序被分解为多个规模较小且更易于开发、部署和维护的独立构建模块。消息队列可为这些分布式应用程序提供通信和协调。消息队列可以显著简化分离应用程序的编码,同时提高性能、可靠性和可扩展性。
Flink概述
-
Apache Flink的诞生背景
-
什么是大数据
- 海量化
- 多样化
- 快速化:数据产生和处理的速度
- 价值化:价值密度低,但整体价值高
-
大数据计算架构发展历史
-
为什么需要流式计算
-
大数据实时性带来的价值更大
- 监控场景:实时检查系统状态,提前避免业务故障
- 金融风控:实时检测异常交易,及时阻断风险
- 实时推荐:抖音偏好
-
批示计算
- 需要等到一批数据到齐才开始处理,一批一批处理
- 离线计算,非实时
- 静态数据集
- 小时/天周期性计算
-
流式计算
- 就像是水从水龙头流到水管中,水管中有各种处理,处理后流出
- 实时计算,快速,低延迟
- 无限流,动态,无边界
- 24h持续运行
- 流批一体
-
-
-
为什么Apache Flink会脱颖而出
- Exactly-Once 精确一次的计算语义
- Checkpoint 状态容错
- Dataflow编程模型
- 流批一体
-
Apache Flink的开源生态
Flink整体结构
-
Flink分层架构(各个模块的用图途)
- SDK层:最上面一层,目前有三类:SQL/Table(用SQL实现),DataStream,Python
- 执行引擎层(Runtime层):提供统一的DAG图,不管是流式还是批式,都会转化为DAG图,调度层再把DAG转换成分布式环境下的TASK,Task通过shuffle传输数据
- 状态存储层:存储算子的状态信息
- 资源调度层:目前Flink支持部署在多种环境
-
Flink的总体架构:主要包含两个核心组件
-
JobManager(JM):负责整个任务协调,包括:调度Task,协调Task做checkpoint,协调容错恢复!
-
TaskManager(TM):负责执行一个逻辑执行图DataFlowGraph(DAG图)的各个task以及data stream的buffer和各个数据交换
-
运行过程
- client端:收到用户代码后。经过一系列处理(DAG,Optomizer),把生成的图交给JM
- JM把DAG图转换成一个具体的物理执行图,根据物理执行图的任务调度把task调度到不同的worker节点去执行
-
-
Flink作业示例
流式的WordCount示例,从Kafka读取一个实时的数据流,每10s统计一下单词出现的次数,
-
Flink是如何做到流批一体的
-
为什么需要流批一体
-
例:抖音实时点赞,直播间人数。以及帮助博主统计视频的一些数据信息
-
传统的架构会设计流一条路,批一条路,这样做有以下缺点
- 人力成本高:流、批两套系统,相同逻辑需要开发两遍
- 数据链路冗余:两套逻辑相同的电路,运行两边,会有资源浪费
- 数据口径不一致:两套系统、两套算子,计算可能会产生误差
-
-
流批一体的挑战
-
流式计算 批式计算 实时计算 离线计算 延迟在秒级以内 处理时间在分/小时级,甚至天级 0-1s 10s-1h+ 广告推荐,金融风控 搜索引擎索引,批式数据分析 -
二者核心区别
- 数据流:流式是无限数据集,批式是有限数据集
- 时延
-
-
Flink怎么做到流批一体的
-
批式是流式的特例,有界数据集是一种特殊的数据流
-
一个无边界的数据流可以按时间段切成一个个有边界的数据集
-
Flink主要从以下几个模块做到流批一体
-
SQL层
-
DataStream API层统一,批和流都可以通过DataStream API开发
-
Scheduler层架构统一,支持流的调度,也支持批的调度
-
Scheduler:负责将作业的DAG转换为在分布式环境下可以执行的task
-
1.12版本前Flink支持两种调度模式
- EAGER:申请一个作业的全部资源,同时调度这个作业的全部task,所有task采取pipeline方式通信。适用流式场景
- LAZY:先调度上游,结束后再调度下游(最小调度一个task即可)适用批式场景
-
-
Failover Recovery层架构统一,支持流批场景
-
Shuffle Services层架构统一,选择不同的Shuffle Services解决不同场景的问题
- shuffle:在分布计算中,用来连接上下游数据交换的过程
- shuffle数据的生命周期:流作业的shuffle和task绑定,批不是
- shuffle的存储介质:流作业的shuffle存在内存中(实时性,生命周期短),批作业的shuffle存在磁盘例(数据量大需要高容错)
- shuffle的部署:流的shuffle和计算节点部署在一起
-
-
-
Flink架构优化
-
流、批、OLAP业务场景概述
- 特点对比
-
流式计算 批式计算 交互式分析 实时计算 离线计算 OLAP 延迟在秒级以内 处理时间在分/小时级,甚至天级 处理时间秒级 0-1s 10s-1h+ 1-10s 广告推荐,金融风控 搜索引擎索引,批式数据分析 数据分析BI报表
-
为什么三种业务场景可以用一套引擎
- OLAP是一种特殊的批式计算,对并发和实时性要求更高。而批式计算又是一种特殊的流式计算
-
Flink如何支持OLAP
-
Flink做OLAP的优势
- 引擎统一
- 既有优势
- 生态支持
-
Flink OLAP场景的挑战
- 秒级和毫秒级的小作业->作业频繁启动停止,资源碎片
-
Flink OLAP架构现状
-
Client层:提交SQL Query
-
Geteway
- 接收Client提交的SQL Query,对SQL语法解析和优化,生成Flink执行计划,提交到Session集群
-
Session集群:执行作业调度及计算,返回结果
-
-
Flink在OLAP架构的问题与设想
-
Flink的使用案例
-
电商流批一体实践
-
Flink OLAP场景实践