Apache Flink 架构|青训营笔记

122 阅读4分钟

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

本次笔记重点内容

    1. Apache Flink 概述
    1. 流批一体的 Apache Flink 架构
    1. Apache Flink 的 OLAP 场景面临的问题及优化思路
    1. Flink 使用案例

什么是大数据?

是在信息化时代背景下,由于信息交互,信息存储,信息处理能力大幅增加而产生的数据,无法在一定时间内通过常规软件工具对其进行获取、存储、管理和处理的数据集合。

数据价值密度低,但是总体价值非常高;每天每个人都在产生数据,大量又迅速。 image.png

Flink框架为什么能脱颖而出?

Flink是流式计算框架,符合业内对于实时性的更高需求,且流批一体,都能支持sql的使用。

流式计算框架对比: image.png

  • Exactly-Once:精确一次的计算语义
  • 状态容错:运行中间出现failed,状态不会丢失,可以重启恢复状态

Apache Flink

Apache Flink是一个框架和分布式处理引擎,用于在无界(有一个开始,但没有定义的结束)和有界(具有定义的开始和结束)数据流上进行有状态计算。

Flink分层架构: image.png

软件开发工具包有三个,支持sql、python环境;执行引擎(runtime)层提供了统一的有向无环图(DAG)来逻辑的描述数据处理业务的工作流,调度层把DAG转化成分布式环境下的各个task,通过Shuffle交互上下游数据,State Backend可以存储算子状态信息,多种环境下的资源管理部署由Resource Manager实现。

  • JobManager(JM)负责整个任务的协调工作,包括:调度 task、触发协调 Task 做 Checkpoint、协调容错恢复等
  • TaskManager(TM)负责执行一个DataFlow Graph的各个task

作业示例

①从简单的逻辑执行图到并发执行图(假设sink算子并发配置为1,其余为2):image.png 注意:有keyBy的逻辑时是不知道要“走”哪里的,可能会按哈希值分配,如map()[1]可以走key()[1]/[2],但Source[1]是固定的语义走map()[1]。

②分布式执行:image.png 每个task可以在一个线程中执行,两个算子当成一个线程处理,减少线程切换和数据的序列化/反序列化,

流批一体

  • 批式计算:一批数据到齐才开始处理,按小时/天等周期性计算
  • 流式计算:实时对用户产生的数据进行计算,持续运行

为什么需要流批一体?

原来架构的缺点:批、流两套系统,相同逻辑需要开发和运行两遍,产生资源浪费,且算子、UDF也是两套,会产生不同程度的误差,给业务带来困扰。

Flink从哪些模块做流批一体?

  • SQL层
  • DataStream API层
  • Scheduler层
  • Failover Recovery层
  • Shuffle Service层

On-Line Analytical Processing-OLAP 交互式分析

在线分析处理,是数据仓库系统最主要的应用,专门用于支持复杂的分析操作,可以根据分析人员的要求快速、灵活地进行大数据量的复杂查询处理。

与流批的最大区别:要求高并发查询+极致处理性能

Flink做OLAP的优势

引擎统一,都支持sql接口,降低了用户的学习成本,提高了开发和维护效率,Flink本身的特点和三性的架构与OLAP非常匹配,在生态方面,Flink支持众多搜索引擎,从很多地方可以读取数据。

问题与挑战:

  • OLAP会产生大量秒级和毫秒级的小作业,对于流批式的Flink来说要针对这一方面进行特定优化,否则将产生许多资源碎片,造成浪费
  • Flink要在Latency和QPS前提下提供较高的并发调度和执行能力

电商流批一体

image.png 数据源导入Kafka,先经过Flink预处理,同步到Hive仓库,可走Flink Batch和Stream两条路处理,保证了数据源一致性,同一个Flink引擎减少了开发和运维成本