Flink复习笔记

文章详细介绍了Flink的计算模型、内存管理,包括JobManager和TaskManager的内存配置,以及如何处理数据倾斜。此外,还讨论了Flink与Spark的对比,以及如何使用水印处理延迟数据。文章还涵盖了Flink的分布式缓存机制、状态管理和一致性保证,以及如何应对反压和数据延迟。

文章目录

模型分层

  • Runtime

    Flink 程序的最底层入口。提供了基础的核心接口完成流、状态、事件、时间等复杂操作,功能灵活。

  • DataStream API

    面向开发者,基于Runtime层的抽象。

  • Table API

    统一DataStream/DataSet,抽象成带有 Schema信息的表结构. 通过表操作和注册表完成数据计算。

  • SQL

    面向数据分析和开发人员,抽象为SQL操作。

计算模型

  • source 支持多数据源输入
  • transformation 数据的转换过程
  • sink 数据的输出
    在这里插入图片描述

分布式缓存

目的是在本地读取文件,并把他放在TaskManager节点中,防止task重复拉取

object Distribute_cache {
  def main(args: Array[String]): Unit = {
    val env = ExecutionEnvironment.getExecutionEnvironment
    //1"开启分布式缓存
    val path = "hdfs://hadoop01:9000/score"
    env.registerCachedFile(path , "Distribute_cache")
    //3:开始进行关联操作
    DS<String>.map(new MyJoinmap()).print()
  }
}
class MyJoinmap() extends RichMapFunction[Clazz , ArrayBuffer[INFO]]{
  private var myLine = new ListBuffer[String]
  override def open(parameters: Configuration): Unit = {
    val file = getRuntimeContext.getDistributedCache.getFile("Distribute_cache")
  }

  //在map函数下进行关联操作
  override def map(value: Clazz):  ArrayBuffer[INFO] = {
  }
}

管理内存

Flink是将对象都序列化到一个预分配的内存块上,并且大量使用了堆外内存。如果处理数据超过了内存大小,会使部分数据存储到硬盘上。同时Flink为了直接操作二进制数据而实现了自己的序列换框架。

  • 堆内内存

    Flink程序在创建对象后,JVM会在堆内内存中分配一定大小的空间,创建Class对象并返回对象引用,Flink保存对象引用,同时记录占用的内存信息。

  • 堆外内存

    堆外内存其底层调用基于CJDK Unsafe类方法,通过指针直接进行内存的操作,包括内存空间的申请、使用、删除释放等

JobManager 内存管理

# JobManager总进程内存
jobmanager.memory.process.size:

# 作业管理器的 JVM 堆内存大小
jobmanager.memory.heap.size:

#作业管理器的堆外内存大小。此选项涵盖所有堆外内存使用。
jobmanager.memory.off-heap.size:

在这里插入图片描述

TaskManager 内存

TaskManager内存包含JVM堆内内存、JVM堆外内存以及JVM MetaData内存三大块。

  • JVM堆内内存又包含Framework Heap框架堆内存)和Task Heap任务堆内存)。
  • JVM堆外内存包含
    • Memory memory托管内存,用于保存排序、结果缓存、状态后端数据等。
    • Direct Memory直接内存
      • Framework Off-Heap MemoryFlink框架的堆外内存。
      • Task Off-HeapTask的堆外内存
      • Network Memory:网络内存
/ tm的框架堆内内存
taskmanager.memory.framework.heap.size=

// tm的任务堆内内存
taskmanager.memory.task.heap.size

// Flink管理的原生托管内存
taskmanager.memory.managed.size=
taskmanager.memory.managed.fraction=

// Flink 框架堆外内存
taskmanager.memory.framework.off-heap.size=

// Task 堆外内存
taskmanager.memory.task.off-heap.size=

// 网络数据交换所使用的堆外内存大小
taskmanager.memory.network.min: 64mb
taskmanager.memory.network.max: 1gb
taskmanager.memory.network.fraction: 0.1

window出现的数据倾斜

window数据倾斜是指:数据在不同的窗口内堆积的数据量相差过多,本质上还是不同的Task的数据相差太大。

  1. 在数据进入窗口之前对数据进行预聚合,减少进入窗口的数据量;
  2. 重新设计窗口聚合的key,使不同的窗口的数据量尽量相同;
  3. 使用再平衡的算子,如 rebalance,将数据再次打散,均匀发送到下游。

使用聚合函数处理热点数据

  1. 对热点数据单独处理,可以使热点数据不会影响正常的服务;
  2. 对热点数据拆分聚合,也是单独对热点数据单独处理;
  3. 上游的slot将数据汇聚成一个批次发送到下一个slot中,可以将该批次值设置大点。

Flink vs Spark

