00:00
呃,我们之前呢,已经大概的把RDD是什么样的一个数据模型和结构呢,给大家简单的说了一下,那我们稍微的做一个总结,把咱们前面讲的东西呢,咱们给他总结一下,咱们回过头来,同学们看,我再把咱们这一块的东西啊,咱们拿过来,这是我们之前给大家做练习的时候的一些我们的东西啊来咱看一下,呃,咱们这里呢,现在呢,是有什么呢?我们的driver和我们的ex,然后中间呢,有两个task,这边是一个RDD,然后呢,我们再去执行的过程当中,需要把RDD当中的东西啊,给它分解成我们不同的task,对不对?那这个时候问题来了,它是怎么进行分解的呢?而且咱们说了RDD在咱们前面呢,不光只有一个,所以啊,咱们暂时先不考虑我们说有多个RDD的情况,我们假设就是一个RDD,那么如果就是一个RDD的话,同学们看来咱们假设呀,就是读取文件啊,咱们就读取文件,把这个呢给它拉大,然后呢,把这个RDD呢也给它拉大,然后呢。
01:00
这个时候我们在上面呢,会有一个我们的文件,所以复制啊,给它复制过来,然后这些呢,给它稍微的我们挪一下,诶他们挪一下,然后呢,把它拿过来,那我现在呢,我们就可以在这个地方,比方说我们写上咱们叫hello啊,咱们叫hello,然后盖。接下来我们再写。我们叫hello啊,咱们的Spark。好了,写完之后,那我接下来我们就要读取我们的数据,对不对?同学们啊,咱们要读取数据,那你读取数据的时候,我们就应该想办法呢,把它形成一个RDD对不对?但是我们这儿也别整那么复杂了,咱们就读文件就完事儿了,那么你读文件的话,你的逻辑是什么呀?你的逻辑大家想想,那是不是就是我们的这个东西来同学看,我们是不是就叫text file啊,所以咱们RDD当中是不是应该有读取文件的一个功能啊,那这个呢,我们就叫text file啊,就跟我们那个文件当中的这个代码是一样的,大家看在我们最上面的地方是不是有个叫text file啊,那么在这里面这个RDD就应该有这个功能,哎,老师呢,为什么不是说又有map呀,又有Fla map呢?就是因为它是一个最小的计算单元,它里面不能有太复杂的逻辑,如果你想要有复杂的逻辑的话,你需要组合多个RDD,就意味着这个紫色的RDD就是专门读取文件的,那么这个呢,我们就没有了。
02:23
对不对。这个呢也没有了,那好,那现在呢,我们如果要是说有个叫T,那咱们举个例子啊,这边呢,就是一个read的功能啊读取文件,那我现在光有它还不行,为什么呢?因为我的数据我要想办法读到,对不对,可是你读完了以后,那我怎么知道这个分解成task的时候,咱们的这个数据应该怎么办呢?比方说我这我觉得这个hello不太好,比方说咱们就叫一和二吧,啊咱们就叫1234好不好,同学们。所以啊,我把这个去掉啊,把这个去掉,去掉以后把这个我们变小一些啊,咱们变小一些,OK,反过来诶,就1234,那么现在你有一个计算逻辑,你的计算逻辑是为了把1234给它读过来,那么如果你把1234我们假设它读过来了,那我怎么能够把它来进行我们的区分呢?我们怎么知道一和二应该放上面那个task,我们的三和四要放下面那个task,对不对,我怎么知道,我不知道啊。
03:18
那该怎么办呀,同学们,诶,所以我们在RDD里面光有计算逻辑是不够的,它还需要想办法在后期当中去切分数据,那这个切分呢,我们可以用咱们之前学过的一种方式,咱们大家学卡夫卡的时候,为了提高它的并行消费能力,是不是有个分区的概念?对不对,同学们,所以啊,那我觉得咱们这个图形是不是可能再这么画可能会更好一些呢,来。把这个呢,我们画短一些啊,画短一些,把这个呢,咱们也给它画的稍微扁平一下啊,咱们扁平一下,把这个我们的read的操作呀,咱们放到这儿来,把1234呢,我们放过来啊,咱们放到这个位置好了,那我现在呢,就是这么一个情况,那么现在呢,我们干嘛呢?我们的RDD啊,现在准备读数据了,它读数据的时候,诶大家看在读数据,那这个数据呢,我们说了要想办法在后面给他进行切分,所以为了能够实现这种并行操作,为什么呢?多了它是个并字行吗?所以啊,咱们其实是有一种分区的概念呢,我在这里面呢,哎,就有一个分区,然后在这里复制,诶复制一下,那么你复制完以后,那能不能在我读数据的时候,比方说大家看我读取过来数据,诶好,我现在比方说读个一,你读个一之后,那么你就把这个一放到这个分区里面,是不是就可以了呢?诶把它拉长一些啊拉长一些,我把这个颜色我们标识一下。
04:47
所以大家会发现我们这边就有一个类似于分区的感觉,这个分区的目的就是为了给它形成独立的task并行执行啊,那同样道理,我要读一个二,那么读二的话,这个二也在这个位置,然后呢,你再读三的话,那么这个三和那个四就在这个位置了,对不对?所以啊,把这个咱们稍微的往这边挪一下,咱们把这边往这挪一下,然后呢,我的箭头,诶,它读取之后应该是这样的一个简单的功能了,然后呢,我们把这个呢,给它放过来,诶放到这边来啊嗯。
05:19
好了,所以同学们看我们的这个RDD,如果这种方式就会好很多,为什么呢?我事先呢,把这个分区准备好,然后再有读数的时候,诶,走不同的分区,一和二走这个,那么二三和四走这个,这样的话不就区分开了吗?当然了,不仅仅只有两个嘛,你可以再来嘛,比方说第三个,第四个都可以,那么相应的我们的资源是不是也应该更多一些呢?对吧,所以啊,这就是我们的模型的概念,咱们RDD就是一个最基本的数据处理模型,它里面包含了我们的这种分区的概念,它是为了提高并行计算的能力,而且它的计算逻辑是非常简单的,所以我们把它称之为最小的计算单元,在SPA当中RDD非常的重要。好了,同学们,我们现在把这个说完之后,回过头来咱们看课件,咱们课件当中我们一块来看一看啊来,他说了我们的RDD是SPA中最基本的数据处理模型,代码中它是一个抽象类,这个呢,我们可以给大家看一看,咱们点一下,点点完之后咱们来看看是不是个抽象类啊,没有任何的问题,正好呢,跟咱们前面讲的还是有关联的,同学们看,我们再给大家讲IO的时候,我们的什么reader啊,什么input stream啊,其实是不是都是抽象类啊,为什么它有很多的子类可以包装在一块儿,形成我们功能的。
06:44
补充,对吧,它体现了一种装饰者的设计模式,所以这个没问题,好了,那我们继续往下,他说了,它代表一个弹性的不可变可分区里面的元素可并行计算的集合,这个暂时不知道什么意思,后面有解释。第一个叫弹性,这个弹性呢,他说了存储的弹性,它的内存和磁盘的自动切换,我们之前讲过,咱们的Spark它在做计算的过程当中,它优化了计算的过程,它是采用内存的方式,所以它的性能要比map reduce更高一些,对不对,但是内存是有极限值的,你不能把它全占满,所以在某些情况下是可以把数据放在磁盘当中的,他们可以自动的来进行切换啊。还有一个叫容错的弹性,所谓的弹性就是变化的嘛,它不是一成不变的嘛,那么这里的数据丢失,它就可以自动恢复,比方说大家看一下我如果三和四哎传给他在技。
07:44
转的过程当中出现了问题怎么办?没关系,因为我在读取的时候,我知道我读的是哪个文件,我知道是如何分区的,那么在这种情况下,我的三和四可以重新来读,这样的话数据其实是不会丢失的,那么这样的话就体现了一种容错的变化。还有一个叫计算的弹性,计算的弹性就是说当我计算出现了错误的时候,我可以从头再来计算,这样的话保证它不许出现错误。所以分布式计算当中啊,这个容错性是我们需要重点考虑的,你不可能说那么多节点全都正确。
08:20
有点难度对不对,万一某个节点出现了错误怎么办?那这样的话,你不能说整个作业失败了,那么其他的节点呢,就白执行了,肯定是不合适的,所以他这个容错是我们需要考虑的。还有一个我们的分片的弹性,这个里面所谓的分片就是分区啊,它类似于我们卡夫卡当中的partition,就是分区的概念,它可以根据需要重新分片,分区这是什么意思呢?就是说我们现在啊,比方说1234,但你发现说,哎,老师我现在有四个ecute,你最开始只有两个的话,你只能并行执行两个task,那我有四个ECU,那我并行四个多好呢,所以啊,它完全可以在后续的过程当中改变咱们数据的分区,那这样的话呢,可以让资源更合理的利用,否则你有四个equor,现在只用上两个,你不就浪费资源了嘛,对不对,同学们,所以啊,这个也是非常好的啊,它是分区的弹性,这个分区不是固定不变,它是可以呢跟。
09:21
必需要去改变分区,这就是所谓的弹性的概念啊,就是可变的意思啊,然后接着往下,他说分布式啊,这个分布式呢,说数据存储在大数据集群的不同节点上,其实啊,咱们RDD它专门是用来在分布式集群当中做分布式计算的,所以它的数据的来源呢,它数据的存储啊,包括它数据的计算呢,其实都是在我们的分布式环境当中,这个应该大家能够明白对吧?好,接下来是数据集,他说我们RDD啊,封装了是数据计算的逻辑,它并不保存数据,我们前面给大家介绍了,咱们的RDD是没有什么我们保存数据的能力的,它的数据就一点一点过来,过来啊,过来之后,比方说诶,现在是我们的这个颜色,对吧?然后呢,诶,他要给它分解了,就是记住啊,当他走到这一步的时候,这块就没东西了,然后呢,我们的hello。
10:21
Stella,然后呢,再往下走,往下走就变成了他们了,那变成了他们了,然后再给它做聚合,诶再给他做聚合,然后最后再得到我们的结果,所以啊,在这么走的过程当中,数据就已经离开了它的位置了,所以它并不是说保存,我们给大家画这个地方呢,只是告诉大家它经历的这个步骤,并不是说它里面真正把数据存下来了,它并没有存,这个同学们需要注意一下啊,所以我们这里说了,它是一个封装了计算逻辑的数据模型,它并不会真正的去保存数据,是没有的。然后呢,数据抽象,他说RDD是一个抽象类,它需要子类具体实现,那肯定啊,我们刚才看到了我们的Spark中RDD它是一个抽象类,它如果是抽象类的话,你要想使用的话,你肯定得去继承它,重写它的方法,对吗?所以大家回过头来看一下我们刚才看的这个地方,这不就是一个具体的子类吗?然后点一下它里面不就继承了RDD吗?诶,所以啊,这是它们的一个关系,在咱们使用过程当中,那肯定用的是我们的子类嘛,对不对,因为子类的功能更加丰富,而且更加的完整。
11:35
好,那么我们接着往下啊,下面呢是我们不可变,这个不可变跟前面可变那个弹性的概念正好相反,咱们前面是弹性,就是可变的意思,它不是一成不变的,但是在某些情况下它是不可变的,他说了RDD封装了计算的逻辑,所以它是不可以发生改变的,就说明啊,它的逻辑一旦封装好之后,你是没有办法发生改变的,如果你要想改变的话,你只能产生新的R,所以大家看这个图,我们这个里面它专门用来读我们的文件数据,你要是想做扁平化,OK,创建个新的RD,把它包起来啊,形成一种我们的装饰者的设计模式,对不对?那如果你要想去做什么,你要想去做一个映射,OK,我们再来创建一个新的RD,你想做分组聚合,我们再给它创建一个新的RD,所以它这个里面就了我们所谓的不可变封装的。
12:36
不可以发生改变,想改变可以创建新的,就是这个意思了,然后下面呢,是可分区并行计算,咱们刚才说过了,如果我们事先不把我们数据给它分解好的话,那我们在后面的话,我怎么知道我们的一和二在哪个任务当中,我们的三和四在哪一个呢?对不对?所以说你分解上还比较麻烦,那我就不如啊,我事先先把这个所谓的分区先准备好,当你读取完数据以后,诶,我就放在指定的分区当中,这样的话我的分区当中就可以传递数据了,把数据传过去,这不就OK了吗?
13:13
所以啊,咱们用这种方式呢,把数据给它分开,还是一个好的选择的,所以有一个分区,那么既然有分区,他们互相之间不会受到影响,所以是可以并行计算的。这些呢,就是我们的RDD的相关的一些特点,把这个概念呢,咱们再来说明一下。
我来说两句