流/批/OLAP一体的Flink引擎介绍

118 阅读6分钟

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

流/批/OLAP一体的Flink引擎介绍

消息队列:消息传输过程中保存信息的容器。

消息队列是一种异步的服务间通信方式,使用无服务和微服务架构。消息在被处理和删除之前一直存储在队列上。每条消息仅可被同一用户处理一次。消息队列可被用于分离重量级处理、缓存或批处理工作以及缓解高峰期工作负载。在现代云架构中,应用程序被分解为多个规模较小且更易于开发、部署和维护的独立构建模块。消息队列可为这些分布式应用程序提供通信和协调。消息队列可以显著简化分离应用程序的编码,同时提高性能、可靠性和可扩展性。

Flink概述

  • Apache Flink的诞生背景

    • 什么是大数据

      • 海量化
      • 多样化
      • 快速化:数据产生和处理的速度
      • 价值化:价值密度低,但整体价值高
    • 大数据计算架构发展历史

    • 为什么需要流式计算

      • 大数据实时性带来的价值更大

        • 监控场景:实时检查系统状态,提前避免业务故障
        • 金融风控:实时检测异常交易,及时阻断风险
        • 实时推荐:抖音偏好
      • 批示计算

        • 需要等到一批数据到齐才开始处理,一批一批处理
        • 离线计算,非实时
        • 静态数据集
        • 小时/天周期性计算
      • 流式计算

        • 就像是水从水龙头流到水管中,水管中有各种处理,处理后流出
        • 实时计算,快速,低延迟
        • 无限流,动态,无边界
        • 24h持续运行
        • 流批一体
  • 为什么Apache Flink会脱颖而出

    • Exactly-Once 精确一次的计算语义
    • Checkpoint 状态容错
    • Dataflow编程模型
    • 流批一体
  • Apache Flink的开源生态

Flink整体结构

  • Flink分层架构(各个模块的用图途)

    • SDK层:最上面一层,目前有三类:SQL/Table(用SQL实现),DataStream,Python
    • 执行引擎层(Runtime层):提供统一的DAG图,不管是流式还是批式,都会转化为DAG图,调度层再把DAG转换成分布式环境下的TASK,Task通过shuffle传输数据
    • 状态存储层:存储算子的状态信息
    • 资源调度层:目前Flink支持部署在多种环境
  • Flink的总体架构:主要包含两个核心组件

    • JobManager(JM):负责整个任务协调,包括:调度Task,协调Task做checkpoint,协调容错恢复!

    • TaskManager(TM):负责执行一个逻辑执行图DataFlowGraph(DAG图)的各个task以及data stream的buffer和各个数据交换

    • 运行过程

      1. client端:收到用户代码后。经过一系列处理(DAG,Optomizer),把生成的图交给JM
      2. JM把DAG图转换成一个具体的物理执行图,根据物理执行图的任务调度把task调度到不同的worker节点去执行
  • Flink作业示例

    流式的WordCount示例,从Kafka读取一个实时的数据流,每10s统计一下单词出现的次数,

  • Flink是如何做到流批一体的

    • 为什么需要流批一体

      • 例:抖音实时点赞,直播间人数。以及帮助博主统计视频的一些数据信息

      • 传统的架构会设计流一条路,批一条路,这样做有以下缺点

        1. 人力成本高:流、批两套系统,相同逻辑需要开发两遍
        2. 数据链路冗余:两套逻辑相同的电路,运行两边,会有资源浪费
        3. 数据口径不一致:两套系统、两套算子,计算可能会产生误差
    • 流批一体的挑战

      • 流式计算批式计算
        实时计算离线计算
        延迟在秒级以内处理时间在分/小时级,甚至天级
        0-1s10s-1h+
        广告推荐,金融风控搜索引擎索引,批式数据分析
      • 二者核心区别

        • 数据流:流式是无限数据集,批式是有限数据集
        • 时延
    • Flink怎么做到流批一体的

      • 批式是流式的特例,有界数据集是一种特殊的数据流

      • 一个无边界的数据流可以按时间段切成一个个有边界的数据集

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

        • SQL层

        • DataStream API层统一,批和流都可以通过DataStream API开发

        • Scheduler层架构统一,支持流的调度,也支持批的调度

          • Scheduler:负责将作业的DAG转换为在分布式环境下可以执行的task

          • 1.12版本前Flink支持两种调度模式

            • EAGER:申请一个作业的全部资源,同时调度这个作业的全部task,所有task采取pipeline方式通信。适用流式场景
            • LAZY:先调度上游,结束后再调度下游(最小调度一个task即可)适用批式场景
        • Failover Recovery层架构统一,支持流批场景

        • Shuffle Services层架构统一,选择不同的Shuffle Services解决不同场景的问题

          • shuffle:在分布计算中,用来连接上下游数据交换的过程
          • shuffle数据的生命周期:流作业的shuffle和task绑定,批不是
          • shuffle的存储介质:流作业的shuffle存在内存中(实时性,生命周期短),批作业的shuffle存在磁盘例(数据量大需要高容错)
          • shuffle的部署:流的shuffle和计算节点部署在一起

Flink架构优化

  • 流、批、OLAP业务场景概述

    • 特点对比
    • 流式计算批式计算交互式分析
      实时计算离线计算OLAP
      延迟在秒级以内处理时间在分/小时级,甚至天级处理时间秒级
      0-1s10s-1h+1-10s
      广告推荐,金融风控搜索引擎索引,批式数据分析数据分析BI报表
  • 为什么三种业务场景可以用一套引擎

    • OLAP是一种特殊的批式计算,对并发和实时性要求更高。而批式计算又是一种特殊的流式计算
  • Flink如何支持OLAP

    • Flink做OLAP的优势

      • 引擎统一
      • 既有优势
      • 生态支持
    • Flink OLAP场景的挑战

      • 秒级和毫秒级的小作业->作业频繁启动停止,资源碎片
    • Flink OLAP架构现状

      • Client层:提交SQL Query

      • Geteway

        • 接收Client提交的SQL Query,对SQL语法解析和优化,生成Flink执行计划,提交到Session集群
      • Session集群:执行作业调度及计算,返回结果

    • Flink在OLAP架构的问题与设想

Flink的使用案例

  • 电商流批一体实践

  • Flink OLAP场景实践