这是我参与「第四届青训营 」笔记创作活动的的第2天
课堂内容
大数据计算架构的历史
流式计算引擎的角逐
storm,spark streaming和flink,最终Flink脱颖而出。
Flink的社区生态
kalfa,rocketMQ,rabbitMQ 做数据吞吐,消息队列
redits KA类型的数据库
HDFS,Hive 离线的数据库
Clickhouse 做交互分析,OL类型
Flink的分层架构
最上面的SDK层是接口,有SQL,JAVA,PYTHON三种。然后是执行引擎层(runtime层)就是将你的程序转变成DAG的逻辑图,再交给Scheduler(调度层)形成物理计划变成task,task之间用Shuffle Service传输数据,最后这个Stdte Backend用来存储一些状态,下面橙色的是用于资源管理的框架。
Flink的总体框架
client:用于将SDK的东西转为DGA API
JM:负责任务的协调,调度
TM:负责task的执行和数据交换Shuffle
JM的内部架构
Flink作业实例
流式wordcount:从kafka中读取一个实时数据流,每10s统计一次单词出现的次数。代码如下:
首先是new一个consumer,然后用map解析,登记keyby,划定时间节点,apply用来下达计数的功能,最后用sink写出输出。这个过程如果是多并发的,那么streaming dateflow graph就会变成parallel dateflow。同时为了高效我们会在过程中添加OperatorChain,最后将这些task调度到TM的solt中执行。具体过程如下
Flink如何做到流批一体
首先我们要知道everything is streams,批式数据也是一种数据流,是某段时间的流切片。因此我们只需要一个流引擎,并要求他支持不同场景的扩展性。而Flink是流式计算引擎的代表,并且他的以下架构层能支持流和批,所以Flink做到了流批一体。
接下来我们来认识一下Scheduler层和Shuffle Service层,首先Scheduler层是将作业中的DAG转化为TASK,这一部分有两种调度方法,EAGER(用于流计算)LAZY(用于批计算),EAGER要运行需要全部的资源调度和task,但是LAZY不用只要一个task就可以。同时EAGER的task之间用pipeline通讯,则可以将这些task看成是一个pipeline Region。Blocking和pipeline的区别就是前置要落盘(写入磁盘),而pipeline写在内存里不落盘。
第二Shuffle Service层,shuffle是分布式计算中,用来连接上下游数据交互的过程,针对不同的框架可分为两种方式:一基于文件的pull base shuffle(批),如spark,MR,适合大规模批计算,容错性和稳定性高。二基于pipeline的push base shuffle(流),如Flink,strom,低延迟高性能。
流和批shuffle之间的差异如下图
在streaming和OLAP场景下,我们用基于pipeline的shuffle。在Batch场景下,我们用Blocking的shuffle。然后为了流批一体我们将这两个shuffle抽象出一些公共模块构成一个shuffl service。如下图的shuffle Master
流、批、OLAP场景介绍
Flink OLAP架构现状
与我们前面学习的不同介绍这个Session Cluster他提前把申请solt的部分完成了,节约了计算时间,让JM只需要去调度,不用浪费在申请资源的时间上,因为我们这个是OLAP,实时并发的。
Flink使用实例
抖音电商业务
ByteHTAP
课后学习
- Dataflow Model 核心设计思想是什么?
- Flink 相比于 Storm、Spark Streaming 有哪些优势?
- 为什么 Flink 可以做到支持 流/批/OLAP 三种业务场景?三种业务场景核心差异和挑战是哪些?
- 流式场景中,反压一种经常遇到的 case,Flink 是如何处理反压的?你知道其他引擎是怎么处理的么?
- Flink JobManager 各个组件分别是做什么的?你觉得为什么要这样设计?
- 有兴趣的,可以参考 First steps、Intro to the DataStream API、Learn Flink Overview 几篇文档,本地跑一个 Flink Job 试下。