ITPub博客

首页 > 数据库 > 数据库开发技术 > Flink1.13.0 运行架构介绍——不入坑血亏!

Flink1.13.0 运行架构介绍——不入坑血亏!

原创 数据库开发技术 作者:3分钟秒懂大数据 时间:2021-06-26 22:14:14 0 删除 编辑

关注并标星 3分钟秒懂大数据

每天1次,打卡阅读

更快更全面获取大数据技术博客



1、Flink 程序结构


在自然环境中,数据的产生原本就是流式的。无论是来自 Web 服务器的事件数据,证券交易所的交易数据,还是来自工厂车间机器上的传感器数据,其数据都是流式的。但是当你分析数据时,可以围绕 有界流(bounded)或 无界流(unbounded)两种模型来组织处理数据,当然,选择不同的模型,程序的执行和处理方式也都会不同。

批处理 是有界数据流处理的范例。在这种模式下,你可以选择在计算结果输出之前输入整个数据集,这也就意味着你可以对整个数据集的数据进行排序、统计或汇总计算后再输出结果。

流处理 是无界数据流处理的范例。至少理论上来说,它的数据输入永远不会结束,因此程序必须持续不断地对到达的数据进行处理。


Flink程序的基本构建块是流和转换(请注意,Flink的DataSet API中使用的DataSet也是内部流 )。从概念上讲,流是(可能永无止境的)数据记录流,而转换是将一个 或多个流作为一个或多个流的操作。输入,并产生一个或多个输出流。

Flink 应用程序结构就是如上图所示:

Source: 数据源。Flink 在流处理和批处理上的 source 大概有 4 类:

  • 基于本地集合的 source

  • 基于文件的 source

  • 基于网络套接字的 source

  • 自定义的 source

自定义 的 source 常见的有 Apache kafka、RabbitMQ 等,当然你也可以定义自己的 sourc e。 

Transformation:数据转换的各种操作。包含:

Map / FlatMap / Filter / KeyBy / Reduce / Fold / Aggregations / Window / WindowAll / Union / Window join / Split / Select等操作,操作很多,可以将数据转换计算成你想要的数据。 

Sink:接收器。Flink 将转换计算后的数据发送的地点 ,你可能需要存储下来,Flink 常见的 Sink 大概有如下几类:
  • 写入文件、打印出来

  • 写入 socket 

  • 自定义的 sink 。

自定义的 sink 常见的有 Apache kafka、RabbitMQ、MySQL、ElasticSearch、Apa che Cassandra、Hadoop FileSystem 等,同理你也可以定义自己的 sink。


2、Flink 并行数据流


Flink程序在执行的时候,会被映射成一个Streaming Dataflow。一个Streaming Dataflow是由一组Stream和Transformation Operator组成的。在启动时从一个或多个Source Operator开始,结束于一个或多个Sink Operator。 

Flink程序本质上是并行的和分布式的,在执行过程中,一个流(stream)包含一个或多个流分区,而每一个operator包含一个或多个operator子任务。操作子任务间彼此独立,在不同的线程中执行,甚至是在不同的机器或不同的容器上。operator子任务的数量是这一特定operator的并行度。相同程序中的不同operator有不同级别的并行度。

一个Stream可以被分成多个Stream的分区,也就是Stream Partition。一个Operator也可以被分为多个Operator Subtask。如上图中,Source被分成Source1和Source2,它们分别为Source的Operator Subtask。每一个Operator Subtask都是在不同的线程当中独立执行的。一个Operator的并行度,就等于Operator Subtask的个数。
上图Source的并行度为2。而一个Stream的并行度就等于它生成的Operator的并行度。数据在两个operator之间传递的时候有两种模式:
(1)One to One模式:两个operator用此模式传递的时候,会保持数据的分区数和数据的 排序;如上图中的Source1到Map1,它就保留的Source的分区特性,以及分区元素处 理的有序性。
(2)Redistributing (重新分配)模式:这种模式会改变数据的分区数;每个operator subtask会根据选择transformation把数据发送到不同的目标subtasks,比如keyBy()会通过h ashcode重新分区,broadcast()和rebalance()方法会随机重新分区;


3、Task 和 Operator Chain


