Skip to content

Flink 随堂笔记

基本概念

事件驱动模型 利用观察者模式将数据库操作转化成流式操作 针对有界或无界数据流做有状态的计算

集群与配置

环境配置

  • Scala 2.12
  • Flink 1.15.2
  • 系统环境 Ubuntu 20 ARM 版
  • Java 11
  • Hadoop 3.3.4

集群配置

  • 配置集群节点服务器间时间同步 与 SSH免密登录
  • 自用同步脚本 并 关闭防火墙
  • 虚拟机三台服务器的具体设置如下
    • 节点服务器 1,IP 地址为 10.211.55.3,主机名为 hadoop101。
    • 节点服务器 2,IP 地址为 10.211.55.6,主机名为 hadoop102。
    • 节点服务器 3,IP 地址为 10.211.55.5,主机名为 hadoop103。

运行时架构

运行流程

可以和Hadoop Yarn结合

系统架构

JobManager

1. JobMaster

控制应用程序的主进程 数据流图 Dataflow Graph 作业图 Job Graph

2. Resource Manager

管理slot 可以和其他平台集成

3. Dispacher

提供REST接口

TaskManager

主进程下的工作进程 工作进程下可能有多个slot 一个slot对应一个正真工作线程

系统架构图

将每个操作视为一个算子也比如 读、算、写

执行流程

逻辑执行图

物理执行图

DataStream

算子

1. source 原算子

读取数据输入

2. transform

转换算子 + map + 映射 + 一对一映射转换 + filter + 过滤 + 符合条件的才转换 + flatMap + 扁平映射 + 对源数据做分散拆分再处理 + 一对多的映射转换(可以是0)

聚合算子 + keyBy + 根据 key 划分分区 + reduce + 循环归约

自定义函数 + UDF + 继承 Function

物理分区 + 负载均衡分区 + 轮询 + 广播

3. sink

输出算子 + bucket + 先写到桶bucket中 + bucket中分块写到目标存储

时间和窗口

示意图

1. 处理时间

  • flink流接收到的时间

2. 事件时间

  • 事件发生的时间
  • 水位线
    • 标识事件时间的进展
    • 就是将一系列事件发生时间做个标记
    • Flink 接收数据时标记点接收了数据才认为真的接收
    • 其实就是个有序的时间标记
  • 周期性的设置水位线
  • 通过延时机制保证更多的无序数据进入有序窗口

3. 窗口

  • 一般根据时间分块
  • 看成 bucket 只保留指定范围内的数据
  • 可以根据计数分块

4. 窗口分类

  • 滚动窗口
  • 滑动窗口
  • 会话窗口
  • 全局窗口
  • 触发器

分流合流

很好理解

状态

为了计算最终结果所需要的中间数据(节点)

1. 按键分区状态(keyBy过来的)

  • 结构类型
    • 列表
    • 映射
    • 归约
    • 聚合

2. 算子状态

就是算子的值

3. 广播状态

就是全局变量 应该是集群内唯一

4. 持久化