这是我参与「第四届青训营 」笔记创作活动的第 2 天!
1、Flink概述
Flink诞生背景
大数据
指无法在一定时间内用常规软件工具对其进行获取、存储、管理和处理的数据集合。
流式计算的需求(实时计算的业务场景)
-
数据实时价值更大;
-
大数据批式处理分钟级、小时级、天极,部分业务场景无法接受
批式计算:
-
离线计算,非实时
-
静态数据集
-
小时,天等周期性计算
流式计算:
-
实时计算、快速、低延迟
-
无限流、动态、无边界
-
7*24 持续运行
-
流批一体
流式计算引擎比较
Flink:从产品技术来看,Flink 作为一个最新的实时计算引擎,具备如下流计算技术特征:
-
完全一次保证:故障后应正确恢复有状态运算符中的状态;
-
低延迟:越低越好。许多应用程序需要亚秒级延迟;
-
高吞吐量:随着数据速率的增长,通过管道推送大量数据至关重要;
-
强大的计算模型:框架应该提供一种编程模型,该模型不限制用户并允许各种各样的应用程序在没有故障的情况下,容错机制的开销很低;
-
流量控制:来自慢速算子的反压应该由系统和数据源自然吸收,以避免因消费者缓慢而导致崩溃或降低性能;
-
乱序数据的支持:支持由于其他原因导致的数据乱序达到、延迟到达后,计算出正确的结果;
-
完备的流式语义:支持窗口等现代流式处理语义抽象;
-
Google Dataflow Model 的开源引擎实现。
从 Storm 到 SparkStreaming 再到 Flink 流式计算处理实时数据能力、功能愈加强大。
Apache Flink 开源生态
开源生态非常强大:支持流批一体,OLAP,Gelly图计算等
2、Flink整体框架
Flink分层架构
-
SDK层:Flink 的 SDK层目前主要有三类,SQL/Table、DataStream、Python;
-
执行引擎层(Runtime):执行引擎层提供了统一的 DAG,用来描述数据处理的 Pipeline,不管是流还是批,都会转化为 DAG 图,调度层再把 DAG 转化成分布式环境下的 Task,Task 之间通过 Shuffle 传输数据;
-
状态存储层:负责存储算子的状态信息
-
资源调度层:目前Flink可以支持部署在多种环境。
Flink整体架构
JobManager(JM)
负责整个任务的协调工作,包括:调度 task、触发协调 Task 做 Checkpoint、协调容错恢复等,核心有下面三个组件:
-
Dispatcher: 接收作业,拉起 JobManager 来执行作业,并在 JobMaster 挂掉之后恢复作业;
-
JobMaster: 管理一个 job 的整个生命周期,会向 ResourceManager 申请 slot,并将 task 调度到对应 TM 上;
-
ResourceManager:负责 slot 资源的管理和调度,Task manager 拉起之后会向 RM 注册;
TaskManager(TM)
负责执行一个 DataFlow Graph 的各个 task 以及 data streams 的 buffer 和数据交换。
Flink 作业示例
如何做到流批一体
为什么要做流批一体呢?因为有时在一个系统中同时需要批处理和流处理,同样一套处理逻辑,但是由于架构不同,则需要重新走一遍。浪费资源。而且如果两套最后运行结果有误差也不好进行分析。
可以将批式运算看做流式计算的特例。站在 Flink 角度,有边界数据集和无边界数据集都是数据流,所以 Flink 天然支持两者,这是 Flink 支持流批一体的基础。并且 Flink 在流批一体上,从上面的 API 到底层的处理机制都是统一的,是真正意义上的流批一体。
Apache Flink 主要从以下几个模块来做流批一体:
-
SQL 层;
-
DataStream API 层统一,批和流都可以使用 DataStream API 来开发;
-
Scheduler 层架构统一,支持流批场景;
-
Failover Recovery 层 架构统一,支持流批场景;
-
Shuffle Service 层架构统一,流批场景选择不同的 Shuffle Service;
Scheduler层
Scheduler 主要负责将作业的 DAG 转化为在分布式环境中可以执行的 Task;
1.12 之前的 Flink 版本,Flink 支持两种调度模式:
- EAGER(Streaming 场景):申请一个作业所需要的全部资源,然后同时调度这个作业的全部 Task,所有的 Task 之间采取 Pipeline 的方式进行通信;
调度所有资源
- LAZY(Batch 场景):先调度上游,等待上游产生数据或结束后再调度下游,类似 Spark 的 Stage 执行模式。
调度一点资源
Pipeline Region Scheduler 机制
由 Pipeline 的数据交换方式连接的 Task 构成一个 Pipeline Region。流和批作业都是根据 Pipeline Region 粒度来申请资源和调度任务。
Shuffle Service 层
Shuffle 分类:
-
基于文件的 Pull Based Shuffle,比如 Spark 或 MR,它的特点是具有较高的容错性,适合较大规模的批处理作业,由于是基于文件的,它的容错性和稳定性会更好一些;
-
基于 Pipeline 的 Push Based Shuffle,比如 Flink、Storm、Presto 等,它的特点是低延迟和高性能,但是因为 shuffle 数据没有存储下来,如果是 batch 任务的话,就需要进行重跑恢复;
流和批 Shuffle 之间的差异:
-
Shuffle 数据的生命周期:流作业的 Shuffle 数据与 Task 是绑定的,而批作业的 Shuffle 数据与 Task 是解耦的;
-
Shuffle 数据存储介质:流作业的生命周期比较短、而且流作业为了实时性,Shuffle 通常存储在内存中,批作业因为数据量比较大以及容错的需求,一般会存储在磁盘里;
-
Shuffle 的部署方式:流作业 Shuffle 服务和计算节点部署在一起,可以减少网络开销,从而减少 latency,而批作业则不同。
- Pluggable Shuffle Service:Flink 的目标是提供一套统一的 Shuffle 架构,既可以满足不同 Shuffle 在策略上的定制,同时还能避免在共性需求上进行重复开发
3、Flink架构优化
流/批/OLAP
三种业务场景特点:
三种业务场景面临的挑战
OLAP 计算是一种特殊的批式计算,它对并发和实时性要求更高,其他情况与普通批式作业没有特别大区别。
Flink做OLAP的优势:
Flink OLAP 场景的挑战
-
秒级和毫秒级的小作业;
-
作业频繁启停、资源碎片
-
Latency + 高 APS 要求;
参考资料
【大数据专场 学习资料一】第四届字节跳动青训营 - 掘金 (juejin.cn)
Flink Architecture |Apache Flink
FLIP-119 Pipelined Region Scheduling - Apache Flink - Apache Software Foundation