Spark Flink
RDD模型 基于数据流,基于事件驱动
微批处理(一个批完成后才能处理下一个) 无界实时流处理(事件在一个节点处理完后发往下一个节点)
处理时间 事件时间,插入时间,处理时间,水印
窗口必须是批的整数倍 窗口类型多
没有状态 有状态
没有流式SQL 有流式SQL
提供统一的批处理和流处理API,支持高级编程语言和SQL 均提供统一的批处理和流处理API,支持高级编程语言和SQL
都基于内存计算,速度快 都基于内存计算,速度快
都支持Exactly-once一致性 都支持Exactly-once一致性
都有完善的故障恢复机制 都有完善的故障恢复机制

泛型擦除

Flink具有一个类型提取系统,可以分析函数的输入和返回类型,自动获取类型信息,从而获得对应的序列化器和反序列化器。由于泛型擦除的存在,在某些情况下,自动提取的信息不够精细,需要采取显式提供类型信息,才能使应用程序正常工作。

集群角色

  • **客户端Client:**代码由客户端获取并装换,然后提交给 JobManager;

  • JobManager:对作业进行调度管理,对作业转换为任务,并将任务发送给TaskManager, 对失败任务做出反应,协调checkpoint

  • **TaskManager:**处理数据任务,缓存和交换数据流(数据从一个tm传到另一个tm

    • **task slot:**资源调度的最小单位,并发/并行处理 task 的数量,一个task slot中可以执行多个算子。
  • **RecourceManager:**负责集群中的资源提供、回收、分配、管理Task slots

  • Dispatcher提交 Flink 应用程序执行,为每个提交的作业启动一个新的 JobMaster

  • **JobMaster:**管理单个JobGraph的执行,每个作业都有自己的 JobMaster

部署模式

  • 会话模式

    所有任务都共享集群中JobManager,所有任务都会竞争集群的资源

    • 适用于短周期、小容量的任务

    • 减少资源和线程的切换

    • 共享一个jobManagerjobmanager压力大

    bin/flink run -c  com.wc.SocketStreamWordCount  FlinkTutorial-1.0.jar
    

在这里插入图片描述

  • 单作业模式

    每个任务都会启动一个单独的集群,集群之间相互独立。

    • 每个任务完成后销毁,最大限度保障资源隔离
    • 每个Job均衡分发自身的JobManager,单独进行job的调度和执行
    • 每个job均维护一个集群,启动、销毁以及资源请求消耗时间长,因此比较适用于长时间的任务执行
    bin/flink run -d -t yarn-per-job -c  com.wc.SocketStreamWordCount  FlinkTutorial-1.0.jar
    

在这里插入图片描述

  • 应用模式

    每个任务都会启动一个jobManager,只是**ApplicationJobManager合二为一。Main方法此时在JobManager中执行**。

    bin/flink run-application -t yarn-application -c com.wc.SocketStreamWordCount FlinkTutorial-1.0.jar
    

在这里插入图片描述

Yarn 运行模式

YARN上运行过程是:客户端ClientFlink应用程序提交给YARNResourceManager, YARNResourceManager会向NM申请容器,启动JobManagerTaskManager的实例,从而启动集群。Flink会根据运行在JobManager上的作业所需要的Slot数量动态分配TaskManager资源。

  1. 通过脚本启动执行。客户端Client基于用户代码,生成流图(StreamGraph),再在JobManager中生成工作图(JobGraph), 同时将任务提交给ResourceManager
  2. ResourceManager选择一个启动NM ,启动ApplicaitonMaster;
  3. ApplicationMaster启动JobManager, 并将工作图(JobGraph)生成执行图(ExecutionGraph);
  4. JobManagerResourceManager申请资源,资源被封装在slot槽;
  5. ResourceManager启动一定数量的TaskManager,分配一定的slot
  6. TaskManagerJobManager注册;
  7. JobManager将要执行的任务分发到TaskManager,执行任务。

Flink on K8s

k8s是一个强大的,可移植的高性能的容器编排工具。这里的容器指的是docker容器化技术,它通过将执行环境和配置打包成镜像服务,在任务环境下快速部署docker容器,提供基础的环境服务。解决之前部署服务速度慢,迁移难,高成本的问题。

k8s提供了一套完整地容器化编排解决方案,实现容器发现和调度,负载均衡,弹性扩容,数据卷挂载等服务。

Flink on k8sFlink on yarn提交比较类似,TaskManagerJobManager等组件变成了k8s pod角色

  1. K8s集群根据提交的配置文件启动K8sMasterTaskManagerK8s Pod对象)
  2. 依次启动FlinkJobManagerJobMasterDeployK8sRM进程(K8s Pod对象);过程中完成slots请求ExecutionGraph
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值