第二节:流/批/OLAP 一体的 Flink 引擎介绍| 青训营笔记

174 阅读6分钟

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

第二节:流/批/OLAP 一体的 Flink 引擎介绍

一、Apache Flink 概述

Apache Flink 诞生背景

什么是大数据?

指无法在一定时间用常规软件工具对其进行获取、存储、管理和处理的数据集合

  • 价值化Value
  • 海量化Volumes
  • 快速化Velocity
  • 多样化Variety

大数据计算机构发展历史

image.png

为什么需要流式计算

大数据的实时性带来的价值巨大,比如:

监控场景: 如果能实时发现业务系统的健康状态,就能提前避免业务故障

金融风控: 如果能实时监测异常交易的行为,就能及时阻断风险的发生

实时推荐: 比如在抖音,如果可以根据用户的行为数据发掘用户的兴趣、偏好,就能向用户推荐更感兴趣的内容

  • 实时计算的业务场景需求、为什么会出现流式计算

    • 数据实时价值更大
    • 大数据批式处理分分钟级、小时级、天极,离线计算,非实时部分业务场景无法接受
  • 流式计算特点:

    • 实时计算、快速、低延迟
    • 无限流、动态、无边界
    • 7*24 持续运行

为什么Flink会脱颖而出

流式计算框架对比

image.png

WHY Flink

流批一体 image.png

Flink社区开源生态

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

image.png

二、流批一体的 Apache Flink 架构

Flink分层架构

image.png

  • 执行引擎层(Runtime 层):执行引擎层提供了统一的 DAG,用来描述数据处理的 Pipeline,不管是流还是批,都会转化为 DAG 图,调度层再把 DAG 转化成分布式环境下的 Task,Task 之间通过 Shuffle 传输数据;

  • 状态存储层:负责存储算子的状态信息

Flink总体架构

image.png

  • 客户端将数据提交给JM

  • 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作业示例

image.png

Flink如何做到流批一体

为什么需要流批一体

举个例子:

  1. 在抖音中,实时统计一个短视频的播放量,点赞数,直播间的实时人数,送的礼物 (流)
  2. 在抖音中,按天统计一些创作的的数据,比如说昨天的收益是多少、播放量是多少 (批)

传统解决方案

打造两套系统,一套进行流式数据处理,一套进行批式数据处理

image.png

传统解决方案的痛点

  • 人力成本比较高:批、流两套系统,相同逻辑需要开发两遍;

  • 数据链路冗余:本身计算内容是一致的,由于是两套链路,相同逻辑需要运行两遍,产生一定的资源浪费;

  • 数据口径不一致:两套系统、两套算子、两套 UDF,通常会产生不同程度的误差,这些误差会给业务方带来非常大的困扰。

流批一体的挑战

image.png

  • 批式计算相比于流式计算核心的区别:
    • 无限数据集 --> 有限数据集;
    • 低延迟 --> 实时性要求不高;

Flink如何做到流批一体

  • 批式计算是流式计算的特例,Everything is Streams(任何东西都是流),有界数据集(批式数据)也是一种数据流、一种特殊的数据流;

  • 站在 Flink 的角度,Everything is Streams,无边界数据集是一种数据流,一个无边界的数据流可以按时间切段成一个个有边界的数据集,所以有界数据集(批式数据)也是一种数据流。因此,不管是有边界的数据集(批式数据)还是无边界数据集,Flink 都可以天然地支持,这是 Flink 支持流批一体的基础。并且 Flink 在流批一体上,从上面的 API 到底层的处理机制都是统一的,是真正意义上的流批一体。

  • Apache Flink 主要从以下几个模块来做流批一体:

    • SQL 层;
    • DataStream API 层统一,批和流都可以使用 DataStream API 来开发;
    • Scheduler 层架构统一,支持流批场景;
    • Failover Recovery 层 架构统一,支持流批场景;
    • Shuffle Service 层架构统一,流批场景选择不同的 Shuffle Service;

三、Apache Flink 的 OLAP 场景面临的问题及优化思路

流/批/OLAP 业务场景概述

  • 三种业务场景的特点

image.png

  • 三种业务场景面临的挑战

为什么三种场景可以用一套引擎来解决

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

Flink 如何支持 OLAP 场景

  • Flink做OLAP的优势

image.png

  • Flink OLAP场景的挑战

image.png

  • Flink OLAP 架构现状

    • Client:提交 SQL Query;

    • Gateway:接收 Client 提交的 SQL Query,对 SQL 进行语法解析和查询优化,生成 Flink 作业执行计划,提交给 Session 集群;

    • Session Cluster:执行作业调度及计算,并返回结果。

      • JobManager 管理作业的执行,在接收到 Gateway 提交过来的作业逻辑执行计划后,将逻辑执行计划转换为物理执行计划,为每个物理计算任务分配资源,将每个计算任务分发给不同的 TaskManager 执行,同时管理作业以及每个计算任务执行状态;
      • TaskManager执行具体的计算任务,采用线程模型,为每个计算任务创建计算线程,根据计算任务的上下游数据依赖关系跟上游计算任务建立/复用网络连接,向上游计算任务发送数据请求,并处理上游分发给它的数据。

  • Flink 在OLAP架构上的设想

image.png

四、Flink 使用案例

  • 电商流批一体实践

image.png