00:00
好了,同学们,我们刚才呢,把这个分布式的一个架子搭建起来了,接下来我们要做的是什么呀?把咱们的计算给我们的发过去,因为现在只是传了个数据嘛,你并没有做真正的计算嘛,所以我们要想办法把计算给我们的exor传过去,让他真正的计算。哎,老师呀,那我这个计算我是在execute给它固定写死呢,还是通过driver传过去呀,你想想咱们的execuor其实它只是一个干活的节点,对吗?也就意味着这种逻辑的封装呀,包括你的计算的这种,呃,数据啊,跟我没有关系,你给我了,我帮你计算就完事儿了,对不对?所以说他不可能说在我们的excuor里面把计算给他准备好,这是不可能的,你要准备好的话,你的逻辑就是固定写死的了,我们应该是在driver端把这个计算逻辑封装好,然后传给我们的。但是你光有计算逻辑肯定也不够,你还需要数据对吗?所以在这种情况下,我们需要将数据和我们的计算逻辑都要给我们的什么主发过去,对不对?诶作为一个计算任务,所以啊在这种情况下,我们应该怎么办呢?所以大家看不可能只发一个二过去了,那我们该怎么办?同学们,诶,我在这里呢,创建一个我们的类,这个类呢,我叫做task,然后呢,我们点击OK啊点击OK,点击完成以后,那我在这里呢,干嘛呢?我们给它写上啊,我们叫做第一个,咱们叫做数据吧,好不好,同学们,咱们这个数据啊,咱们简单点啊来,咱们写上一个v al,我们就写上叫date啊,咱们叫date是吧?然后呢,等于什么呢?我们叫LIST1234,我希望我们把数据准备好,那记住啊,这是我固定写死的啊,诶,好,那我们再来干嘛呢?我们叫做嗯,Logic叫做逻辑,这个逻辑想要做什么事情呀,很简单,咱们。
01:57
给他一个匿名的函数啊,匿名的函数,这个匿名的函数是什么呢?就是我们要把数据当中的每一个拿出来,乘以二,所以呢,我们这里写上,同学们看,我们写上一个,咱们叫做number,然后给它一个int,然后在这里呢,干嘛呢,我们给它写上,咱们就叫做嗯嗯,Number写乘以二对不对,诶我们这么写就行了,诶那你这么写了以后,老师我这能不能简化呢?我把它简化一下,同学们看来。
02:28
把这个地方呢,我们去掉,诶你看一下我们直接写个下划线乘以二行不行,这么写的话大家会发现好像不太行吧,那如果我加上一个这个呢,我们写上一个啊,咱们叫做int,然后再返回一个我们的int呢,你这么写的话,是不是就明确告诉你它是一个我们的函数啊,那所以说在这个时候你这么写是OK的,如果你要不这么写,直接写它是不行的,所以啊,咱们史该LA语法当中的一些匿名函数呀,包括一些质检原则呀,希望大家下来呢,好好的去理解一下,好吧,诶两种方式它都可以,那么两种方式它都可以的情况下,那么这个时候我们怎么来执行真正的计算呢?我们在task里面给他一个什么呢?我们的方法咱们就叫compute,咱们就叫计算就行了啊,OK,那行,我们在这里呢,给它来,我写错了,这边应该是我们DEF是一个我们的函数方法啊,放过来,放过来以后这个compute就是要真正的做计算了。
03:29
那所以呢,我加个说明,咱们叫做计算。那么这个计算呢,其实就是说我们的logic要用在我们的dates上,对不对,所以啊,我们要挨个的便利一家,所以拷贝,拷贝以后同学们看我们点,点了以后呢,我们这里写上一个我们的map,诶,好了,然后把咱们的logic给它传进去,你传进去以后,那这个时候它的返回结果就是按照咱们这个规则去实现的,所以它的结果恰恰是我需要的结果,那么OK,这个呢,我们写上一个any,对吧,或者我们不写了,我们直接去掉,让它能够自动推断是不是也行啊,所以这就是一个我们最基本的计算任务,而且大家想没想到过,我的数据是不是可以变,我们的逻辑是不是可以变,只是我这里为了简单,我没有变好,那我现在把这个task咱们先准备好了,准备好了以后,在咱们driver的这个地方,我要发送的不再是个二,而是把那个计算的任务发给。
04:32
咱们的executor执行对吧,同学们,这个不就意味着是把一个计算发过去了吗?分布式计算好了,同学们,那么对于我们来讲,现在我们来一起的看一看啊,同学们来。那我现在的这个地方呢,我们一块儿来操作一下,那我现在呢,这个output可能就不够了,因为我要发的是一个对象,那么对象的话应该有一个什么呢?叫做new,咱们叫object,咱们叫output。
05:00
咱们叫output stream好了,然后我要把咱们的这个来拷贝,拷贝以后我把咱们的out放进去。那我现在呢,干嘛呢?我要返回一个,我们写上咱们叫object out等于它,那这是一个对象输出流,那么你要输出的就是对象对不对,所以我们写上叫right,我们的object啊把这个拷贝过来放到这里,然后这个我们放到这,这个暂时哎这么写吧,好,那么我们写上object。那好,你的对象在哪儿呢?你不知道发对象了吗?那你发对象的话,这个对象我们在这里写上一个叫task,因为我们是固定写死的啊,为什么我们简单嘛啊,就是演示功能,所以咱们也不需要太灵活,所以我们写上new task。写完之后,你把这个task就传给咱们的right object这个方法传过去以后,然后呢,给它flash再close close,诶我在这儿可以写一句话,我们写上啊在这吧,在它的后面我们写上,咱们叫print,嗯,叫做客户端啊,客户端我们叫做数据发送完毕,数据发送完毕就可以了啊好,那你这边发完了以后,大家想想在我们的exec当中,我们是不是应该接收数据,但是你要记住你发的时候发的是个对象,那我收也应该收对象吧,所以我们应该用到什么叫对象输入流,所以呢,在这里呢,我们写上叫做new,咱们的object叫input stream,好,把你之前的那个in给我传进来,嗯,可以了,那接下来我们就object in等于它,那么这个时候我们就应该怎么办读取的它了,那这个时候呢,把这个去掉,然后。
06:51
点我们叫做read啊,咱们叫object,要读取我们的对象,那好,前面这个肯定不对了嘛,好把这个去掉,然后点,点了以后VR回车,这个时候你会发现有问题了,什么问题啊,我们这个叫an RA,但是咱们知道我们真正要去读取的那个数据应该是个task吧,所以说我们这里应该转一下啊,转叫DR,叫s instance of,这个是咱们GALA当中我们所提供的一个方法,它是用来转换数据类型的,那我现在把它转成task没有任何问题吧,同学们,所以它就应该是task,这边也应该是task,那如果你把这个task拿到以后,大家想一想,那我是不是就应该可以做计算了,所以task点我们叫compute,诶,直接做计算就行了,那么你计算以后,你会返回一个结果呀,所以说拿过来咱们叫做它,或者其实我们把这个结果放在compute里面完成。
07:51
也可以,这个咱们另说了啊,还无所谓,那么我们的list有了,那对不对啊,不知道,所以呢,我们就写上我们这边啊来我这就不写了,咱们叫做什么呢?我们的这个计算啊,来写上咱们叫做计算节点啊,计算节点计算的结果咱们叫计算的结果为。
08:13
好了,把这个呢,它复制过来,因为我们已经完成了compute嘛,可以了,来嗯,放到这边之后,那我们后面呢,就直接啊,该close就close掉了,所以关掉啊,咱们的close,然后呢,客户端关掉,Server关掉,我们觉得可以了啊,行,把这个代码简单的做了一个修改之后,我们现在给大家启动一下,还是先启动咱们的服务啊,所以来运行。运行以后看结果吧,同学们他还是要等待咱们的这个接收数据啊,那这个时候我们的driver就可以发数据了。运行。运行以后大家看一下出现问题了,诶老师怎么出现问题了呢?你看看报了什么错误,叫做not still liable exception,这个它是跟序列化相关的一个异常,那么一旦你看到这个带着able这样的一个异常,说明什么问题?
09:13
说明你当前在网络中所传递的数据,你没有序列化,对吗?同学们,这个我相信大家能够明白吧,因为你们讲过在网络当中是不可能说传个对象过去的,这是做不到的,但是你把对象序列化是可以传过去,对吗?所以说你的对象必须要能够序列化,咱们刚才想传的不就是task吗?Task是就是个普通的类,它能序列化吗?它不能,你要想让它序列化,你是不是应该干什么?我们应该混入一个特值啊,诶讲叫特质对不对?这个在我们的skyla当中,Sable咱们叫特质,在Java当中称之为叫接口,在LA当中,所有Java的接口都叫特质,我们用混入的方式对吗?相信这个同学们应该是能够了解的。好,那我现在再重新来,刚才出现了问题,现在我们重新来吧,咱们叫exec来。
10:10
运行运行以后看结果啊,咱们看结果,嗯,把这个都停掉,嗯。好了,停掉以后,现在呢,我们服务器正在启动,等待接收数据,然后呢,我们的driver开始要发送数据了,对不对,来发送。发送数据以后,如果发送成功的话,我们数据就应该被计算出来了,同学们看,这叫executor,点一下。2468,原来的数据是不是1234,它的每个数据是不是乘以二之后就是2468,说明我们的计算是准确的对吗?同学们。
我来说两句