00:00
接下来我们来讲RDD的依赖关系啊,所谓的依赖关系啊,就是我们相邻的两个RDD之间的关系啊,嗯,这个咱们之前给大家说过了,那么我们如果想看到他们的关系呢,我们可以通过这样的方式来把咱们这个给它关掉啊,关掉以后呢,把这边打开,然后拷贝,呃,零二啊,然后呢,点击OK,然后呢,改个名字,然后这个时候这个debug string啊我们就不再要了啊,咱们点它里面呢,是有一个叫做我们的dependis啊,把这个呢,我们拿过来啊,同学们看,拿过来拿过来,拿过来啊,把这个稍微替换一下,然后呢,我们直接来运行。之前咱们那个叫to deb string啊,它其实是为了把那个血缘关系呢,给它展现出来,现在呢,我们的depends呢,是为了把相邻的两个RDB之间的那个我们依赖关系展现出来啊,咱们看。呃,首先呢,我们在第一个我们的这个星号的位置啊,它里面呢,会有一个依赖关系啊,之所以有依赖呢,是因为它的底层呢,其实啊有点大家看啊,我们点一下,点点完以后,我们这边呢,会有个什么呢?我们打开啊,打开以后有个叫hide file,那么这个上面呢,大家会发现有个叫new hi do r DB,对不对,但是这个new出来之后,咱们后退你会发现呢,其实当你去new出来之后啊,它后面做了一个什么呢?我们的map,所以呢,也就意味着对于我们来讲,它其实有两步操作,一个是new,一个是map,所以它里面其实也就会形成一个依赖关系啊,是这样的。
01:36
然后呢,我们这边再后退啊,后退以后来。我们的这个RDD的跟我们下一个RDD之间,诶也形成了一个依赖关系啊,然后呢,我们再往下,下面呢,这个我们的它这个RDD和下面这个RDD呢,也不对,看错了,就是这个word和这个word to one它们之间也形成了我们的one to啊这种dependency依赖关系,然后呢,到了我们最后这个星号,最后这个星号呢,就叫做另外的一个叫sle dependency。诶这个就很奇怪了,说诶怎么依赖关系还不太一样呢,怎么还有个叫one to one教一对一呢,就是我们依赖关系啊,说的是两个RDD之间的,它叫一对一,难道还有别的情况吗?对不对,那这个说的是什么意思呢?首先啊,咱们这里给大家描述一下板。
02:23
咱们之前啊,说两个RDD的依赖,这是没有任何问题的啊,所以来我们写上它放过来,然后呢,这边我们放过来,诶好,这个呢,我们写上RDD啊来呃,比方说这是那个旧的吧,哎,咱们旧的那个O的啊,咱们叫O的那个RDD。然后这个呢,我们写上啊,咱们叫做new叫新的那个RDD,所以呢,我们这里用一个我们的红色啊,然后呢,这里用一个我们的蓝色或者绿色都行啊好了,然后呢,记住啊,我们这个新的RDD,它是依赖于旧的的。所以我们的箭头呢,其实应该是这样来画,对不对,所以啊,咱们应该这么来画啊,这个是它的一个依赖关系啊,所以来我们写上依赖,嗯。
03:07
那么这个我用到了你,我依赖于你这个本身没有任何问题,对不对,所以这个依赖呢,其实我们觉得是没有任何问题的,但是呢,我们这里除了这个依赖以外,还强调另外一个概念,就是数据的依赖啊,就是我们现在的依赖呢,指的是我们对象之间的依赖,那我们在分布式计算当中还考虑到一个数据的依赖啊,那这个怎么理解呢?咱们来看一看。所以啊,把这个呢,我们拿过来啊,咱们说那个分区,因为咱们数据都是在分区里面嘛,所以我们拷贝,诶好,然后呢,在这种情况下,同学啊,咱们再来拷贝,拷贝以后拿过来,拿过来以后啊,那现在我们这边旧的有两个分区,新的有两个分区,分区数量是不变的,然后呢,我们在这里呢,给他一个一啊,然后呢,给他一个二,哎,好了,我放到这边啊,写个二,然后呢,我们再来啊,我们写上它好写上一个我们的什么三,然后呢,写上一个四。
04:03
行了,如果我们新的这个分区当中的数据啊,它和我们旧的RDD的数据呢,他们的分区数据呢,是保持不变的,那么这个就等于它直接就把数据给了他,这就叫一对一,你数据的来源是依赖于一个分区的数据,记住啊,这是我们新的RDD的分区数据,它依赖于我们旧的RDD的一个分区,这就叫one to one。我的数据都来自于你,所以啊,在这种情况下,我们就称之为叫弯to弯把这个呢反过来,那同样道理啊,咱们再来。那我们现在呢,下面的这个啊,咱们再来三和四,那么三和四呢,来拿过来,那这个时候呢,大家可以看到,诶,我们放到这边是不是也都来自于一个分区啊,就是下咱们这里可以有一个概念叫做什么呢?叫做新和旧,或者叫上游和下游,就是我们的新的和旧的这种感觉啊,所以我们这里把文字咱们描述一下来。
05:01
我放到这边啊,咱们写上,嗯,就是说我们新的啊,来咱们新的RDD的一个分区的数据,它依赖于我们旧的RDD一个分区的数据。诶就是这样的,他不会说什么呢,诶我们的一二啊,还有这个三和四它也放过来了,就是你的这个我们的分区的数据,它依赖于两个这个分区,那就不是弯图弯了,所以这个呢,我们称之为叫弯凸湾。所以放过来啊,嗯,这个,那我们的依赖啊,咱们称之为叫做one to one啊,咱们的依赖就是一对一的依赖,这个就好理解一些啊,就说明啊,我们的这个数据之间它有一定的关系,但是啊在某些情况下可能不是这个样子的,比方说咱们那个分组啊,大家看一下来,咱们来拷贝一下,拷贝以后咱们复制啊来复制,嗯。放到我们下面来,放到下面来以后,它也是一个新和一个旧的,但是呢,问题来了,我要把我们的奇数要放在一块,要把偶数放在一块儿,所以这样的话,大家会发现这个三。
06:09
和这个二就要调换位置对不对,我们的一和三在一个分区,那就意味着这个我们下游的这个紫色的分区,它的数据其实是依赖于这个分区和这个分区两个分区的,为什么呢?一来自于这个分区,我要依赖于它,而这个三它来自于这个分区,我要用到它,所以我用到谁我就依赖于谁嘛,那所以我的箭头大家可以看到来,这个箭头就应该发生点变化了,它应该依赖于我们这边。大家想是不是这样的,所以啊,这个时候就不是所谓的one to one了,一个对一个了,他可能一个就对多个了,对不对,所以呢,我们这里再来。把这个呢,我们翻过来啊,咱们放过来,所以呢,这种方式跟上面呢就截然不同了,这里呢也给它复制啊,来复制OK。好,翻过来咱们说了,新的RDD的一个分区的数据依赖于旧的RDD的什么,咱们叫多个分区,诶,咱们叫做多个哎分区的数据,那么这个依赖呢,我们就称之为什么呢?有一个特定的名词叫做什么呢?叫杀否依赖。
07:11
为什么这么说呢?大家会发现数据被打乱重新组合了吧,你的一和二被打乱了,然后呢,和三和四打乱之后重新组合在一个新的分区当中,这叫打乱重组,那么打乱重组的话,这个依赖我们称之为叫杀否依赖,所以啊,咱们回过头来把这个呢改个名啊,这个呢,我们写上叫one to one。One two one啊好了,然后呢,我们把这个呢,我们再来写上一个啊,咱们管干嘛呢,写上叫沙uffle,诶咱们叫做uffle依赖啊,但是有的时候啊,这个哎不好理解啊,不好,所谓的不好理解是什么叫杀否依赖对不对,所以啊,为了能够让这个依赖关系更好明白,其实啊,它有另外一个名词,大家回过头来看一看,咱们这里面不有一个叫one two one dependency嘛,所以我们拷贝,拷贝以后咱们搜索一下它的源代码来。
08:02
我了快捷键啊,两个shift完了个快捷键,然后呢,来拷贝,拷贝以后我们打开它的这个源码点开,点开之后大家有没有发现这个class one two one dependency,它其实怎么了,继承了这个叫narrow dependency叫做窄依赖对不对,所以啊,这个一对一其实还有另外一个称呼,所谓的另外一个称呼叫做窄啊,所以呢,我们写上一个括号啊。来,把这个放过来,嗯,咱们写上叫做窄依赖啊。嗯,窄一栏,那有窄的话,那么相对来说什么,就另外一个称呼叫做什么呢?较宽一栏,所以啊,咱们这个沙否呢,大家会发现它比较宽,对不对啊,当时的一个含义了啊,所以呢,我们这里给他改一下,咱们叫做宽以来,但是其实从源码的角度来讲,是没有宽的概念的,只是你不是窄就是宽嘛,所以啊,咱们有一个概念啊,需要大家能够稍微的明白一下,所谓的杀否依赖就是宽依赖,而我们的这个就叫窄依赖,那之所以叫窄依赖,是因为源码当中有一个叫做narrow dependency,所以咱们才这么称呼它好不好,同学们,诶老师,那我怎么能够看到我到底是我们的宽还是窄呢?首先就看这个叫one to one dependency,诶老师,那刚才不还有一个吗?所以来咱们打开。
09:19
这个叫做shuffle dependency,所以打开打开以后来咱们搜索一下,搜索以后你会发现呢,这个shuffle dependency,它其实直接就继承了dependency,所以没有那个narrow的概念啊,所以咱们点一下没有,那没有的情况下,那我们只能把它认为是什么,就是我们的宽,不是窄就是宽嘛,诶就是这个概念,所以把宽窄依赖呢,这个概念呢,我们也稍微的理解一下,好,那我们现在呢,看到了以后,这个依赖关系就有了,然后下面呢,就有窄依赖和宽依赖的概念,那这里呢,我们简单的再看一看窄依赖,它表示每一个上游的RDD的分区数据最多被下游RDD的分区数据使用。啊,然后窄依赖,我们形象的比喻为独生子女,你只有一个孩子,那你会把所有的东西都给他对不对,不会给别人,那不就叫独生子女嘛,就这种感觉啊,所以他说最多为下游,大家可以看到我们从继承关系的角度来讲,那么我们的O就是我们的什么上游,我们的new就是下游,那么它的一和二这两个数据最多。
10:21
也就是说只能记住啊,咱们就只能被一个分区所拥有,所呃独享吧,那这样的话呢,就叫做窄,但是呢,如果我们上游的RD的数分下的个R的蓝色啊,那么在这儿被这个共享了,被它共享了,然后呢,你这个R呢,它这个地方呢,来放到这儿被这个给它共享了,所以啊,就等于你上游的这个RDD分区的数据被下游的多个分区所共享,那么这个咱们称之为叫沙否依赖,也称之为叫宽依赖,因为中间会有杀否的过程。
11:03
好,往下看,下面是宽依赖,它说宽依赖表示同一个上游RDD的partition分区数据被下游RDD的分区所依赖,会引起沙否,我们形象的比喻为多生啊,如果你有多个孩子的话,那你的东西是不是要平均分给我们多个孩子呀,对不对,比较公平一些嘛,所以啊,这种感觉就跟我们的宽一带是非常类似的啊,所以我们在这里呢,给这个概念呢,咱们先描述一下,咱们后面呢,再会详细的来解释这个宽一带和窄一带的作用。
我来说两句