在官方开始之前,我想鼓励所有人。我们知道,启动大师实际上是启动Masterserver,这与其他Springboot Projects基本相似,也就是说,即创业公司内部的主要功能。但是在开始实践练习之前,必须有许多人,尤其是初学者,突然发现Bean注入了十几个自动人士。
多种豆子的注射造成了雾气,不是少数派感到攻击性。但是作者想说的是,这些实际上是在吓到你,然后我们将正式开始。
第一个类别:MasterConfig,MasterRegistryclient,MasterschedulerService,调度程序和其他BEAN。从字面上看,MasterConfig配置了Master。MasterRegistryClient负责与注册相关的内容。
第二类是:这些后缀是一堆procesors,例如taskexecuterunningprocessor。相同的后缀必须处理相同的任务,并且将来必须将其加载。
第三类:是EventExeCuteservice和DifoverExecutEthread。这些可以根据事件的名称和灾难恢复的转换大胆地猜测它。这些必须在主内部,理论上应该返回第一类。
第四类:对于LoggerRequstProcessor,与打印日志有关。至于这样的特定内容,稍后将详细介绍。
执行主方法后,基于弹簧特征执行运行方法。在运行方法中,创建了NetTyRemotingServer对象(此对象未由Spring管理,而是直接创建)。然后将一堆处理器放入Netty的处理器中的第二种处理器。可以从这里推断出大师和工人之间的通信必须是Netty。
我们可以查看以下代码,实际上,bean的第一类执行初始化和开始方法。
总而言之,实际上,主人就像首席指挥官。该指挥官-in-司令称bean内部的开始方法。这些豆开始执行自己的功能。至于这些豆类中什么样的功能,Mastersever太懒了,无法管理,因此不必进行管理。这是正确的。
本节的摘要:
在这一点上,大师赛正在运行。在下一部分中,我们将一一分析每个Bean的使用和功能。
MasterConfig从application.yml到MasterConfig类获得了配置信息,并且获得的特定配置信息如下。
在MasterServer中,MasterRegisterConfig将执行init()和start()方法。
init()方法已经建立了一个新的心跳池。注意,目前只有一个线程池,其中没有心跳。
start()方法从ZK获得锁(Expord),注册信息和用户。
注册信息做了两件事:
首先:构建心跳信息并将其扔进线池中以执行心跳任务。
第二:临时注册ZK中的主信息,然后删除无用的主信息。
心跳任务是检查是否有死亡节点和每10s(HeartbeatInterval)注册最新的机器信息,包括机器CPU,内存,PID等。
只要注册信息更改,订阅的信息就会立即感知。如果添加了机器,将打印日志。还原机器,同时删除并打印日志。此部分如下图所示:
前两个部分来自Masterserver的启动过程和MasterRegisterConfig的注册过程。注册完成后,主人如何管理,我们如何同时管理它以及如何将其保存到数据库中。对于此部分的内容。
ServernodeManager实现了初始化界面。基于弹簧的特征,将执行此对象后,将执行AfterPropertiesset()方法。执行三件事:
几乎所有更新操作都是通过重新输入锁来实现的,以确保系统在多线程系统中安全。此外,还有另一个细节,如果删除了节点,则将发送警告信息。
MasterProrityqueue有一个哈希图。每台机器都对应于一个索引,该索引以这种方式构建了一个插槽。当我转到主信息时,我通过此索引找到了它。
至于MasterBlockingqueue队列的内容,如何同步到数据库,如何将数据放到队列和队列以删除数据等。这些都是纯粹的CRUD内容,读者可以自己阅读。
2.1至2.3描述全部与ZK管理的节点信息有关。我们为什么首先讨论主启动之后的节点信息?
原因实际上很简单,因为无论是最终分析中的主人还是工人,它都是机器。如果这些机器崩溃或增加,DS不知道,这是不知道该机器的浪费。正常运行并且配置是正常的,它是管理的,因此DS操作可以平稳运行。类似,其他大数据组件相似。
上一个MasterServer中的MasterRregisterClient执行INIT()和start()方法,然后MasterschedulerService执行INIT()和start()方法。从这里开始,它确实进入了Master的工作阶段。
init()方法是由主pre-exec-exec-thread线程池和netty客户端创建的。
预先进行的线程池中有固定的10个线程(在2.1中,MasterConfig配置中的前注线程)。这些线程通过命令的ProcessInstance进程处理。
开始方法是启动状态WhelexecutorthRead的过程。该线程致力于检查检查任务,过程,工作流超时和任务状态的过程。
其中,MasterSchedulerService本身继承了线程类,在开始方法后,立即执行运行方法。确保计算机在运行方法中具有足够的CPU和内存,并且执行了ScheduleProcess方法。,将在2.5中解释。
ScheduleProcess方法scheduleprocess在Masterschedulevice中的段落周期,因此它将依次执行以下4种方法。
该线程池已移交给弹簧管理,属于背景线程。该线程池的最大数量和核心数为100(MasterConfig.getExectHreads)。如下图所示:
这里有两个细节要解释,
第一:WorkFlowExecutEthread。它不会继承线程类,而是一个普通的类。只有名称背后的线程,因此在阅读时找不到启动或运行方法。
第二:如果在SchedulerProcess方法中找到了ProcessInstance,那是时候了
它将移交给2.4个状态WhelexecuteThread,以删除ProcessInTestance。
StartProcess方法是首先查看图片。
StartProcess有三件事,并且buildflowDag()构建dag,inittaskqueue()初始化任务队列和submitpostnode()提交的节点。
DAG如何做最初队列中发生的事情,以及提交节点后发生的事情,它将在第2.7至2.9章中解释。
根据buildflowDag中的代码,执行过程已排序,这是以下9个步骤:
基本逻辑是上述步骤。当然,每个步骤在逻辑上都会更加逻辑,但是数据结构实际上是通过数据结构更改的。如果读者写了一个业务代码,这一定不是陌生的。因此,我不会详细解释。
可能有读者是什么。以下是DAG的简短链接。阅读后不难理解。
https://dolphinscheduler.apache.org/zh-cn/blog/dag.html
该链接理论上引入了DAG。如果DAG想要在实践中有更深入的了解,请在DAO模块的测试文件夹下搜索Daghel pertstest类。Debug表单)将对DAG有更深入的了解。
与本节相关的链接有两个链接。这两个链接是关于DAG中任务关系的转换,也就是说,保存任务的1.3版本之间的关系仅以字段的形式保存。后来,在发现数据量很大之后,这是不可行的,因此该字段被拆除为多个表。阅读器可以阅读它。
https://dolphinscheduler.apache.org/zh-cn/blog/dolpheduler_json.html
https://dolphinscheduler.apache.org/zh-cn/blog/json_split.html
构造DAG(带有无环图)的目的是拖动在前端拖动的任务,以告诉主任务的执行顺序,即告诉主任务首先执行并执行哪些任务。
Inittaskqueue做了3件重要的事情:(我认为这种Inittaskqueue方法的名称不是很好,并且可能会感觉到Inittask或InittaskMap会更好。由于队列很容易被误认为队列,因此此方法仅构建4个映射,并且可以构建4个地图。队列仅放置可以检索的任务。在以下各章中,此队列更有用。)
SubmistPostNode做了6件事:最重要的是最后两件事,将TaskInstance放入队列和更新过程实例中。更新过程实例纯粹是更改数据结构,这并不困难。如何处理该任务队列,接下来会做什么,
也就是说,SubmistStandByTask的做事将在后续章节中解释。
原始:https://juejin.cn/post/70993783963372895