00:00
好了,同学们,我们接下来来讲一下RDD的并行度和分区,嗯,这个是什么意思呢?是因为啊,咱们在之前给大家讲RDD的时候,咱们说了它的内部其实是有一个什么我们的分区的概念啊,它分区的话更适合并行计算嘛,这个是我们之前给大家已经讲过的内容啊,那么这个既然它适合并行计算的话,那么它到底多少个分区呢?告诉大家这个是可以设定的,来咱们回过头来咱们拷贝,拷贝以后我们写上啊,咱们叫做零幺,然后写个下划线,咱们叫做什么呢?叫PR paraless啊,PR就是一个简写了,咱们叫并行啊,所以来我们点击OK,点完以后把它放过来,这个地方我们把它都去掉啊,咱们都去掉,去掉以后呢,我们写上啊,来咱们叫RDD的并行度啊,并行度那个并行度啊,其实跟我们这个分区也有关系啊。
01:00
所以啊,我们其实所谓的并行呢,就是分区,为什么并行就是分区呢?这里我们先做一个简单的介绍,是因为我们先有分区,对不对?然后分区之间是不是独立的呀,同学们,它如果是独立的话,是不是就意味着可以有一个独立的task呢?对不对,它就有独立的task,它这边也是有的,它这个地方也是有的,咱们叫做独立的task,那么你独立的task就可以发给不同的executor来执行吧,对不对?同学们,这个没问题吧,所以如果他们能真正的同时执行,这不就是并行的概念吗?所以呀,这个分区它其实跟并行度是有关系的,但是是不是一模一样呢?也不见得,举个例子,我现在的资源只有一个execcu,然后呢,你跟我说咱们的分区呢,干嘛呢?诶有三个,那我问同学们这三个分区它同时干嘛呢?我们有一个任务啊,咱们叫task,它有我们的任务了,那好那。
02:00
这三个task可能它同时执行吗?不可能,现在我们就一个equ,如果就单核的情况下,是不是三个task发过去之后只能有一个在执行啊,对不对,顶多是并发执行,而不是并行吧,所以分区和并行度是有关系的,但是你要知道我们的这个分区啊,它和B型度它是可以不一样的啊,它们是有一些区别的,把概念先区分开,我觉得就可以了啊好,那我现在呢,写上SC点,我们叫make r DD,然后呢,在我这就直接给他写了,叫LIST1234,哎,我就这么写,那我这么写了以后,那我怎么知道它又分几个区呢?哎,这个时候大家看它会有第二个参数,第一个参数叫做集合序列,咱们传个list没问题,第二个叫做number less,这个就是切片的数量,其实就是分区的数量,好,那我现在给他一个二啊,给他一个二,这个二就表示的是我的四条数据,我要分两个区,所以啊,咱们这里说一下make r DD啊这个方法,这个方法呢,它可以呢传D啊,我们叫做第二个参数,那么这个参数它表示啊,我们叫分区的数量。
03:23
啊,你到底有多少个分区啊,诶可是老师呀,那你这么写完了以后,我哪知道我们到底有多少个分区呢,我根本就不知道啊,对不对,我怎么去看呢?这个时候我们来给大家说一下啊来,咱们叫RDDDR,它有个方法,这个叫做save,咱们叫s text file,然后写上一个咱们叫做output。这个是什么意思呢?咱们之前用的不是它,咱们之前用的是那个什么collect呀,For it对不对,这个是这样的,将咱们处理的数据啊,处理的数据保存成我们叫分区文件,什么意思呢?就是你的处理的这个1234的数据啊,我会直接保存成分区文件,以分区为单位形所形成的文件,你不说两个区吗?好,我看看它输出以后是不是两个分区就OK了嘛,对不对,所以我们点击运行。
04:18
点击运行以后,看一看我们当前的这个结果到底是个什么。好了,大家可以看到已经执行完了,执行完在咱们左边的位置,这边会有个叫output,我们打开,打开以后大家可以发现是不是PARTITION0PART1啊,这就是我们的分区文件,两个上面呢,是一些状态文件和我们的CRC校验文件,这个咱们不管它,咱们就考虑这两个文件就可以了,所以首先我们这个分区数量是没有问题的,诶老师,但是我们之前就没有传呢,你之前没有传的话,那到底是怎么回事呢?对不对,所以啊,咱们接着写啊来我们的第二个参数它是可以啊不传递的啊不传递的,那么如果不传的话啊,可以不传递,那么我们的make r DD方法它会使用咱们叫默认值。
05:12
诶怎么体会呢?我们点一下叫做make r DD点点完以后你会发现第二个参数,它会有一个默认值,这就是我们不传也可以的原因,这个叫什么呢?它叫默认的并行度,所以拷贝啊,这里我们说一下它会使用默认值,这个默认值呢,我们称之为叫默认啊,或者叫做对就叫默认吧,默认的并行度,所谓的并行度呢,就是我们并行执行的那个任务的数量,所以啊,它的目的是希望你创建指定的分区,在足够的资源的情况下,可以并行计算它这么个概念,所以啊,就这个值大家看一下,我是可以不用传的,可是你不传的话,那么你现在是多少个分区呢?所以啊,把这个来把这个注掉啊,注掉注掉以后这个二我不要了。
06:02
那你不要的话,我现在把这个output呀,给它删掉啊,给它delete一下,那我删掉以后,我就想看一看,我当不传这个分区数量的时候,我们到底有多少个分区,它是怎么算出来的啊,所以运行运行以后看结果啊,只要它出来了,那么一定可以看到它的结果啊。好,已经出来了,那这个出来呢,咱们看一看到底有多少个吧,同学们来啊来这个是我们的output点开,哎,点开以后同学们看一下PART012345670到七,那么总共是八个分区,诶老师怎么是八个分区呀,这里我们首先就得给大家看看它的那个源码了,就是它这个默认的并行度是怎么来的,我们不知道,我们再来看一看对吧?来我们点一下点点完以后这个地方叫默认的并行度,再点一下你会发现它是一个方法,好再往下它里面有一个叫task schedule,这是一个任务的调度器,然后呢,取它的默认的并行度对不对,所以我们来拷贝,然后点一下点点完以后你会发现它是一个抽象的方法,而且它在特质当中。
07:19
那这个肯定不能运行嘛,那所以我们真正在运行的时候用的肯定不是它应该是具体的那个类吧,所以来找一下我那个快捷键叫CTRLH。那么找到它在这儿呢?叫task schedule m PL,所以打开,打开以后我们搜索一下,搜索,搜索以后大家会发现在这个地方它就有这个方法,那么有这个方法呢,有一个叫back end back end呢,我们称之为叫后台,对不对,那这个也有一个默认的并行度的方法,所以拷贝,拷贝以后再点一下,点完以后你会发现它依然是一个抽象的,它是一个。怎么办?我们还需要看它的具体的使用对不对,所以CTRLH,那么这个时候呢,它有两个,那么我们现在用的是本地的环境对不对,所以我们就看这个叫local点一下啊,点点完以后在我的这个地方咱们搜索一下来回车,回车以后大家会发现它的核心代码就在这里了,拷贝拷贝以后我放到咱们的这个位置啊,它不是采用默认值了吗?那么这个默认值是什么呀?就是它。
08:29
这个就是默认值,那么这个默认值是啥意思呀?首先我们回过头来看我们的这个地方啊,咱们点一下点点完以后大家会发现叫schedule com复,这个。com是啥东西啊,我们点它一下点点完以后叫sc.com,它是什么东西?点你看什么东西叫18克康复,其实呀,就是我们在最开始的时候给大家准备的这个配置的对象。那么这个配置对象会怎么办呢?它会从配置的对象当中去取我们的配置的参数,那取配置的参数,如果你没有配,它会取它的默认值,所以啊,这个默认值就非常重要了,为什么?因为咱们从来没配过,对不对?那这个值是啥意思,我们就得解释一下了啊来。
09:22
我们的Spark啊,在我们的默认情况下啊,默认情况下它会从我们的配置对象中啊获取咱们的配置参数,这个配置参数就是它咱们拷贝过来啊放过来,然后呢,如果获取不到啊来写上,如果获取不到,那么他使用我们的这个叫做total Co诶咱们的cos啊这么一个我们的属性,那这个属性,这个属性它的取值是多少呢?它的取值为当前我们的环境的最大和数,最大可用和数。
10:01
哎,就是这个意思。就是我们当前运行的环境吧,咱们叫做运行环境的最大可用合数是这个概念,诶那你当前的环境是什么呀?叫local,叫本地,那么本地的最大可用核数是什么呢?同学们看这啊,咱们点一下,点完以后有一个叫设备管理器,那么在我当前的电脑当中,它的设备管理器我们找到这个叫处理器点点完以后大家会发现这就是我们的核数,我现在里面是八核,所以说它的这个地方就会有八个分区,诶就是这个意思。所以啊,这个呢,我们把源码呢,给大家看一看,大家的理解就应该更加深刻一些,诶那老师那我现现在假设我要把这个配一下呢,大家看啊来我们拷贝,拷贝以后咱们点,嗯。咱们来给它配一下啊,你配一下的话,我们拷贝把这个拿过来,拿过来以后我这不说别的了,我给个五吧,来我写个五对吧,我写个五,那我写个五的话,就意味着我要有五个分区啊,所以说我们的这个地方来啊,咱们看一看,我现在就准备来运行一下,我就看看我们到底生成的是不是五个分区就够了啊,所以这个参数是可配的好了啊,咱们看一看这个地方是个五啊,那么如果成功的话,打开output,点开大家看一下01234是不是五个没问题吧,嗯。
11:29
所以啊,咱们的含义就给它搞明白了啊,所以说你可以指定个二啊,也可以指定一个什么五啊三啊,或者是用默认的这个环境也都是可以的啊,没问题。
我来说两句