00:00
嗯,行了各位啊,那这个基本的概念我已经给大家介绍的不少了啊,那下面呢,咱们就可以正式的开始去定义一个工作流了,那在这儿呢,我们文档当中给给大家提供了一个这样的例子啊,大家可以看一看,那在这儿呢,咱们有一个什么例子呢?来就有一个这样的例子来可以看一看啊,那这个呃,我们就通过这个例子啊,咱们通过这个例子去学习一下这个呃,刀分子盖的一个使用的流程,对吧?那通过它怎么去学习一下,到底怎么定义工作流对吧?怎么去调度工作流啊这样的,好了,那看一看这块,它这个例子有什么样的要求啊,它的要求是,诶,你这个工作流呢,得包含三个shell类型的任务节点。注意三个shell类型的啊,好了,到了之后呢,分别是ABC3个节点,那你这三个节点的依赖关系是什么样的呢?就是这样的,诶其实看起来是比较简单的,对吧?诶是C同时依赖于A和B。对不对,那就是咱们这个工作流在执行的时候必须得怎么样。你必须得保证AB。
01:00
都完成,都完成之后是不是才能跑C呀,对吧,那这是咱们当前的这个工作流的一个要求,其实挺简单的,对不对?好了,那咱们接下来就,诶借助这个例子,咱们去学习一下到底怎么用这个do分开啊,那来吧,咱们现在就开始了,首先我们打开这个页面,大家说我们应该先干啥。是不是得先进到工作流定义,你得先去创建这个工作流啊,对吧?好点击创建工作流,好点完之后你就发现咱现在就来到了一个工作流的编辑页面了。能吧,OK,这个编辑界面呢,咱们大致呢,可以分成这样的,呃,两部分啊,OK,左边这儿是不是有一个侧边栏对吧,它叫做工具栏,而右边呢,其实就是一个编辑界面,好了,那你可以先看一下这个工具栏里边都有什么,其实所谓的工具栏里边对应的就是啥,对应的就是每种任务类型,你看啊,那这里边这个指的是什么呢?这个指的是shell任务。啊,OK,也就是DS,咱们前面讲过,它是不是支持多种任务类型啊,对吧?那这是shell,那还有什么呢?呃,比如说有这个procedure,这个指的什么?这个是指的是存储过程啊,那关型数据库里边,你比如说买circle,对吧,他们是支持存储过程,但是have是不支持的啊,然后往下走,那这个呢是执行一条SQL语句对不对?那这个呢是执行一个Spark任务,诶,一个link任务,一个map reduce任务,诶执行一个Python脚本能理解吧,那下面的这个实际上是一个呃依赖节点啊,那它不是一个具体的任务类型,它是为了实现某些特殊功能的一个作用,一个节点啊,咱不管它往下走,这个呢是发一个HTP请求,那这个呢是date叉啊等等等等,那这些呢,都是do分SC所支持的任务类型非常非常的多啊,这边咱们暂时呢就不再一一列举了。
02:42
然后呢,在这儿我们要创建的这个工作流是什么。是一个这样的工作流,对吧,里边包括什么样的类型,什么什么类型的节点,三个shell类型的节点,对吧,所以在这咱们怎么做就行了,你往这边拖呗,对吧,比如说shell节点,OK,往这拖一下。没错,OK,那这儿呢,咱们就拖过来的一个节点,然后在这儿呢,咱们是不是就能够去做与这个节点相关的一些配置了,对吧?好了,那接下来咱们来看一看啊,此处我们都应该配什么?首先第一个就是节点名称,这个随便起名字就行,对吧?比如说我这儿的给他来一个note a,这个无所谓啊,这个代表的就是这就是我这的这个A节点啊对不对?来继续往下走啊,那完成下边一个是什么呢?诶有一个所谓的运行标志对吧?运行标志是什么意思?
03:25
很简单,一个是正常,一个是禁止执行,如果是正常,OK,那做这个工作流调度的时候呢,这个节点就会跑。能理解吧,就是你定义完之后,你去执行它的时候,那这个节点就会运行,如果你给它设为静止运行,那这个节点就会跳过。能理解吧,那我们一般情况下是不是肯定是正常的对吧,除非你想诶这个某个任务对吧,你比如说你已经手动的执行完成了,对不对,你不需要他再跑了,那这时候你到时候可以给他调过,能理解吧?啊当然一般情况下都是正常运行啊,那继续往下走,描述信息,这个我不解释啊,然后往下走,这儿有一个啥优先级,任务的优先级。
04:00
能解OK,优先级里边咱们能选啥呢?能选这样的五个级别啊,最高级最低级,然后中级对不对啊,一共这样的五个级别啊好了,那首先这个任务优先级它有什么用?同学们大家想想,你说它有啥用?这玩意儿有啥用?那是不是肯定是当资源不足的时候,对不对,优先级高的任务是先运行啊对吧?好了,那我现在问一下大家,你说我这块这个优先级是在什么资源不足的情况下会起作用。诶,这个咱们思考一下,诶,你要知道你配的是谁的优先级是一个任务的优先级,能是工作流当中的一个任务节点的一个优先级吧,对吧,好了,同学们,前面咱们讲过任务节点是谁负责的,是由worker节点负责的吧。能理解吧,同学们,OK好,那所以说呢,实际上这个优先级是在什么时候起作用,是当沃克节点的资源,其实主要是指线程数这个资源不足的时候,OK好,那我这个优先级高的时候,呃,我这个优先级高的任务呢,它是优先运行的。
05:08
能理解吧,也是主要是work克节点对吧,我线程数这个资源不足的时候,好,那这个任务优先级高的,那就会被优先的去调度,这个大家要体会一下,OK指的是worker资源不足的时候啊,它才有用,再继续往下走,那下面一个呢,就是worker分组了,对吧?前面给大家讲过啊,就是说我们是不是在执行某个任务的时候,OK,你是可以选择这个具体的一个,呃,这个work克组的呀,对吧?好了,那其实大家可以想想,你就这个work克组到底有什么用啊,到底有啥用啊。到底有什么用?其实挺简单的,同学们你想一想啊,啊OK,比如举个例子,假如说我现在我要执行一个have的任务。兄弟吧,我害物杠一,我去执行一条三号对不对,那你必须得保证什么东西,你是不是必须得保证,诶你这个,呃,任务执行的节点得有害物才行啊。那比如说我就执行一个亥武杠议对吧,说白了你让DS帮你去调度任务,说白就是让他干啥帮你去提交任务能对吧?呃,以前咱们害武杠一是我们自己执行对吧?现在呢,是不是由沃克节点帮你去执行这个亥武杠一啊,对吧?那你想一想,他要想能保证这个任务运行成功,必须得保证什么,必须得保证克节点它是不是得有害物才行。
06:22
你work间要是没有have的话,那他直接执行have管理是不是肯定会报错呀,对吧?能理吧,同学们,OK,好,那你所以说你是不是就可以通过这个所谓的worker组对不对,去指定,诶你这个任务到底在哪个节点执行啊,对吧?比如说举个例子,我现在我这个have呢,只在102这一台节点装了,能了解吧,OK,那你说我们在执行任务的时候就可以怎么做,我就可以单独的创建一个博客组,对吧?里边呢,比如说只有一个102这样的节点。能理解吧,OK,好,那么之后呢,我把这个任务呢,交给这个102这个沃克组去执行,诶那这样一来的话,那have的任务是不是就只会分到102,那他就能够执行成功了,对不对,你像我们现在我们103104是不是没有have啊,对吧?你没have的话,那你要是直接把任务交给这三个worker去跑,那是不是有可能就。
07:09
诶找不着还对吧,你分到10314是不是就执行成功不了了,那对吧,这个worker组的作用大家是不是就能够体会出来了,对不对,那在在这样呢,我们就这个只有一个组,咱们就选它就行了,对吧?那继续往下走,那再往下,你注意观察,你看咱这儿是不是可以选择我执行这个任务的环境啊对不对,你前面讲过,就是一个组下边是不是能有多个环境对不对,你选你执行什么任务对吧,你就选择相应的环境,那我们这儿呢,其实就执行一个善务命令,这个无所谓啊,环境咱们现在没有就不用选了啊继续往下走,再往下呢,这几个参数相对就比较简单了啊,先看这个失败重试对不对,非常简单吧啊,一个是失败重试的次数,一个呢,是失败重试的时间间隔。那这个失败重试有什么用啊,同学们。他能解决什么样的问题?其实它是能解决一部分问题啊,能解决什么,能解决一部分,比如说由集群资源不足,或者说呃,在网络这个暂时的一些故障,对吧,所引发的这个任务执行失败的这个错误,它是能解决的,比如举例子,那现在我们提交一个黑度的一个任务啊,对吧,比如说提交一个mmr吧,对不对,你假如说我现在现在什么我这个集群资源不足了,那对吧,集群不资源不足,任务是不是就提交不上去啊对吧,他是可能会怎么样,是不是就可能会失败啊对吧,好了,其实这样的任务,你想一想你这样的失败对吧,你其实说白了,你再等一会儿对吧,你等一会儿等我们集群当中,对吧,某些任务执行完了之后,资源释放了,你再提交,其实是不是就能够正常的跑了呀,对吧,那所以说这样的问题,你通过自动的一些失败重试,实际上是能解决的。
08:41
啊,但是只有这样的任务是能解决的,你比如说呃,什么样的任务解决不了的,你比如说你那个代码你写错了,你写错了代码了,你说说实话,你重试100遍你也成功不了,是这个道理吧,这个大家一定要注意啊,所以说这个失败重试解决什么样的问题,咱们得搞清楚好了,一般情况下呢,你这儿其实可以给他配个几次啊,比如说失败重试五次对不对,然后呢,每次呢,呃,失败重时间间隔,比如给他一分钟对不对,这个都是可以的,OK啊这个大家稍微的体会一下,那行了,我这儿呢,就不去配这个东西了啊,那继续往下走,这儿呢,还有一个什么是延时执行时间,什么意思呢?呃,延时执行呢,就是说OK,你比如说我到这个任务节点了,对吧,哎,我还不想让他立即跑,哎,我让他等一分钟再跑,等两分钟再跑,那也可以实现这样的一个效果,当然这个其实一般情况下咱们就不用给他延时了啊,那继续往下走,下边还有一个是什么是超时高级。
09:31
那这个超时告警其实也是一个非贴非常贴心的功能啊,什么意思东西,什么叫超时告警?很简单,就是说当你当前的这个任务啊,如果我执行的时间超过了你规定的时间之后,那你可以选择让他给你报警。什么意思呢?比如说举个例子,同学们啊,啊大家都知道,就是我们这个dolphin sc呢,它能够实现这样的一个告警功能,什么告警功能,比如举个例子啊,那假如说当我这个工作流里边的某个任务,对吧,他失败了之后,好,那OK,这个确实是能够给我们报警的,对吧?报警完之后,那我们就能够收到信息,然后去修复这个问题,让他接着跑了,那这样一来不会耽误我们第二天这个数据的使用,对吧?好了,但是大家有没有想过这样一个比较恶心的情况啊,什么情况呢?就是说我有一个任务。
10:18
对不对,OK,我在跑的过程当中呢,对不对,他也没失败,但是呢,他就是一直拖着它不结束,能理解吧,什么情况下会出现这样的一个问题,你比如说咱们遇到这种数据倾斜的问题了,对不对,我们大多数的数据都积压到同一个reduce去跑了,能理解吧,那这个呢,就恶心在这儿,对吧,一直拖着不往下跑对吧,那任务他也没失败。对不对,然后呢,我后边的任务他也不能执行,能解吧,那这样一来是不是也有可能会导致第二天咱们这个任务这个数据的使用会出现问题啊,对吧,能解吧,那所以说这种情况下呢,那这个超时告警是不是就非常有用了。对不对?同学们,OK,你比如说我规定一下,每个任务最多跑30分钟,如果你跑不完,你就赶紧给我发通知,然后我去检查一下,看看到底是出什么问题了,对吧?OK啊,这就是超时告警的一个作用啊,那这个超时告警呢,有俩策略啊,一个是超时告警,一个呢是超时失败,啥意思?哎,超时告警就是说,诶,到点了我给你告警,但是任务接着跑,对吧?那超时失败呢?哎,就是到点了你还没跑完对吧,我就直接给你扣掉啊,就这个意思,那这就是咱们这个超时告警的一个策略,好了,这个也是很有用的啊,啊来,那继续往下走。
11:28
下边呢,我们再来看这个位置,也就是这个具体的脚本了,这个因为咱们当前跑的是一个什么类型的任务,是一个shell类型的,对吧,所以在这儿呢,你是不是得给他指定一下你到底要跑什么,是要任务啊,对吧?比如说在这儿呢,咱们可以来一个最简单的啊,咱们就打印一句话,咱们一口一个AAA。没错吧,那打印一个AA就完事了啊行了,那完之后呢,我们继续往下走,那这个这个里边的内容呢,其实这个是具体的任务而定,对吧,咱们现在就是学习这个基础的使用,所以这块呢,咱们随便打印一句话就行,继续往下走,这儿呢,是不是有一个资源啊各位同学,哎,这个资源它是干什么用的呢?
12:05
同学们,这个资源是干什么用的呢?哎,其实非常简单,各位同学你想一下,你说它应该是干啥用的。是不是就是引用我们这个任务所依赖的一些任务资源资源的,对吧,比如说举个例子,我在这儿呢,我执行的不是这个名字,我执行的一个是一个啥呢?比如说Java杠这,那你Java杠这后边理论上是不是得跟上一个什么什么点这个炸包啊,对吧,能力吧,好那你想一想,我这个炸包我给它放哪啊。这炸包我给他放哪儿了?对不对,同学们,你你是是不是得考虑这样的一个问题,对吧?好这时候可以怎么做呢?我们就可以把炸包上传到这个资源中心,那对吧,然后呢,诶这个资源中心里边有了之后,你这儿就能够引用这个炸包了。能理解吧,诶,那这样一来的话,你这个任务就能够顺利的执行了,诶这是诶咱们这块的这个资源中心的一个作用啊,具体怎么用啊,这个到时候我后边会给大家演示的啊,现在咱们先稍微的体会一下就行,那这边咱们还退回去,我们就跑那个E靠AA就得了啊来继续往下走,再往下呢,此处我们是能够给他传一些什么,传一些参数的,大家都知道我们这种工作流定时调度器对不对啊对吧?他调度的任务很有可能都是需要每天重复执行的,对不对,每天你是可能需要给他传一个不同的日期,对吧?OK,好,那在这儿呢,我们实际上是可以给他传参的,OK,那这个传参怎么传,我们暂时就先不传了啊,后边咱们会讲,会单独的有一小节去讲这个do分子盖这个传三的相关内容,咱们到时候再说啊,现在参数咱们暂时就不传了,然后再往下这儿呢,还有一个前置任务,这个前置任务是干什么的啊,很简单,这个其实是可以用来指定我这个任务之间的依赖关系的。
13:42
能理解吧,因为都知道咱们这儿呢,是不是有三个节点对吧,好,我三个节点对不对,那你是不是。那比如说这是A,这是B对吧?这是C对吧?那你想一想我们这个依赖关系怎么指定啊,你可以在C节点这边,对吧,指定我的前置任务是A和B对不对?那这样一来,这个依赖关系是不是就声明好了呀,对不对,这是用来声明依赖关系了啊,OK啊,当然我们现在是A节点,A节点依赖于其他节点,不依赖的吧,不依赖,那这个就不用写了,OK,好,完了之后我们点击确认添加好了,那A节点我们就创建完毕了,好了,那我们接下来呢,再使用同样的方式呢,再去创建一下这个B节点啊,我们这儿呢,来一个node b对吧?那下边这些都是一样的,我就不再重复了啊,这边我们来一个E口bbb对不对,然后别的都是一样的,我们点击确认添加好,最后再来一个节点,我们来一个C节点啊。
14:30
这个呢叫做node杠大C对吧,里边呢,我们再来一个ECCC好了,那现在这些都完事了之后我们点击全添加行了,各位啊,截止到现在,咱们是不是就已经把这仨节点都定义好了,对吧?定义好了之后,接下来要干啥同学们。接下来呢,咱们是不是就得去声明这三个节点之间的依赖关系了呀,对吧,好了,那这个依赖关系怎么声明啊各位。怎么去声明这个依赖关系,诶很简单,刚才其实已经告诉大家了,对吧,那咱这儿可以怎么做呢?你比如说我可以来到这个note c,对吧,然后往下翻找到最后一个前置任务对吧,你看现在咱们是不是就能选了,选A选B,然后点确认添加,你看这个箭头是不是就给咱们标注出来了。
15:13
能理解吧,OK,那也是在这儿呢,我们可以通过这种方式去声明依赖关系,或者说呢,其实你也可以不用这么麻烦啊,在这儿呢,比如说我先把这个节点给它,呃把把这个连线给它删除啊,你怎么删呢?你先选中对吧,先选选之后点一下这个删除按钮,对吧,你就能把这个依赖关系给它删掉了,好了,现在已经删了对吧?好,那我除了能够通过这种前置任务的方式去指定依赖关系,我还可以怎么做呢?你直接连线就行。OK,同学们你看啊,我再把这个鼠标指向这个,呃,这个note a的时候来吧,你可以直接往这边拉。能理解吧,OK,好,那诶没拉过来啊,再拉一次,嗯,OK好,诶你看依赖关系是不是就生明了对吧?好,那这边也是一样的,直接往这边拉一下就行好了,那这个注意啊,这两个操作它是同步的啊,你往这边拉对吧,跟你在这边去填填这个真这个前置任务它的它俩是同步的,那是一样的一个效果啊,OK,好,那也就是说指定依赖关系的方式就是这样的两种,行了,那截止到现在是不是咱们这个工作流就算是定义好了呀,对吧?OK,好,那在这儿呢,虽然我们是以一个简单的shell任务为例去演示的,但是其余的不管是什么类型的任务,对吧,都是这样去定义。
16:22
啊,可能这就是不同的任务类型对吧,我这个参数可能是不一样的,对吧,你比如说在这儿呢,我来一个mmr类型,MR类型呢,你需要给它指定什么呀。你需要指定呃,你的这个呃,这个闷方法所在的类对吧?你需要去选择你的那个包对吧?这个包也是在哪呢?也是在那个资源中心啊,也是在资源中心对不对?炸包对吧?然后呢,呃,这个参数啊等等这些东西,诶你是需要去进行填写的对吧?也是不同的任务呢,这边咱们填的内容可能是不一样的,哎,但是呢,这个配置这个方式对吧,基本上是一致的啊好了,那这块呃,工作流定义完毕之后,我们这儿呢,点一下这块是不是有一个保存呀,对吧,点一下保存。
17:01
好点完之后,那在这儿呢,我们需要再填一些必要的信息啊,比如说在这儿呢,我们来一个呃,这个名称对吧,咱们就叫hello word,因该是一个入门helo hello,没问题吧,然后再往下。注意观察,你看这儿咱们能选啥,是不是能选租户啊,对吧,所谓租户就是什么来着,就是真正的去执行我们这个工作流里边的每个任务的那个用户吧,对不对,咱们用谁就用爱硅谷用户去执行就行了啊好了继续往下走,那这样呢,还能配一个超时告警,同学们,诶问一下你说这个超时告警跟刚才咱们那个节点当中的超时告警有啥区别?区别大了去了,你要注意啊,刚才的超时告警是每个任务的超时告警,能理解吧,那这样呢,你配的是整个工作流dag工作流的超时告警的,对不对,这个是有区别的啊,那在这儿呢,咱们就不去配了啊,是这样,然后再往下这块,这块呢,我们也能再设置一些这个所谓的全局参数,这也是穿三的对不对?那这个参数跟刚才咱们在节联里边看的参数有什么区别,这个也是一会儿再说啊,那暂时呢,我们不用配那么多,我们起个名字选个租户就够了,好了,那现在我们点击添加行了,各位同学注意观察,你看工作流定义咱是不是就已经定义好了呀,对吧?好,那定义好之后,那一会呢,我们再说这个东西怎么执行啊,来视频我先停一下啊。
我来说两句