×

Taier分布式可视化DAG任务调度系统

消耗积分:2 | 格式:zip | 大小:11.01 MB | 2022-06-14

李林

分享资料个

授权协议 Apache 2.0
开发语言 Java TypeScript
操作系统 跨平台
软件类型 开源软件

软件简介

Taier是袋鼠云数栈大数据家族的开源项目之一 ,它是一个分布式可视化的DAG任务调度系统,旨在降低ETL开发成本、提高大数据平台稳定性,让大数据开发人员可以在Taier直接进行业务逻辑的开发,而不用关心任务错综复杂的依赖关系与底层的大数据平台的架构实现,将工作的重心更多地聚焦在业务之中。

一、架构设计和功能详解

在架构设计与功能特点上,Taier整体架构是使用插件式的开发模式,在任务开发下面有调度模块和各项组件,也包括数栈开源家族的Chunjun等等。

poYBAGKhzbSAZhb7AAEyVzhN-a0307.png

(一)Taier功能特点

Taier的功能特点有下面几个比较重要的方面:

1.任务类型Spark SQL、数据同步(流计算任务);

2.控制台:包括队列管理、资源管理、多集群管理等;

3.运维中心:比如任务管理、周期调度、补数据等;

4.插件化开发:具体包括 taier-plugin、、DatasourceX、Chunjun等几个插件。

poYBAGKhzbaAD5AOAAJJa2jHggI230.png

(二)Taier功能特征

随着不断更新完善,现在的Taier已经具有以下的几种特性:

1、拓展性

  • 单点故障:去中心化的分布式模式

  • 高可用方式:Zookeeper

  • 过载处理∶分布式节点+两级存储策略+队列机制。每个节点都可以处理任务调度与提交;任务多时会优先缓存在内存队列,超出可配置的队列最大数量值后会全部落数据库;任务处理以队列方式消费,队列异步从数据库获取可执行实例

  • 实战检验:得到数百家企业客户生产环境实战检验

2、易用性

  • 支持大数据作业Spark、Flink的调度;

  • 支持众多的任务类型,目前支持Spark SQL、Chunjun

  • 可视化工作流配置︰支持封装工作流、支持单任务运行,不必封装工作流、支持拖拽模式绘制;

  • DAG监控界面:运维中心、支持集群资源查看,了解当前集群资源的剩余情况、支持对调度队列中的任务批量停止、任务状态、任务类型、重试次数、任务运行机器、可视化变量等关键信息一目了然;

  • 调度时间配置:可视化配置;

  • 多集群连接:支持一套调度系统连接多套Hadoop集群。

3、多版本引擎

  • 支持Spark 、Flink等引擎的多个版本共存,例如可同时支持Flink1.10、Flink1.12(后续开源)

  • Kerberos支持Spark、Flink

  • 丰富,支持3种时间基准,且可以灵活设置输出格式。

4、拓展性

  • 设计之处就考虑分布式模式,目前支持整体Taier 水平扩容方式;调度能力也随集群线性增长。

 

二、Taier重要概念

下面从原理和操作层面给大家进一步介绍Taier,还有一些具体概念的解释。

pYYBAGKhzbiAW8B2AAI784FywuE674.png

(一)任务与实例

方便起见,数栈在Taier中提出“任务”和“实例”两个概念,例如数据开发的数据同步这项工作称之为“任务”,而已经提交并且配置了周期属性的任就称之为“实例”。

poYBAGKhzbmAceE6AAD5Qt5iQVQ003.png

(二)实例具体操作

在Taier中,实例有这几种构建的方式:

1.基于Zookeeper选举Master节点参与Job 实例构建,T+1构建JobGraph

2. JobGraph构建前check &clean DirtyData

3.依据Task、TaskTask的数据(JobGraph)生成Job .JobJob实例数据

4.Master节点控制实例数据的负载均衡持久化入数据库

pYYBAGKhzbyAPx6IAAEzl6MA0IE084.png

构建完毕后,实例处理的几种方式如下图所示:

pYYBAGKhzb2AIY0mAAD7YKXUZFA720.png

其中:

1.三种任务类型:周期任务、补数据任务、重跑任务,统一调度方式

2. Job 优先入队列(1),队列容量不足入DB (2)

3.当队列容量空余时,异步线程从DB加载数据入队列(3)

4. Job出队列后进行任务提交

 

处理完成后,实例提交我们也做了思考,具体设计:

1.内存优先级队列,控制Job有序执行

2.多线程并发提交(可配置)

3. Job 执行超时判断(可配置)

4. Job资源不足/失败重试进入延迟队列(可配置)﹔避免长时间占用提交权

poYBAGKhzb-AOZHoAACV21hxTVU818.png

 

Taier 的实例状态大家主要应该关注标志停止的几个,具体有下面几种:

1. WaitEngine:内存队列中的Job、内存容量不足存储在DB中的Job(默认500 )

2. Lacking:资源不足暂时等待的Job(默认2min)

3. Restarting:失败重试的Job(默认2min )

4. Finshed、Failed、Canceled、Killed:结束状态

pYYBAGKhzcCATMO_AADlEQhvU2I219.png

Taier的整个控制台设计分为公共组件、调度组件、存储组件和计划组件。通过一个租户ID,拿到这个集群下common, YARN-conf等的四个配置信息,组成包含一个任务插件所有信息的pluginlnfo。将它解析之后,一些资源初始化上传,以便我们缓存对应的客户端。 

poYBAGKhzcKAe_HOAAEILxVE-JE322.png

Taier Client Plugin这里,要快速开发一个插件要注意以下几点:

  • 一种任务类型对应一个插件,即一个jar包

  • 自定义类加载器(Classloader) 破坏双亲委派优先加载( Child-First)插件

  • 插件实现IClient接口方法

  • SPI: 在classpath 下的META-INF/services/目录下,创建以接口IClient 全限定名命名的文件,内容是上一步中实现类的全限定名

poYBAGKhzcOANQdAAAEP79vEVRQ798.png

 

 

 

 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'Taier分布式可视化DAG任务调度系统',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);