Linkis架构解析系列---Job执行流程源码解析
1. Job执行在Linkis处在什么位置
Job执行在Linkis的架构中处于统一作业执行服务(Unified Job Execution Services)中,如下图所示:
2. Job处理流程
2.1 Job封装
1. Clinet(如前端)发起请求执行Job,Job请求信息如下:
2. GateWay收到Job后将Job通过executeApplicationName和requestApplicationName转发给对应的Entrance。
3. Entrance接受到对应的Job后,会调用JobHistory的RPC对Job的元信息进行持久化,并对前端的请求进行解析对自定义变量和参数进行封装,封装为可以执行的Job。
2.2 Job的执行
1. 拿到解析后的Job后,Entrance会先为用户去请求一个计算引擎,在请求前先去ResourceManager找到负载最低的EngineManager(引擎管理器);
2. 接着会向负载低的EM请求启动Engine,如果是JDBC和MLSQL没有EM的服务,这步会在Entrance里面进行;
3. EM接收到启动新的Engine后,会先向RM(资源管理器)为这个用户申请资源启动Engine,如果资源足够则准备启动引擎;
4. EM根据申请到的资源启动新的Engine,引擎启动成功后会向EM推送信息,EM接着推送给Entrance,至此引擎的申请流程结束;
5. Entrance请求到Engine后,首先为该Job申请锁定该Engine以防止其他Entrance和Job提交到该Engine;
6. Entrance锁定Engine成功后,会将Job发送给Engine执行,至此Job开始实际执行
这里需要说明的是如果用户存在一个可用空闲的引擎,则会跳过1,2,3,4 四个步骤;
2.3 Job信息推送
1. Job执行过程中为了客户端的用户可以实时看到job的运行状况,Engine会将Job的状态/进度/日志通过RPC实时推送给Entrance;
2. Entrance收到Job信息进行持久化处理,如果是websocket则将信息直接推送给用户;
3. Job执行完成后,Engine会将最终状态和结果集推送给Entrance,Entrance收到后将结果保存到结果集路径,接着更新JobHistory中的状态信息和结果集信息;
4. 客户端通过状态接口判断Job的成功与否,如果成功则可以通过调用接口请求JobHistory拿到结果集信息。至此整个Job则执行完成。
3 Linkis的Job执行源码解读
第三章对Job的处理流程进行了一个简单讲解,本章主要讲解在这一流程中Entrance,EngineManager,Engine的代码调用流程。
3.1.Entrance处理流程
Entrance是Job执行的入口,当Job从GateWay转发后会先到EntranceRestfulApi或者EntranceWebSocketService分别对应Rest和WebSocket请求的逻辑处理。下面我们从WebSocket请求进行讲解,Rest请求类似;
1. 前端的WebSocket请求通过Gateway转发到ServerSocket类,继承了WebSocketAdapter,ServerSocket会调用ControllerServer的onMessage的方法将消息投递到serverListenerEventBus消息总线,serverListenerEventBus接着会将消息给到EntranceWebSocketService进行处理处理部分代码如下:
2. 执行请求处理逻辑:EntranceWebSocketService的dealExecute方法会调用entranceServer.execute去执行Job,entranceServer接着会对job进行解析封装然后提交给调度器。
3. Job执行流程:调度拿到Job后会为这个Job生成一个groupName,然后通过groupName去ConsumerManager获取一个Consumer(分组消费器),并将该Job传递给这个FIFOUserConsumer ,FIFOUserConsumer 接着会循环去BlockingLoopQueue里面取Job进行消费,拿到Job后FIFOUserConsumer 会请求一个引擎,接着将该Job提交给线程池运行。
Job线程运行起来后首先会将该Job请求提交给远程Engine进行执行,并拿到响应,为了提升Job的性能,这里一般会返回AsynReturnExecuteResponse(异步返回的请求响应) 用于将Job的状态和信息都异步返回回来,该线程可以直接执行完降低线程开销
4. Job信息推送:Job信息推送为Engine通过RPC推送给Entrance,Entrance再通过WebSocket推送给用户,或者用户通过Rest请求。
3.2 EngineManager
引擎管理器EngineManager是用来管理引擎的,用于对引擎的生命周期进行管理,当Entrance中的Consumer发起askExecutor时会将PRC请求发送给EngineManagerReceiver,
EM接收到消息会先向RM判断该用户和Creator是否还有足够的资源启动引擎,资源判断通过后才会发起引擎启动
Engine的正常退出流程分为两种1、用户发起kill命令,通过EM 杀掉Engine 2、Engine空闲时间过长自行kill,默认一个小时
用户调用kill后会EM会调用:engineManager.getEngineManagerContext.getOrCreateEngineFactory.delete
3.3.Engine处理流程
Engine启动成功后就可以接受Entrance的job请求,执行并推送Job信息给到Entrance,Entrance的job请求会发送到EngineReceiver
engine的Job执行调度流程和Entrance的相同,除了实现类不一样都是通过Scheduler--Consumer--Executor--Executor执行Job,这里需要说明的是Executor对应的是相应Engine的具体执行代码的实现类不是Engnie,这是与Entrance有区别的地方,执行流程也主要在Executor进行实现的:
Job信息通过JobDemo定时进行推送:
3.4 Linkis的Job架构概括
上面从入口、引擎管理器、引擎介绍了一个Job的整体执行流程,Job执行的整体的调用链可以总结为下图:
4. 总结
本文从Job在Linkis 0.X版本中所处的位置进行引入,介绍了一个Job从提交到封装、运行、信息推送的整个流程和源码解析。在Linkis1.0版本中我们对Job执行做了多个优化:
1. 任务标签化:灵活的通过标签做租户隔离,智能路由对应的引擎服务,并支持通过标签指定提交的Hadoop集群等;
2. 任务全栈化:支持在交互作业的基础上,支持流式、一次性批量等作业类型;
3. 任务解析策略化:借鉴Calcite思想,对任务进行编排优化,支持更多的计算策略,智能调度执行;
4. 服务简化:统一Entrance和EngineManager服务,底层计算存储引擎只需要实现引擎插件(EngineConnPlugin)就可以完成新引擎的实现,不在需要实现Entrance和EngineManager服务。
Linkis1.0 新的架构对多个模块进行了架构调整和优化,敬请期待,同时Linkis1.0有多个模块正在开发实现当中,欢迎社区各位大佬的加入。
本文从Job在Linkis中所处的位置进行引入,介绍了一个Job从提交到封装、运行、信息推送的整个流程和源码解析。后续将为大家带来Linkis更多模块的代码解析,敬请期待。
扫码关注我们
微信号公众号 : WeDataSphere
GitHub:WeDataSphere
如果喜欢我们的产品或文章,请给我们的GitHub点上你宝贵的star和fork哦~~
WeDataSphere,BIG DATA MADE EASY.
用心做一个有温度的开源社区
~欢迎关注~
欢迎加入我们的有奖征文活动哦,详见如下链接~
同时诚挚的希望您点开“阅读原文”,在OSC开源投票中,为Linkis与DataSphere Studio投上您宝贵的一票哦~~
本文分享自微信公众号 - WeDataSphere(gh_273e85fce73b)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
想成为全栈工程师,要做到哪几点?
导读:如何成为一名全栈工程师?需要具备哪些技术积累?成为全栈工程师有哪些好处?希望本文能为期望成为全栈工程师的同学提供一点帮助,和同学们一起分享交流。 作为开发者,我们不过度区分服务端 server 客户端 client,我们是 web developer,从事 web 开发,多去理解技术和实践落地。 成为全栈工程师的道路 成为全栈工程师说不上难也说不上容易,其中技术积累占了很大一部分: 1. 紧跟前沿 掌握足够多的输入。 关注海外社区新消息发布,业界的新产品新技术,学会高质量的获取信息,坚持做和习惯做。 2. 注重学习 & 不断实践 有属于自己的思考和严谨的产出。 掌握高效学习方法,比如我们最近在做 K8s 容器集群相关的事情,需要理解底层设计和做集群调度,需要学习 Golang,新技术的学习过程: 投资一个好的 IDE,例如 Webstorm、Goland、IntelliJ IDEA 等,坚持使用。 认准官方文档,坚持学习。 API 手册查看,不断熟悉和记忆。 写学习总结,形成良性循环:定义功能 -> 代码设计 -> 完成功能 -> 重构优化 -> ...
- 下一篇
七大关于DevOps的误解,你中了几招?
开发人员社区中流传着大量的DevOps神话。考虑到近年来DevOps概念的流行,这并不奇怪。 DevOps是鼓励采用敏捷思维来提高软件交付过程的速度和质量的实践。在DevOps中,开发团队与运维团队的相互合作,贯穿整个软件生命周期,二者对自己的具体任务负责但并不真正在一起工作。 如果实施得当,DevOps方法可以为组织带来显著的积极影响。它可以降低成本,提高效率,并使开发团队的工作更加精简。为了掌握这个过程的优势,有必要认识到DevOps是什么、不是什么。在本文中,就将讨论一些流传甚广的关于DevOps的一些误解。 ×DevOps就是CI和CD 关于DevOps最大的误解之一是它与CI/CD是一回事。事实上,持续集成和交付只是DevOps生命周期的一环,是Devps的关键组件。 DevOps注重团队的文化和责任感,它强调团队中的每个人都需要参与彼此的任务,这样可以提高团队中的协作和沟通能力。 另一方面,CI/CD通过强调自动化的软件和工具实现了这种沟通的文化,所以可以将CI/CD看作达到DevOps的手段。 ×DevOps意味着NoOps NoOps的概念描述了云基础设施足够自动化,以...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8编译安装MySQL8.0.19
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题