00:00
接下来我们给大家说一下RDD的核心属性,呃,这里面的核心属性啊,主要是在源码当中,大家看一下咱们的RDDRDD在它最开始的位置上,它会告诉你我们这里有五个main properties,五个主要的属性,在下面呢,它把它列出来了,在我们课件当中,这边是给他截了个图,这五大属性当中的第一个叫分区列表,咱们说过了,在咱们这里呢,它会有多个分区,多个分区就形成了分区列表,那么分区列表在干嘛呢?它的主要目的就是为了执行并行计算,而且我们说了你分区之间的数据是没有关联的,它们之间互相不影响,并行计算是可以实现的,所以并行计算呢,是实现分布式计算的一个重要的属性,它就有来咱们找一找啊,在它的源码当中,咱们看一看它里面的主要属性啊,在这里边有一个叫做什么呢?叫get parts。
01:00
它就是一个我们获取的一个分区的列表啊,咱们叫partition分区的对象,这是它的第一个属性,好,我们接着呢,再来往下看,下面呢,还有一个叫做什么呢?叫分区的计算函数,来我们回过头来看看它的这个地方说了,有一个叫function for computing its split,每个分区它会有一个计算的函数,这个呀,要跟我们之前讲的这个要关联起来,大家看一下在咱们这里是不是有个compute,它是真正的把数据和咱们的逻辑相结合来进行计算,对不对,我们的RDD里面也是有这个的,所以我们往下来找一找,它的这个里面呢,我们来往下找找啊看往上呢。在这呢,有一个叫compute,它是以分区为单位,就是每个分区会有计算,但是说到这儿啊,咱们有的同学就误会了,说老师你看那是不是每个分区它的这个计算是不一样的呢?不是回过头来看这张图形,你会发现这个task里面的数据它不一样,但是它的计算逻辑怎么了?诶,都是一样的,那么我们的一和二就在一个分区,一个分区它就会形成一个task,我们三和四在一个分区它就会形成一个task,对不对?他们两个是独立的,但是他们的计算逻辑是完全相同的,对吗?所以啊,咱们看着好像是说它以什么呢?每个分区为单位,但是记住他们的计算逻辑是事先就已经封装好传递过来的,所以计算的方式完全相同。好,接着往下,下面呢,有一个叫RDD之间的依赖关系,咱们回过头来接着看啊,这个里面有一个叫a list。
02:47
Of depends on other r DDS,这个是什么概念呢?它表述的是我们多个RDD之间形成的依赖关系。咱们回过头来,同学们看,在我们上面给大家画的图当中,这个红色的是个RDD,这个绿色的是个RDD,这个蓝色的是个RDD,这个紫色的依然是RDD,对不对?它们互相之间就形成了依赖关系,为什么呢?他们有包装,举个例子,我们要想构建这个紫色的RDD,我是不是要先想办法把这个蓝色的构建好,你要想把蓝色的构建好,你是不是应该先把绿色的构建好,你要想把绿色的构建好的话,你是不是要把红色的构建好?所以啊,它们之间其实是有依赖关系的,而这个依赖关系就会形成列表啊,形成列表,而且咱们想一想,难道我们这个依赖只能一个一个依赖吗?也不是,对不对,比方说我们的一个A,它可以。
03:47
同时依赖于B,依赖于C,依赖于D,行不行也可以吧,同学们,所以啊,它会形成一个我们所谓的列表啊,这个列表咱们可以看一看啊,咱往下走。往下走以后,在咱们的这个地方有一个叫get dependence,就是获取它的依赖,这个大家学过maven,这个应该能够了解,对吧,叫dependency嘛啊,咱们叫做依赖,好,那么回过头来咱们再来看啊来,那么还有什么呢?叫做partitioner,这个partitioner干嘛呢?叫做分区器,这个我们源码当中也是有的,大家看一下,咱们找一下,在这儿呢,叫partitioner,叫分区器,诶大家会发现这个地方用的是个option。
04:31
什么叫option呢?Option是咱们GALA语言为了解决空指针异常所产生的一个语法,它的目的是告诉你这个数据可能有可能没有,就意味着咱们的partitioner这个属性,它其实可能有可能没有,没有的话默认就是个那诶这就是没有值嘛,那如果有值的话,就是个sum。诶,那这个partition干嘛的呀?回过头来看这张图,咱们这张图形当中,大家会发现,我们当读取数据的时候,是不是要把数据一和二放这里,把我们的三和四放这里呀,对不对,凭啥呀。
05:07
你凭什么要把一和二放这里,把三和四放这里,难道我不能一和二放下面,我的三和四放下放上面吗?难道不行吗?当然可以了,对不对?所以这就要靠规则,这个规则我们就是靠分区器来实现,所谓的分区器就是将你的数据进行分区的什么我们的处理。啊,就干这个事情用的。我们卡夫卡当中数据如何分区,是不是也有专门的分区器啊,所以啊,效果上是完全相同的啊,最后一个,最后一个呢,叫preferred locations to compute it split,这句话是什么意思呢?它表述的是当我们计算每个分区的时候,它会有一个首选的位置,这个呢,我们给大家稍微的说一下啊,咱们叫做什么呢?叫做首选的位置。啊,咱们叫首选啊,首选位置啊,就这个意思,诶,怎么这里还会提到位置的概念呢?咱们举个例子啊,同学们往这看,我现在说了,我们会分解两个task,还是那句话,我怎么知道我们的task发给他。
06:17
我怎么知道把他task发给他?大家会发现这两个execor是在咱们集群当中分布到了不同的计算节点当中,对不对啊,放在我们的data note当中,放在我们的note manager当中,对不对,那么也就意味着你是不知道它到底在哪呢?那好了,那我的task该如何发送呢?我为什么不把task,把这个TASK1和二发给他呢?我为什么不把这个task发给他呢?我为什么要把这个一和二发给他,把三和发给他对不对?这个时候我们底层就有判断啊判断,那这里我们就要给大家说一下啊,咱们说一下这种情况,比方说来。我们现在有一个task,然后呢,有两个我们的excuor啊,两个ECU,我现在啊给大家演示的是三和四,在我们的任务当中,但是在某些情况下,你可能读取文件,你这个不在我们的task当中,对不对,那好了,那么你是一个我们的文件,可能是在分布式存储当中的,那好,那大家看一下,比方说我现在呢,我的executor,它运行在我们的某个节点当中啊,比方说咱们叫node manager,我这写上咱们叫no,什么呢?Manager。
07:28
你在这个的时候,那我的数据啊,咱们读取的是分布式的文件系统中的文件,那好了,我在这儿又分文件,这个文件呢,我们就叫word啊,咱们就叫word.t。那么里面呢,有什么呢?一二,哎,咱们举个例子啊,就一二数据就在这儿呢,那么好,大家想想下面的这个呢,也在一个节点上面,但是他没有这个文件,他没有这个文件,那好同学们想想这个task你们觉得发给谁会更好一些?
08:02
诶老师,那我们肯定发给他呀。为什么同学们?因为我们的ex和这个文件他们在同一个节点当中,那如果你把task你发给他来执行的话,大家想一想,那么这个时候性能是不是最快的呀?为什么性能最快啊,因为他们在同一个节点上,那不需要做网络数据IO的吧,你不做网络数据IO的情况下,那肯定快吗?对不对?所以task读取这个数据进行计算没有任何问题,诶老师,那难道不能发给下面吗?比方说把它发给下面,如果你要把它发给下面的话,我问你咱们这台节点上它有数据吗?他没有,他如果没有的情况下,那是不是应该怎么办,将我的数据从另外一个节点要拉取过来,对不对,同学们是不这样呢,所以它无形当中,它会增加网络数据的传输,如果数据量少还无所谓,那如果数据量多怎么办呀,同学们那性能是不是就下降了,所以啊,在这个时候就会出现这个概念,叫首选位置啊首选位置所以啊,咱们拿过来,咱们协商,咱们叫做什么呢?叫首选位置,嗯,那这个有什么用呢?很简单,就是判断你的task,或者说你的计算发给哪个节点是最优的啊,就是判断啊,判断我们的计算啊,它发送到哪一个啊,咱们要哪个节点,它的效率最优。
09:39
啊,咱们叫最优就是这个意思啊,诶,那我现在呀,我把这个数据拿过来不也行嘛,对不对,但是不太好啊,不太好你还是发给他效率会更好一些,是这个意思啊,所以啊,在咱们做分布式计算当中啊,其实有是有个说法的,有个什么说法呢?咱们来说明一下啊,就是说。
10:00
我们的移动数据它是不如啊,咱们叫移动计算,咱们理解这句话呢,我们说首先如果你要把数据从这边移动过来,让他计算这个效率肯定不行,如果数据就在这个节点上面,你把任务发给他,那么性能是最好的,对不对,所以啊,就这个东西呀,给他来一个虚线吧,啊来咱们把这个呢,我们给它来啊拷贝,嗯,拷贝拷贝以后放到这里面是最好的,这个地方我们暂时就不要了啊,比方说给他标灰吧,啊标灰不要发给他,我们要把这个呢干嘛呢?诶发给他这里用一个虚线啊,就意味着我们不发,我们要发给他是最好的啊。发给他最好的,呃,为什么发给他是最好的,原因就很简单,就是因为他们在同一个节点上面,你是把计算给它移动过去了,数据并没有移动,对不对,所以啊,在这种情况下,我们的箭头诶,应该是我们的这边,它读取我们的这个就可以了啊,那这样的话性能会特别的高,所以啊,把这个首选位置咱们要搞清楚,在我们源码当中,我们这个叫get prefer的locations,就是咱们的这个含义啊好了,那五个主要属性咱们就说到这里了啊。
我来说两句