00:00
刚才咱们演示了一下咱们这个RDD的序列化问题啊,接下来呢,我们给大家介绍一个k yo的序列化框架啊,那么为什么要给大家讲一个k yo的序列化框架呢?是因为咱们Java的序列化呢,比较怎么说呢,比较重,它在序列化我们类的时候啊,会产生大量的一些字节。那这样的话呢,它有个好处什么呢?它什么样的对象和数据都可以序列化,为什么呢?它产生的信息比较全,可是在大数据领域当中,你产生的数据量越多,你在网络中传输的就会越慢,一定是这样对不对?同学们,学们想想,因为你为什么要序列化呀,不就可能是在五网络中传输吗?但是由于你生成了太多的这些字节,就导致啊,你的数据传输的太慢,性能就比较差了,所以在这种情况下,我们出于性能的考虑,Spark2.0之后,它开始支持另外一种叫做K2YO的序列化机制,那么这个序列化机制的速度呢,它是我们的什么Java的十倍左右啊,然后呢,在RDD的数据的时候呢,简单数据类型,速组和字串类型,它已经开始使用k yo来序列化的啊,就底层当中它是这么来序列化的,其他的类型默认还不能使用K来序列化啊。
01:21
那具体什么原因呢,咱们一会儿再说,那么我们这里呢,给大家通过一些例子来看一看啊,同学们来。在咱们当前呀,我这边有一个开发工具,就是spring的一个开发工具,它里面呢,我引入了咱们K的一个项目,这个项目当中呢,我做了一个简单的测试啊,这里面会有一个什么呢?我们的k yo的一个test啊,就是它,那我们现在要干嘛呢?大家看一下来把这个给它注掉啊,把这个注掉,我现在在咱们代码当中,我们会有Java的序列化,还会有kr yo的序列化啊,那这个序列化序列化什么呢?序列化一个咱们基本的一个并对象,大家看是一个U。
02:01
那么这个UR当中啊,同学们看啊,把这个给它除掉,把这个打开很简单,就是一个普通的U对象,它里面有私有的属性以及公共的set get方法,就是一个比较标准的bin对象了,对吧?那好,那么我们现在干嘛呢?我们构建对象,并且把它的属性设定好,我们现在呢,先用Java的序列化方式,看看会产生什么样的内容,好吧,那我这里呢,有一个E盘啊的根目录,要产生一个数据文件叫u.dat嗯,在我们的这里呢,我们去找一下E盘的根目录啊,现在什么都没有,什么都没有的情况下,咱们现在呢,来执行一下来啊。我们现在我们点击运行。好了,运行呢,因为比较快嘛,所以呢,我们这里点击确定啊来。他这边呢,基本上执行完以后已经完成了,完成以后在我们的这个位置,大家看一下是不是已经有一个U的点dat了,然后呢,看看我们的左下角是不是有87个字节,诶八七个字节里面都有什么东西啊,所以咱们打开,打开以后同学们观察一下,你会发现里面都是一些不太看得懂的东西,但是有些东西也能看得明白一些,这啥。
03:17
这什么东西叫user age,对吧?再往下什么东西叫user name,还有那个什么Java long streamam,就这些东西啊,你不能全看懂,但是呢,你最起码能看懂一些小部分吧,对不对,哎,就是这样说明啊,它的数据呢,其实是比较全的,信息比较多啊好,那我们的加要的序列化是这个样子,那我现在干嘛呢?诶把这个注掉做掉以后,咱们用这个叫K2YO的序列化,刚才咱们加va的序列化其实采用的就是对象输出流直接输出,而我们的K2YO的序列化呢,其实用的也是类似的,只不过它自己实现了这个操作啊好,大家看一下啊,咱们这里面序列化用的是我们k yo,这个细节咱们就不看了,咱们就看看E盘的U的1.dat,好,我们运行一下,运行以后看结果。
04:13
那么运行以后,大家观察一下我们现在的这个位置,诶,OK,已经完成了,完成以后咱们打开,你看是不是叫U的1.dat啊,那么U1.dat大家看多少个字节,哎,十个字节,记住啊,同学们,刚才的U的dat可是87个字节,那你这是十个字节,你包含了什么内容呢?所以打开,打开以后我们看一看,你会发现好像还是看不懂啊,但是我能看到什么章啊,山啊这种感觉对不对,但是我还是看不懂,所以这就意味着我们虽然说看不懂,但是呢,同一个对象,他被转换成的那个序列化的内容,它确实差了很多,这个呢,87它是十个,差的很多,那么如果在网络中来执行操作的情况下,那肯定是十个字节传输的非常快吧,比87个就会慢很多,但是一个对象,那如果100个对象,1000个对象,1万个对象怎么办?差的就会更多了,对不对,同学们。
05:14
你们想是不是这样,所以啊,咱们KR首先从质节束的角度来讲,确实优于咱们的这个生成的内容,但是你光是生成的内容是少了,但你能不能够正确的去传递,对不对,你序列化了,你能不够能反序列化呢?大家看一下,我们把这个做掉,做掉以后咱们把这个打开,嗯,打开,打开以后,现在呢,我要从我们这个位置读取咱们的数据,然后呢给它。什么反序列化形成UR在判断里面的属性跟我上面的是不是一样的,咱们上面呢,是20张三,那你这个能不能正确的得到,如果能够正确的得到,那么说明它的序列化是没有问题的,所以啊,咱们这里来,咱们再运行一下,嗯。
06:02
运行以后咱们来看一看啊,去点击确定,咱们观察一下打开。打开以后有没有发现同学们张三和20就都出来了,这说明啊,咱们之前序列化的内容,在咱们当前的反序列化当中是可以正确得到的,对不对,诶就是这样啊,所以说这样的话就非常好了呀,诶老师难道只有这个区别吗?是不是不光是有这样的一个区别,其实还有大家看啊,咱们来我们现在呢,把这个呢,咱们来大家看一下,我们现在把这个地方啊,把这个去掉。去掉以后大家看啊,我现在干嘛了呢?我在咱们属性的上面加了一个叫tcent关键字,这个如果大家知道的话,应该明白,这个呢,它表述的是什么叫瞬时关键字,就意味着我们的这个属性是不能够被序列化的。那么它的值是没有办法序列化的,对不对,所以啊,咱们回过头来干嘛呢?把这个都注掉,做掉以后,我把这个我们的加网和这个k yo的这个哎都打开,你都打开以后,我们重新给它生成,所以啊,在这里我把它们两个都删掉啊,把它们两个都删掉,删掉了以后,那么接下来我们来执行一下啊,来我们在这儿执行一下。
07:21
执行以后咱们看结果啊,嗯,已经执行完了,执行完了以后看这你会发现是不是两个文件出来了,那好我点一下。你有没有发现这个U的点dat其实只有44个字节?刚才是87个,自己还有印象吗?87个现在由于有一个属性,它是不能够被序列化的,所以现在就变成什么44个了,那好你再看这。他还是十个。那说明什么问题,说明它并没有减少它的值对不对,哎,所以啊,咱们再回来,回来以后咱们再重新执行,来把这个注掉,注掉以后把这个拿过来啊,来去掉去掉,然后去掉,我们现在重新运行一下保存。
08:05
然后我们再来运行一下,运行运行以后看结果。有没有发现张三和20我依然拿到了,按理说你的这个Una是不可能被拿到的,为什么他没有序列化,你不可能反序列化,但是我们这儿是可以的,哎,老师,那为什么呀,很简单,它绕过了咱们Java中的序列化的规则。为什么呀,因为咱们早期加va在设计的时候啊,他没有考虑这种我们大数据的分布式计算的能力,所以呢,他考虑是一种数据的安全性的东西,所以呢,大家看一下他们的数据呢,其实都会有这方面的考虑啊,比方说来我们点击这个叫list的,我们点点完以后,你有没有发现在咱们当前的这个数据当中,咱们点一下它是什么呢?叫transrecent。所以啊,他考虑的其实不是分布式的计算,而是单点操作,那么这样的数据为了安全,它就不能什么在我们序列化之后传过去那边拿到,所以基于这样的原因,所以说我们Java的那个序列化的规则当中就要增加一个T的关键字,但是在我们大数据当中,你这种方式就不是很合理了,对不对,我们要的就是传输啊,可是你加了个关键字不让我传,那怎么行,所以我们就要想办法绕过它的序列化规则,绕过它的这种传输的机制,让我的数据可以拿到,对不对?所以啊,K yo的序列化框架在这方面还起到了一个非常积极的作用啊,所以我们这个呢,还是非常不错的啊,但是由于呢,咱们的Spark内部呢,已经开始使用了,我们自己呢,倒是不需要了,但如果你非得自己想使用也行,大家看一下在我们下面下面这个地方呢,会有一些我们的操作,你按照我们这个步骤来做就可以了啊,就是我们增加我们的相关配置,然后呢去注册我们需要。
09:52
K去序列化的那个类啊,你把这个类给它加上就可以了啊,所以啊,这个步骤相对来说会增加其中的一部分啊,但是序列化的效果应该是还是非常不错的啊好了,这个呢,我们说到这里啊。
我来说两句