深入理解 Flink(八)Flink Task 部署初始化和启动详解

JobMaster 部署 Task

核心入口:

JobMaster.onStart();

部署 Task 链条:JobMaster --> DefaultScheduler --> SchedulingStrategy --> ExecutionVertex --> Execution --> RPC请求 --> TaskExecutor

TaskExecutor 处理 JobMaster 的 submitTask RPC 请求

JobMaster 向 TaskExecutor 发送 submitTask() 的 RPC 请求,用来部署 StreamTask 运行。TaskExecutor 接收到 JobMaster 的部署 Task 运行的 RPC 请求的时候,就封装了一个 Task 抽象,然后通过一个线程来启动这个 Task。

Task 构造方法

在 Task 的构造方法中,也做了一些相应的初始化动作,大致总结一下;

  • 封装得到一个 TaskInfo 对象
  • 创建得到一个 上下文对象
  • 初始化输出组件:ResultPartition + ResultSubPartition
  • 初始化输入组件:InputGate + InputChannel
  • 初始化一个线程对象,用来执行当前这个 Task
  • TaskManagerServices 在 TaskExecutor 启动的时候,被创建好了,它内部创建了 ShuffleEnvironment,具体实现是 NettyShuffleEnvironment
    • NettyShuffleEnvironment 创建了 ConnectionManager,内部初始化和启动了 NettyClient 和 NettyServer
    • NettyShuffleEnvironment 内部创建了 ResultPartitionFactory 和 SingleInputGateFactory 用来创建输入输出组件
    • 当前 Task 初始化时会通过 NettyShuffleEnvironment 创建对应的输入输出组件
      • 输入组件:InputGate 和 InputChannel,通过 SingleInputGateFactory 创建
      • 输出组件:ResultParition 和 ResultSubpartition,肯定是通过 ResultPartitionFactory 创建的

在这里插入图片描述
在这里插入图片描述
所有 channel 共用同一个 netty 客户端,通过 inputChannelId 区分消息是属于哪个 inputChannel。同理,所有 ResultSubPartition 共用同一个 netty 服务端,通过 channelIndex 区分消息是属于哪个 ResultSubPartition。

Task 执行(线程启动)

Task 的启动,是通过启动 Task 对象的内部 executingThread 来执行 Task 的,具体逻辑在 run 方法中。当 invokable.invoke(); 执行的时候,Task 就真正执行起来了。根据上述代码的执行可知:一个 Task 的状态周期:

CREATED ----> DEPLOYING ----> INITIALIZING ----> RUNNING ----> FINISHED

StreamTask 初始化

这个地方的初始化,指的就是 SourceStreamTask 和 OneInputStreamTask 的实例对象的构建。
Task 这个类,只是一个笼统意义上的 Task,就是一个通用 Task 的抽象,不管是批处理的,还是流式处理的,不管是源 Task, 还是逻辑处理 Task, 都被抽象成 Task 来进行调度执行。

SourceStreamTask 和 OneInputStreamTask 初始化

在 SourceStreamTask 的 processInput() 方法中,主要是启动接收数据的线程 LegacySourceFunctionThread。

StreamTask 执行

Flink 的 MailboxProcessor 详解

在 Flink-1.9 之前,StreamTask 中的多线程互斥通过一个 CheckpointLock 来解决。Flink 从 1.9 版本之后引入基于 Actor 模型的 Mailbox 设计理念来取代 StreamTask 中现有的多线程模型,变为了单线程(MailboxProcessor) + 阻塞队列(Mailbox) 的形式。

Flink StreamTask 对接数据源

SourceStreamTask 与 OneInputStreamTask/TwoInputStreamTask 的不同之处在于 mainOperator 中的 userFunction。

SourceStreamTask

SourceStreamTask 的 processInput() 内部 通过 LegacySourceFunctionThread 来对接数据源,不停的获取一条一条的数据,通过 output 组件交给后面。

OneInputStreamTask 和 TwoInputStreamTask

OneInputStreamTask 或者 TwoInputStreamTask 是通过 StreamInputProcessor 来获取输入数据,然后执行处理。

RecordWriter 的具体实现是什么呢:

  1. ChainingOutput:一个 OperatorChain 中的前一个 Operator 输出数据到下一个 Operator
  2. RecordWriterOutput: 负责当前这个 OperatorChain 最后的执行结果,输出到该 Task 的 ResultPartition 内部的某个 ResultSubPartition

Flink OneInputStreamTask 获取输入数据

关于 OneInputStreamTask 获取 Buffer 数据的时候,其实涉及到两部分的逻辑:

  • getChannel() 阻塞在 inputChannelsWithData 上获取准备就绪的 InputChannel。
  • 当前这个 StreamTask 如果接收到上游 StreamTask 发送过来的数据,则 CreditBasedPartitionRequestClientHandler 的 channelRead() 调用执行数据解析,然后将该数据对应的 InputChannel 加入到 inputChannelsWithData 队列中。

