流/批/OLAP一体的Flink引擎05|青训营笔记

153 阅读5分钟

这是我参与【第四届青训营】笔记创作活动的第四天

01Flink概述

Apache Flink

什么是大数据

大数据(big data):指无法一定时间内用常规软件工具对其进行捕获、储存、管理和处理的数据集合

特点:Value价值化,数据价值密度很低,整体价值很高;Volumes海量化;Velocity快速化,数据产生和处理速度很快;Variety多样化,数据种类很多样,有半结构化数据和结构化数据;

为什么用流式计算

  • 监控场景:实时发现业务的健康状态,提前避免业务故障
  • 金融风控:实时监测出异常交易行为,及时阻断风险发生
  • 实时推荐:根据用户的行为数据偏好向用户推荐更感兴趣的内容 大数据由批式计算转换为流式计算:

批式计算:1.离线计算,非实时;2.静态数据集;3.按小时/天等周期性计算

流式计算:1.实时计算,快速低延迟;2.无限流,动态,无边界;3.7*24持续运行;4.流批一体

Fink特点:精准一次的计算语义;状态容错checkpoint;Dataflow编程模型;流批一体


02Flink整体架构

Flink分层架构

  • SDK层:Flink的SDK有三类,SQL/Table,DataStream,Python(做AI;
  • 执行引擎层(Runtime层):执行引擎层提供了统一的DAG用来描述数据处理的pipeline,不管是流还是批都会转换成DAG图,再通过调度层分配成不同的分布式环境下的task,每个task之间通过shuffle service传输数据
  • 状态储存层:负责储存算子的状态信息
  • 资源调度层:目前Flink可以支持部署在多种环境下

Flink总体架构

  • JobManager(JM):负责任务的协调工作,包括调动task,触发协助task做checkpoint,协调容错恢复等 ;

    Dispatch:接收作业,拉起jobmaster来执行作业,并在完成后结束作业;

    JobMaster:负责整个生命周期的管理,向RM申请Slot,并将task调度到对应的TM上

    ResourceMaster:负责Slot的资源管理和调度,TM拉起后向RM注册

  • Taskmanager(TM):负责执行一个DataFlowGraph的各个task以及dataStream的buffer和数据交换

Flink如何做到流批一体

为什么需要流批一体

不做流批一体:

  • 人力成本高,流批两套系统,同样逻辑要开发两遍
  • 数据链路冗余:计算内容是一样的,但是需要计算两次,产生资源浪费
  • 数据口径不一样:两套系统,会产生不同程度的误差,这些误差会给业务带来很大的困扰

流批一体的挑战

  • 流式计算:实时计算,延迟在毫秒级,通常用于金融风控和广告推荐

    无限数据集;低延迟,业务会感知运行中的情况

  • 批式计算:离线计算,延迟在小时级,通常做批示数据分析

    有限数据集;实时性要求不高,只关注最后产出时间

Flink如何做到流批一体

1.批式计算是流式计算的的特例,Everything is streams,有界数据集(批式数据)也是一种数据流,一种特殊的数据流;因此,理论上我们可以用一套引擎架构完成两个场景,只不过需要对不同场景支持相应的拓展性,并做不同的优化;

不管是有边界的数据集还是无边界的数据集,Flink都可以天然地支持,这是Flink支持流批一体的基础。并且Flink在流批一体上,从上面的API到底层的处理机制都是统一的,是真正意义上的流批一体。

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

  • SQL层,支持bdd和unbdd的输入;SQL处理不了可以用java处理
  • DataStreamAPI层统一,批和流都可以通过他来开发
  • scheduler层架构统一,支持流批场景
  • Failover Recover层架构统一,支持流批场景
  • shuffle service层架构统一,流批场景选择不同的shuffle service

流批一体的schedulur层

EAGER:一个作业需要全部资源,同时调度作业的所有task。用于Stream场景,因为数据是不断的

Lazy:先调度上游,等上游产生数据或结束后再调度下游,类似spark执行模式,调用资源少,但是时间长,需要一个一个task处理。用于Batch场景

流批一体的shuffService层

shuffle:在分布式计算中,用于连接上下游的数据交互。涉及上下游数据的衔接过程都叫shuffle

  • 基于文件的pull based shuffle: 容错性较高,适合大规模的批处理作业,由于基于文件,稳定性会好一些
  • 基于pipeline的push based shuffle:低延迟并且高性能,但是shuffle数据没有存下来,做batch任务时需要进行重跑

流和批shuffle之间的差异:

shuffle数据的生命周期:流作业的数据和task是绑定在一起的;批作业的数据和task是分开的

shuffle数据储存介质:流作业生命周期短,为了流作业的实时性,shuffle通常储存在内存中;批作业因为数据量大和容错需求,通常存在硬盘中