Flink学习之理论基础

Posted 柳小葱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flink学习之理论基础相关的知识,希望对你有一定的参考价值。

💖 最近谈恋爱了,开心!恋爱归恋爱,学习归学习,今天就步入大数据实时领域吧,实习的这段期间接触较多的就是离线处理,hadoop和spark引擎已经比较熟悉了,而实时调度接触较少,但却有着无限大的发展潜力,一定是未来数据发展的一个趋势,今天我们就从当下最火的实时计算框架Flink开始,开启实时数据的新篇章。给大家推荐几个网址👇:

🌹flink就凸显一个计算又快又准,sparkstream运行时间是秒级别的,而flink是毫秒级别的,虽然大多数实任务秒级别的延迟已经很够用了,但是flink可以做得更好, 且对事件驱动型应用、数据分析型应用和数据管道型应用 (ETL)有着更加规范的接口。

1. Flink介绍

1.1 Flink 是什么?

大家都知道hadoop和spark,都是分布式的计算框架,flink也是这样一种计算框架,与前2者不同的是,Flink 是一个开源的基于流的有状态计算框架(spark虽然也有流,但本质上是批)。它是分布式地执行的,具备低延迟、高吞吐的优秀性能,并且非常擅长处理有状态的复杂计算逻辑场景。flink有4个特点:

  • 低延迟
  • 有状态
  • 高吞吐
  • 分布式

基本结构如下:(现在不用看懂)

1.2 flink的起源

Apache Flink 是 Apache 开源软件基金会的一个顶级项目,和许多 Apache 顶级项目(比如:hadoop和spark)一样,如 Spark 起源于 UC 伯克利的实验室, Flink 也是起源于非常有名的大学的实验室——柏林工业大学实验室。(如果hadoop的大象图标暗示着数据量的大,那么flink的松鼠图标即预示着处理数据的快)。

1.3 flink的发展

Flink 项目非常活跃,从2014年5月被被贡献到 Apache 软件基金会后,2014 年的 8 月 27 号发布了孵化器里的第一个版本 v0.6- incubating。由于 Flink 项目吸引了非常多贡献者参与,活跃度等方面也都非常优秀,它在 2014 年 12 月成为了 Apache 的顶级项目。

  • 发展到目前为止已成为国内外实时计算事实标准。

1.4 流式计算引擎的发展

  • 第一代:以Apache Storm为例,是一个纯流的设计,延迟非常的低,但是它的问题也比较明显,即没有办法避免消息的重复处理,从而导致数据正确性有一定的问题。
  • 第二代:以Spark Streaming 为例,解决了流计算语义正确性的问题,但是它的设计理念是以批(微批)为核心,最大的问题是延迟比较高,只能做到 10 秒级别的延迟,端到端无法实现秒以内的延迟。
  • 第三代:Flink 流计算引擎,也是最新一代的流计算引擎。它既可以保证低延 迟,同时又可以保证消息的一致性语义,对于内置状态的管理,也极大降低了应用程序的复杂度。

2. Flink运行架构

2.1 flink运行组建

因为 Flink 是用 Java 和 Scala 实现的,所以所有组件都会运行在 Java 虚拟机上,其中比较重要的有2个部分:JobManager和TaskManager

2.1.1 JobManager

JobManager控制一个应用程序执行的主进程,也就是说,每个应用程序都会被一个不同的 JobManager 所控制执行。JobManager 会先接收到要执行的应用程序,这个应用程序会包括: 作业图(JobGraph)、逻辑数据流图(logical dataflow graph)和打包了所有的类、库和其它 资源的 JAR 包。JobManager 会把 JobGraph 转换成一个物理层面的数据流图,这个图被叫做 “执行图”(ExecutionGraph),包含了所有可以并发执行的任务。JobManager 会向资源管 理器(ResourceManager)请求执行任务必要的资源,也就是任务管理器(TaskManager)上 的插槽(slot)。一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的 TaskManager 上。而在运行过程中,JobManager 会负责所有需要中央协调的操作,比如说检 查点(checkpoints)的协调。

2.1.2 TaskManger

Flink 中的工作进程。通常在 Flink 中会有多个 TaskManager 运行,每一个 TaskManager都包含了一定数量的插槽(slots)。插槽的数量限制了 TaskManager 能够执行的任务数量。 启动之后,TaskManager 会向资源管理器注册它的插槽;收到资源管理器的指令后, TaskManager 就会将一个或者多个插槽提供给 JobManager 调用。JobManager 就可以向插槽分配任务(tasks)来执行了。在执行过程中,一个 TaskManager 可以跟其它运行同一应用程 序的 TaskManager 交换数据。

