大数据计算引擎flink | 青训营笔记

145 阅读6分钟

这是我参与「第四届青训营 」笔记创作活动的的第2天

flink概述

flink的诞生

关于flink的诞生问题,我门需要理解什么是大数据以及大数据的一个发展演变

关于大数据:一种规模大到在获取、存储、管理、分析方面大大超出了传统数据库软件工具能力范围的数据集合,具有1.海量的数据规模、2.快速的数据流转、3.多样的数据类型和4.价值密度低四大特征。

大数据计算框架历史演变: 史前阶段 -> hadoop -> spark -> flink

史前阶段:主要是传统数仓 hadoop:分布式,mapreduce,离线计算 spark:批处理,流处理,内存迭代计算,SQL高阶API flink:流批一体,实时快速,流批SQL

对于流式计算,主要是考虑到大数据的实时性价值更大

比如实时计算通常用于监控,金融风控,实时推荐等场景

flink的突出

流式计算框架有很多,但是为什么flink能够从中脱颖而出呢?

下面是几个流行流式计算框架的对比:

StormSpark StreamingFlink
Streaming ModelNativemini-batchNative
一致性保证At Least/Most oneExactly-OnceExactly-Once
延迟低延迟(毫秒级)延迟较高低延迟(毫秒级)
吞吐LowHignHIgh
容错ACKRDD Based CheckpointCheckpoint(Chandy-Lamport)
StateFulNoYes(Dstrem)Yes(Operator)
SQL支持NoYesYes

flink特点:

  • 流批一体
  • Exactly-Once 精确一次的计算语义
  • 提供状态容错 checkpoint
  • Dataflow 编程模型;Window 等高阶需求支持友好
  • 有状态计算

开源生态

Apache Flink 在开源生态上的能力比较强大,可以支持:

  1. 流批一体:支持流式计算和批式计算;
  2. OLAP:Flink 可以支持 OLAP 这种短查询场景;
  3. Flink ML:pyFlink、ALink、AIFlow 等生态支持 Flink 在 ML 场景的应用;
  4. Gelly:图计算;
  5. Stateful Function:支持有状态的 FAAS 场景;

flink整体架构

分层架构

有四个层级

  1. SDK层:SQL/Table、DataStream、Python
  2. 执行引擎层(Runtime层):描述业务处理的Pipeline,转化为DAG图
  3. 状态存储层:负责存储算子的状态信息
  4. 资源调度层:多种部署模式

总体架构

flink架构图.png 两个核心组件

  1. JobManager:整个任务的协调工作包括:调度 task、触发协调 Task 做 Checkpoint、协调容错恢复等,核心有下面三个组件:

    • Dispatcher: 接收作业,拉起 JobManager 来执行作业,并在 JobMaster 挂掉之后恢复作业;
    • JobMaster: 管理一个 job 的整个生命周期,会向 ResourceManager 申请 slot,并将 task 调度到对应 TM 上;
    • ResourceManager:负责 slot 资源的管理和调度,Task manager 拉起之后会向 RM 注册;
  2. TaskManager:必须始终至少有一个任务管理器。任务管理器中资源调度的最小单位是任务。任务管理器中的任务槽数指示并发处理任务数。请注意,一个任务槽中可能会执行多个运算符

flink作业示例

使用大数据计算中的hello world - wordcount程序 Hands-On Training

流批一体

流批一体的需求

例子:

  1. 实时统计短视频的播放量、点赞量或者直播间的观看人数

  2. 统计up主的历史数据,如昨天的播放量,评论量等等

解决以上问题需要设计两种架构,批处理和流处理

带来问题:

  1. 相同逻辑开发两遍
  2. 数据链路冗余
  3. 数据口径不一致:容易造成不同程度的误差

流批一体的挑战:两种模式的特点不同,主要表现在延迟高低,数据流的模式

flink实践

一个思想: 批计算是流式计算的特例, 对于无边界数据流可以按实践切短一个个有界的数据流

从几个模块做到批流一体:

  1. sql层
  2. datastream API层统一
  3. Scheduler层架构统一
  4. Failover Recovery层架构统一
  5. Shuffle Service层
scheduler层

任务:DAG-> 分布式环境中可执行的task

两种调度模式

  1. eager 申请一个作业所需的全部资源,task之间用pipeline的方式进行通信 stream 集群需要有足够的资源
  2. lazy 先上游后释放给下游 数据不需要落盘 batch
  • all_edges_blocking
  • all_edges_pipelines
  • blocking模式:需要落盘
  • pipeline模式:不需要落盘,直接走内存,传到下个task
Shuffle Service层

shuffle:在分布式计算中,用来连接上下游数据交互的过程叫做shuffle

实现:

  1. 基于文件的 Pull Based Shuffle,比如 Spark 或 MR,它的特点是具有较高的容错性,适合较大规模的批处理作业,由于是基于文件的,它的容错性和稳定性会更好一些;
  2. 基于 Pipeline 的 Push Based Shuffle,比如 Flink、Storm、Presto 等,它的特点是低延迟和高性能,但是因为 shuffle 数据没有存储下来,如果是 batch 任务的话,就需要进行重跑恢复;

flink架构优化

flink可以运用于三种不同的计算场景: 流/批/OLAP

这三种模式有着不同的特点和挑战,但还是可以用一套引擎来解决

原因:

  • 批式计算是流式计算的特例,Everything is Streams,有界数据集(批式数据)也是一种数据流、一种特殊的数据流;
  • OLAP 计算是一种特殊的批式计算,它对并发和实时性要求更高,其他情况与普通批式作业没有特别大区别。

但是如今flink再OLAP上还是存在不小的挑战

问题:

  • 架构与功能模块:

    • JobManager 与 ResourceManager 在一个进程内启动,无法对JobManager 进行水平扩展;
    • Gateway 与 Flink Session Cluster 互相独立,无法进行统一管理;
  • 作业管理及部署模块:

    • JobManager 处理和调度作业时,负责的功能比较多,导致单作业处理时间长、并占用了过多的内存;
    • TaskManager 部署计算任务时,任务初始化部分耗时验证,消耗大量 CPU;
  • 资源管理及计算任务调度:

    • 资源申请及资源释放流程链路过长;
    • Slot 作为资源管理单元,JM 管理 slot 资源,导致 JM 无法感知到 TM 维度的资源分布,使得资源管理完全依赖于 ResourceManager;
  • 其他:

    • 作业心跳与 Failover 机制,并不合适 AP 这种秒级或毫秒级计算场景;
    • AP 目前使用 Batch 算子进行计算,这些算子初始化比较耗时;

个人感想

上完这节课,对流式计算引擎flink有了一个大致的了解,感叹它流批一体功能的强大,在OLAP业务场景下也能投入实践。

本节课重点内容在于如何理解flink的总体架构和分层架构,利用wordcount作业来示例flink是如何进行作业的提交和计算。此外flink在在流批一体上的实现十分吸引我的目光,很好奇本来需要两种架构的计算模式,底层是如何做到合二为一,流批一体的,这是一个值得探讨的点

引用

【大数据专场 学习资料一】第四届字节跳动青训营 - 掘金 (juejin.cn)