这是我参与「第四届青训营 」笔记创作活动的第1天
整体架构
Flink概述
发展过程:Hadoop -> Spark -> Flink
Strom/SparkStreaming/Flink(流式计算框架)对比:
Flink优点:
- 基于事件驱动(Event-driven)的应用,支持流处理和批处理;
- 支持精确一次(Exactly-once)的计算语义,完美保证一致性和正确性;
- 状态容错,checkpoint(实现了标准的Chandy-Lamport算法)是实现容错机制最核心的功能,它能够根据配置周期性地基于Stream中各个Operator/task的状态来生成快照,从而将这些状态数据定期持久化存储下来;
- DataFlow编程模型,基于内存的计算,高吞吐、低延迟;
- 高可用配置,横向扩展架构(动态扩容),多样化部署方式。
Flink整体架构
分层架构:
- 编程API和Libraries层(SDK层):SQL/Table、DataStream、Python
- Runtime层(执行引擎层):核心实现层,包括作业转换(DAG图),任务调度(Task),资源分配,任务执行,状态存储(state backend)等功能,在流式引擎下同时运行流处理程序和批处理程序
- 物理部署层:多平台部署
整体架构(集群两大核心组件):
- JobManager(JM):负责整个任务的协调工作,包括:调度task、触发协调Task 做 Checkpoint、协调容错恢复等;
- TaskManager(TM):负责执行一个DataFlowGraph 的各个task 以及data streams 的 buffer和数据交换。
JobManager工作过程:
JobManagers 接收由 Dispatcher 传递过来的执行程序(包含了作业图JobGraph、逻辑数据流图logical dataflow graph、所有的classes文件、第三方类库libraries等);紧接着JobMaster会将JobGraph转换为执行图ExecutionGraph,然后向ResourceManager申请资源来执行该任务,一旦申请到资源,就将执行图分发给对应的TaskManagers。
做流批一体的模块:
- SQL层;
- DataStream API层统一,批和流都可以使用DataStream API来开发;
- Scheduler层架构统一,支持流批场景(两种调度模式:EAGER、LAZY),都是按照Pipeline Region粒度来申请资源和调度任务;
- Failover Recovery层架构统一,支持流批场景;
- Shuffle Service层架构统一,流批场景选择不同的Shuffle模式(在Streaming和OLAP场景:Pipeline的Shuffle模式、在Batch场景:Blocking的Shuffle模式)。
Shuffle通常有几种不同的实现:
- 基于文件的PullBased Shuffle,比如Spark或MR,它的特点是具有较高的容错性,适合较大规模的批处理作业,由于是基于文件的,它的容错性和稳定性会更好一些;
- 基于Pipeline的Push Based Shuffle,比如Flink、Storm、Presto等,它的特点是低延迟和高性能,但是因为shuffe数据没有存储下来,如果是batch任务的话,就需要进行重跑恢复。
Flink架构优化
流/批/OLAP三种业务场景的的特点比对:
Flink OLAP架构现状:
- Client:提交SQL Query;
- Gateway:接收Client 提交的SQL Query,对SQL进行语法解析和查询优化,生成Flink 作业执行计划,提交给Session集群;
- Session Cluster:执行作业调度及计算,并返回结果。
精选案例讲解
电商流批一体实践:
-
抖音电商业务原有的离线和实时数仓架构:
-
电商流批一体实践:
Flink OLAP场景实践(HTAP):
引用参考
1. Flink中文文档
2. 【大数据专场学习资料一】第四届字节跳动青训营
3. 【大数据专场学习资料二】第四届字节跳动青训营
4. 字节跳动青训营官方
5. Flink系列(一)——Flink核心概念综述
6. Flink状态管理与checkPoint数据容错机制深入剖析-Flink牛刀小试