2.1.3 ResourceManager

ResourceManager主要负责管理任务管理器(TaskManager)的插槽(slot),TaskManger 插槽是 Flink 中定义的处理资源单元。Flink 为不同的环境和资源管理工具提供了不同资源管理器,比如 YARN、Mesos、K8s,以及 standalone 部署。当 JobManager 申请插槽资源时,ResourceManager 会将有空闲插槽的 TaskManager 分配给 JobManager。如果 ResourceManager 没有足够的插槽来满足 JobManager 的请求,它还可以向资源提供平台发起会话,以提供启动 TaskManager 进程的容器。另外,ResourceManager 还负责终止空闲的 TaskManager,释放计算资源。

2.1.4 Dispatcher

Dispatcher可以跨作业运行,它为应用提交提供了 REST 接口。当一个应用被提交执行时,分发器就会启动并将应用移交给一个 JobManager。由于是 REST 接口,所以 Dispatcher 可以作为集 群的一个 HTTP 接入点,这样就能够不受防火墙阻挡。Dispatcher 也会启动一个 Web UI,用 来方便地展示和监控作业执行的信息。Dispatcher 在架构中可能并不是必需的,这取决于应 用提交运行的方式。

2.2 flink任务提交流程

flink大致的任务提交流程如下

  1. 首先是app提交应用给Dispatcher(通道 ).
  2. Dispatcher将应用传送给JobManager
  3. JobManager向ResourceManager请求任务资源
  4. ResourceManager收到请求启动TaskManger,TaskManger找到自己可用的资源slots(卡槽)
  5. ResourceManager根据ResourceManager和TaskManger的要求发出提供slot的指令
  6. ResourceManager和TaskManger直接通信,完成任务。

flink部署在yarn上时任务的调度

  1. Flink 任务提交后,Client 向 HDFS 上传 Flink 的 Jar 包和配置,之后向 Yarn ResourceManager 提交任务,ResourceManager 分配 Container 资源并通知对应的 NodeManager 启动 ApplicationMaster。
  2. ApplicationMaster 启动后加载 Flink 的 Jar 包 和配置构建环境,然后启动 JobManager,之后 ApplicationMaster 向 ResourceManager 申请 资 源 启 动 TaskManager , ResourceManager 分 配 Container 资 源 后 , 由 ApplicationMaster 通 知 资 源 所 在 节 点 的 NodeManager 启 动 TaskManager , NodeManager 加载 Flink 的 Jar 包和配置构建环境并启动 TaskManager,TaskManager 启动后向 JobManager 发送心跳包,并等待 JobManager 向其分配任务。

2.3 flink任务调度原理

flink任务调度图如下:

  1. 客户端不是运行时和程序执行的一部分,但它用于准备并发送 dataflow(JobGraph)给 Master(JobManager),然后,客户端断开连接或者维持连接以等待接收计算结果。
  2. 当 Flink 集群启动后,首先会启动一个 JobManger 和一个或多个的 TaskManager。由 Client 提交任务给 JobManager,JobManager 再调度任务到各个 TaskManager 去执行,然后 TaskManager 将心跳和统计信息汇报给 JobManager。 TaskManager 之间以流的形式进行数据的传输。上述三者均为独立的 JVM 进程。
  3. Client 为提交 Job 的客户端,可以是运行在任何机器上(与 JobManager 环境连通即可)。提交 Job 后,Client 可以结束进程(Streaming 的任务),也可以不 结束并等待结果返回。
  4. JobManager 主要负责调度 Job 并协调 Task 做 checkpoint,职责上很像 Storm 的 Nimbus。从 Client 处接收到 Job 和 JAR 包等资源后,会生成优化后的执行计划,并以 Task 的单元调度到各个 TaskManager 去执行。
  5. TaskManager 在启动的时候就设置好了槽位数(Slot),每个 slot 能启动一个 Task,Task 为线程。从 JobManager 处接收需要部署的 Task,部署启动后,与自己的上游建立 Netty 连接,接收数据并处理。

3. 参考资料

  • 《尚硅谷大数据之flink教程》
  • 《Flink必知必会》
  • 《从0到1学会 Apache Flink》

以上是关于Flink学习之理论基础的主要内容,如果未能解决你的问题,请参考以下文章

(2021-03-11)大数据学习之Flink基础概念以及简单Demo

机器学习之----VC维理论基础及证明

机器学习之理论篇—线性模型

Flink学习之DataStream API(python版本)

Flink学习之DataStream API(python版本)

Flink学习之Table API(python版本)