Flink的所有操作都称之为Operator,客户端在提交任务的时候会对Operator进行优化操 作,能进行合并的Operator会被合并为一个Operator,合并后的Operator称为Operator c hain,实际上就是一个执行链,每个执行链会在TaskManager上一个独立的线程中执行。

4、任务调度与执行



以上三个图是一个图,Flink执行流程如下:

1. 当Flink执行executor会自动根据程序代码生成DAG数据流图 ,即 Jobgraph;

2. ActorSystem创建Actor将数据流图发送给JobManager中的Actor;

3. JobManager会不断接收TaskManager的心跳消息,从而可以获取到有效的TaskManager;

4. JobManager通过调度器在TaskManager中调度执行Task(在Flink中,最小的调度单元就是task,对应就是一个线程) ;

5. 在程序运行过程中,task与task之间是可以进行数据传输的 。

• Job Client

        – 主要职责是提交任务, 提交后可以结束进程, 也可以等待结果返回 ;

        – Job Client 不是 Flink 程序执行的内部部分,但它是任务执行的起点;

       – Job Client 负责接受用户的程序代码,然后创建数据流,将数据流提交给 JobManager 以便进一步执行。执行完成后,Job Client 将结果返回给用户。

• JobManager 

        – 主要职责是调度工作并协调任务做检查点;

        – 集群中至少要有一个 master,master 负责调度 task,协调checkpoints 和 容错;

        – 高可用设置的话可以有多个 master,但要保证一个是 leader, 其他是stand by;

        – Job Manager 包含 Actor System、Scheduler、CheckPoint三个重要的组件 ;

      – JobManager从客户端接收到任务以后, 首先生成优化过的执行计划, 再调度到TaskManager中执行。

• TaskManager

        – 主要职责是从JobManager处接收任务, 并部署和启动任务, 接收上游的数 据并处理 

        – Task Manager 是在 JVM 中的一个或多个线程中执行任务的工作节点。 

        – TaskManager在创建之初就设置好了Slot, 每个Slot可以执行一个任务。


5、任务槽(task slot )和槽共享(Slot sharing)


每个TaskManager是一个JVM的进程, 可以在不同的线程中执行一个或多个子任务。为了控制一个worker能接收多少个task。worker通过task slot来进行控制(一个worker 至少有一个task slot)。

1、任务槽

每个task slot表示TaskManager拥有资源的一个固定大小的子集。 

一般来说:我们分配槽的个数都是和CPU的核数相等,比如8核,那么就分配8个槽。

Flink将进程的内存划分到多个slot中。

图中有2个TaskManager,每个TaskManager有3个slot,每个slot占有1/3的内存。

内存被划分到不同的slot之后可以获得如下好处:
    • TaskManager最多能同时并发执行的任务是可以控制的,那就是3个,因为不能超过slot的数量。 任务槽的作用就是分离任务的托管内存,不会发生cpu隔离。
     • slot有独占的内存空间,这样在一个TaskManager中可以运行多个不同的作业,作业之间不受影响。

总结:task slot的个数代表TaskManager可以并行执行的task数。

2、槽共享

默认情况下,Flink允许子任务共享插槽,即使它们是不同任务的子任务,只要它们来自同一个作业。结果是一个槽可以保存作业的整个管道。允许插槽共享有两个主要好处:

        • 只需计算Job中最高并行度(parallelism)的task slot。只要这个满足,其他的job也都能满足。 
        • 资源分配更加公平。如果有比较空闲的slot可以将更多的任务分配给它。图中若没有任务槽共享,负载不高的Source/Map等subtask将会占据许多资源,而负载较高的窗口subtask则会缺乏资源。 

        • 有了任务槽共享,可以将基本并行度(base parallelism)从2提升到6。提高了分槽资源的利用率。同时它还可以保障TaskManager给subtask的分配的slot方案更加公平。

以上就是Flink 运行架构的讲解内容!觉得好的,点赞,在看,分享三连击,谢谢!!!

End



 找各类大数据技术文章和面经,就来

<3分钟秒懂大数据>

随时更新互联网大数据组件内容

专为学习者提供技术博文

快和身边的小伙伴一起关注我们吧!

作者简介:逆流而上Mr李,秋招7offer,CSDN博客:https://blog.csdn.net/weixin_38201936

原文作者:3分钟秒懂大数据;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-06-15

  • 博文量
    98
  • 访问量
    42101