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

169 阅读3分钟

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

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

Flink核心是一个流式的数据流执行引擎,并且能够基于同一个Flink运行时,提供支持流处理和批处理两种类型应用。其针对数据流的分布式计算提供了数据分布,数据通信及容错机制等功能。基于流执行引擎,Flink提供了跟多高抽象层的API便于用户编写分布式任务。

一、Flink工作原理

Flink的基础架构图:

image.png

  • 大数据解决方案的三驾马车:GFS、Big Table、Map-Reduce
  • MapReduce 的概念:MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。
  • Flink 架构的概念:
    • JobManager、TaskManager;
    • Task、Slot、Operator;
    • Dataflow、DAG、JobGraph;

二、Flink核心概念

1. Time(时间语义)

Flink 中的 Time 分为三种:事件时间、达到时间与处理时间。

2. Window(窗口)

窗口本质就是将无限数据集沿着时间(或者数量)的边界切分成有限数据集。

3. Trigger

触发器决定了窗口何时会被触发计算,Flink 中开发人员需要在 window 类型的操作之后才能调用 trigger 方法传入触发器定义。Flink 中的触发器定义需要继承并实现 Trigger 接口,该接口有以下方法:

4. State

如果开发人员未指定触发器,则 Flink 会自动根据场景使用默认的预定义好的触发器。在基于事件时间的窗口中使用 EventTimeTrigger,该触发器会在watermark通过窗口边界后立即触发(即watermark出现关闭改窗口时)。在全局窗口(GlobalWindow)中使用 NeverTrigger,该触发器永远不会触发,所以在使用全局窗口时用户需要自定义触发器。

5. 状态存储

Flink中状态的实现有三种:MemoryState、FsState、RocksDBState

6. Checkpoint

Checkpoint 是分布式全域一致的,数据会被写入hdfs等共享存储中。且其产生是异步的,在不中断、不影响运算的前提下产生。

7. Watermark

Flink 程序并 不能自动提取数据源中哪个字段/标识为数据的事件时间,从而也就无法自己定义Watermark 。开发人员需要通过 Flink 提供的 API 来 提取和定义 Timestamp/Watermark,可以在 数据源或者数据流中定义。

8. 广播状态(Broadcast State)

广播状态(Broadcast State)的引入是为了支持一些来自一个流的数据需要广播到所有下游任务的情况,它存储在本地,用于处理其他流上的所有传入元素。

9. Operator Chain

//创建 
chain dataStream.filter(...).map(...).startNewChain().map(...) 
//禁止 
chain dataStream.map(...).disableChaining()

10. Side Output

除了从DataStream操作的结果中获取主数据流之外,Flink还可以产生任意数量额外的侧输出(Side Output)结果流。侧输出结果流的数据类型不需要与主数据流的类型一致,不同侧输出流的类型也可以不同。当要拆分数据流时(通常必须复制流),从每个流过滤出不想拥有的数据时Side Output将非常有用。

  • 分布式计算系统概念及作用:
    • 调度器;
    • Shuffle Service;
    • HA;
    • Failover Recovery;