当 StreamTask 接收到某个 InputChannel 发送过来的数据的时候,就会把这个 InputChannel 和 Buffer 数据加入到 inputChannelsWithData 队列中,然后环境 pollNextBuffer 的执行逻辑,就能获取到 Buffer,执行接下来的 processElement 方法了。

Flink Task 的 InputChannel 数据处理就是典型的生产者消费者模式(wait + notifyAll)
在这里插入图片描述

Flink StreamTask 执行 Record 逻辑处理

SourceStreamTask 和 OneInputStreamTask 在接收到数据执行处理之后,都通过一个 output 执行向下输出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/343502.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库系统概念 第七版 中文答案 第3章 SQL介绍

3.1 将以下查询使用SQL语言编写,使用大学数据库模式。 (我们建议您实际在数据库上运行这些查询,使用我们在书籍网站db-book.com上提供的示例数据。有关设置数据库和加载示例数据的说明,请参阅上述网站。) a. 查找计算机…

fiddler筛选请求并修改参数

一、筛选请求 使用过滤,需勾选User Filter才会生效,运行当前的过滤规则,需点击Run Filterset now Hosts:主机过滤之局域网过滤 No Zone Filter:默认选项,不设置区域过滤器show only Intranet Hosts&…

Linux上如何一键安装软件?yum源是什么?Linux如何配置yum源?

这几个问题是Linux操作的入门问题,但是确实也会让刚上手Linux小伙伴头疼一阵,故特有此文,希望能对刚入门的小伙伴有一些帮助~ 众所周知 在linux上在线安装软件需要用到yum命令,经常下述命令来安装 yum install [-y] 包名 #-y的…

安全强化学习笔记

这里写自定义目录标题 参考资料环境算法CPO 2017 ICMLPCPO 2019 ICLRFOCOPS 2020 NIPSCRPO 2021 ICMLCUP 2022 NIPS TRPO 如何看懂TRPO里所有的数学推导细节? - 小小何先生的回答 - 知乎 参考资料 Safe Reinforcement Learning 安全/约束强化学习路线图(Safe RL…

如何使用人工智能优化 DevOps?

DevOps 和人工智能密不可分,影响着各种业务。DevOps 可以加快产品开发速度并简化现有部署的维护,而 AI 则可以改变整个系统的功能。DevOps团队可以依靠人工智能和机器学习来进行数据集成、测试、评估和发布系统。更重要的是,人工智能和机器学…

Unity中BRP下的深度图

文章目录 前言一、在Shader中使用1、在使用深度图前申明2、在片元着色器中 二、在C#脚本中开启摄像机深度图三、最终效果 前言 在之前的文章中,我们实现了URP下的深度图使用。 Unity中URP下使用屏幕坐标采样深度图 在这篇文章中,我们来看一下BRP下深度…

HarmonyOS——ArkUI状态管理

一、状态管理 在声明式UI编程框架中,UI是程序状态的运行结果,用户构建了一个UI模型,其中应用的运行时的状态是参数。当参数改变时,UI作为返回结果,也将进行对应的改变。这些运行时的状态变化所带来的UI的重新渲染&…

HTTP 常见协议:选择正确的协议,提升用户体验(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

Java研学-分页查询

一 分页概述 1 介绍 将大量数据分段显示,避免一次性加载造成的内存溢出风险 2 真假分页 ① 真分页   一次性查询出所有数据存到内存,翻页从内存中获取数据,性能高但易造成内存溢出 ② 假分页   每次翻页从数据库中查询数据&#xff0c…

《国产信创之光》专栏完毕感言

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 前2天写完最后一篇计划中的国产信创之光专栏的博文《在统信UOS Linux下用opencv-python捕获摄像头输入保存到视频文件》,这个专栏计划中要发表的内容都发表了,专栏的写作任务顺利完成…

如何准确评估数字化服务商的能力与水平?只需看这6大能力即可

本文主要帮大家解决3个核心问题: 如何找到真正适合自己的数字化服务产品和解决方案?如何准确评估数字化服务商的能力和水平?企业数字化转型解决方案服务商有哪些推荐? 数字化浪潮汹涌来袭,全面推进数字化转型已经成为…

Python入门0基础学习笔记

1.编程之前 在编写代码之前,还有两件事需要做: 安装 Python 解释器:计算机是没法直接读懂 Python 代码的,需要一个解释器作为中间的翻译,把代码转换成字节码之后再执行。 Python 是翻译一行执行一行。一般说的安装 …