00:00
刚才我们把RDD啊,它是什么,咱们简单的介绍了一下,我们也通过画图的方式让大家了解了一下基本的RDD,它在整个分布式计算当中它的作用,对吧?它是用来把我们的数据准备好,把逻辑准备好的一种结构,因为所谓的数据结构,它不就是我们的组织和存储数据的一种方式嘛,对不对?哎,就是这样,可是咱们说过了,最小计算单元是因为我们需要有大量复杂的操作要组合在一块儿来完成。所以啊,光靠一个RDD是肯定不够的,可是那你多个RDD,那怎么理解呢?我不是很明白,所以我们接下来呢,给大家讲一下RDD的实现原理,它的逻辑是怎么通过组合来完成。我们要看一看了啊,那么在讲这个之前啊,我们首先得给大家介绍我们Java中的IO的处理方式,诶老师怎么还提到Java的IO了呢?诶,这个反正都是我们的,呃,输入输出嘛,对吧?你这里不也是输入输出嘛,对不对,只不过是你的输出是我们的task,它的输入是个task对不对?所以IO呢,这个我们先理解一下来,首先我们先把这个文字呢拖过来,我们叫做IO,那么我们当提到IO的时候,首先就是input和那个叫什么呢?叫alut对不对,咱们叫输入输出,但是我相信同学们看到IO的时候,还应该能够想到,在咱们Java当中,它是有流的概念的,对不对?那么所谓的流的话,是不是应该有自节流和自符流啊,哎,所以我们写上啊,咱们叫做自节啊,咱们叫做自节流。
01:36
啊,还有我们叫做字符流。那么自节流和制伏流呢,是不一样的,对不对?他们用到的累呀,包括处理方式都会稍微的有些变化,这个没有关系,咱们慢慢来,咱们一块看一看啊,那么我们所谓的这个IO啊,那么我们来想一想,我们最开始学的时候,大家想想IO是不应该是读文件呢?那咱们就以文件为例,咱们现在假设啊,有一个我们的file,咱们要去读取它,咱们要去读取这个file,把里面的数据给我读过来,那么你读过来的话,同学们想一想,那我这个地方是不是应该有一个流啊,所以这个流该怎么写呢?我们把基本的代码呢,给大家先列出来啊,来,咱们放到这边。
02:19
嗯,给它字体呢,稍微的放大一些啊,来,咱们写上,那么我们基本的流是不是应该叫input stream,给个in,咱们叫做new,咱们叫file input stream呀,然后呢,写上一个我们的pass吧,对不对,写一个路径,那么这个路径当中,然后呢,有个叫in.read或者我们这么写,大家想想你们在写的过程当中应该是什么,比方说int I,它等于什么负一之类的,对不对,然后呢,写上它,然后写上一个啊,Well well什么呢,在我们的这个地方,来我们写上括号啊,咱们的这个in啊,咱们的这个I吧,咱们就I,它等于in.read然后如果它不等于我们的负一,那我们在这里是不是可以干嘛呀,给它打印了,哎,咱们叫print啊,写的不对,没关系,咱们意思意思啊,然后把这个I打印出来吧。
03:10
同学们想想是不是这么写啊,哎,基本的操作,你要说是代码一点没问题,咱也不知道,所以先不管它往下来。好了,这个呢,就是我们的代码,那么我们现在就看一看我们的file,它是咱们的数据,它是咱们的数据吧,同学们,然后呢,咱们这个地方就是个流啊,那个这个流呢,我就写上了,咱们叫file input,咱们叫stream,对不对,那好,那我现在呢,我把它标识上一个我们的红色,那么我们的这个流程应该读这个文件呢,所以他来读这个文件好了,他读这个文件的时候啊,放过来,他读完了以后干什么,是不是想要打印在控制台上,所以啊,咱们来拷贝,咱们放到这边有个叫cancel啊,咱们叫做cancel,这个cancel呢就是控制台,那么我们现在就要想办法把它打印在控制台吧,所以我们的箭头啊,从这个位置我们指向咱们的这个cancel就是它。
04:07
诶,从这边读过来,然后输出到咱们的cancel,但是怎么输出啊,首先大家会发现它有个什么read,这边是有一个我们的read方法,它read的话会读取咱们的数据吧,所以呢,咱们这边给他来一个啊,咱们叫做read,嗯。好了,其实这个read呢,应该是什么呢?在我们这个地方去画对不对,但是我为什么画在这儿呢?是因为这个和print之间啊,会感觉怎么会感觉比较近一些,对不对,其实你要画到这儿也是可以的啊,但是我们这里呢,就简单的画一下,就是我读一个输出一个,我读一个输出一个,就这么回事。所以啊,这个是我们的一个基本的IO读取文件的操作。但是大家记住了啊,我刚才说过了,咱们这是一个什么流,叫做stream,那么stream的话是不是应该叫字节流,那么字节流就是一个字节一个字节的来读的,对不对?而且大家看这个代码,这个代码是我read,它会读取一个字节,那么这个字节大家想一想读到了会怎么办?
05:07
读到了是不是就直接打印了,然后你再去读下一个吧,所以啊,它是读一个,诶打印一个,读一个打印一个,所以在这种情况下,我们会发现啊,功能是可以实现的,但是效率高吗?效率并不高,为什么?因为它读一个打印一个,读一个打一个啊就等于一个一个来操作,它性能怎么可能高呢?肯定不可能高,所以啊,咱们在学习这个IO流的时候,我们应该有给它优化的这种方式,对不对?所以咱们当时学的时候应该学过一个叫缓冲流。对不对,诶就是你别着急,我读过来以后马上就给他输出对不对,那这样的话太慢了,所以呢,拷贝拷贝以后大家看一下来往下走。往下走以后,后面的这个代码呢,就是不说了,咱们前面前面的地方,我相信大家应该有印象吧,咱们是不是加一个什么东西啊,叫做new,咱们叫做buffer的input stream呀,啊同学们把这个给它包起来吧。
06:11
这个有没有印象同学们,诶,我们来给它放过来啊,咱们来叫八分的啊八分的啥意思呀,缓冲嘛,但是后面代码基本没有变化吧,对不对,诶老师,那这个我们该怎么理解呢?所以啊,把上面这个图形咱们拷贝过来,拷贝以后咱们往下来放啊往下来放。那么放到我们下面的时候,大家看一下,这个时候记住了,我们这个叫new叫buffer的input stream,把我们刚才的那个fair input stream是不是给它放进去了,包进去了吧,所以啊,咱们这有一种包含的感觉,对吗?所以大家看一下啊,来,我们回过头来把这个呢,我们复制一下,把它诶变大一些,就是一种包含的感觉呀,然后颜色给它换成一个绿色啊,然后置于底层,哎,把它包起来,所以这个呢,我们改一下啊,咱们叫巴。
07:00
咱们叫buffer的,哎,Input stream,把我们的fair input stream给它包进去,那老师,那我包进去的目的是什么呀?那不就是说在我们八份的input stream当中,我们要增加一个缓冲区吗?那好,现在咱们准备来增加一个缓冲区,这个缓冲区干嘛呢?诶我们就叫做什么呀,咱们叫做buff对吧?诶咱们就叫buff就可以了啊,就在这儿了,然后颜色给它稍微的变一下啊,就是这样。那好,那老师,那这个数据的操作上有没有什么变化呢?我告诉你没有任何的变化,为什么当你read的时候,它照样开始读取数据了吧,所以这个时候我们的数据就被读到了,大家看一下,比方说现在有一个A啊,这个A,这个A现在呢,就会被读取到啊,被读取到所以就是它,那么你读完了以后,大家看一下来,我们往这边走,往这边走被读到了吧,但是读到了以后它会直接打印吗?不会,它会怎么办?它会放到我们的缓冲区当中去,对不对。
08:04
这个时候他就直接走下一步了,就意味着它在当前的代码当中其实是不会直接输出的,而是干嘛呀放到缓冲区当中,这个时候干嘛呀,读取下一个对不对,马上就读到下一个,不用去打印,直接读下一个,那么这个B是不是诶也被读到了,也放到了我们的缓冲区当中,同样道理,如果再来一个C的话,效果上是不是完全一样啊,所以大家会发现它到了这一步就马上结束了,该走下一个了,那什么时候打印呢,同学们。我们学过是不是当我们的这个缓冲区超过阈值的时候,对不对,它如果超过阈值了,那么这个时候我们的缓冲区会一次性的将我们的数据给它打印出来对不对?所以同学们看啊,来我们这里给它移过来,移过来以后ABC拿过来复制,是不是直接就给它在这边打印了,对不对?诶就是这样,这个跟前面就不是一回事了,为什么前面是这个样子来拷贝。
09:10
如果是A,他这个A呢,干嘛呢?A过来过来过来过来以后被打印在控制台上了,是不是这个时候才会再去读下一个呀?诶你看写成一个B,然后呢,他来走过来,走过来走过来,诶再去打印,打印在我们这儿对不对,然后再来,我们写上一个我们的C,然后放过来,这个C呢,把它拿过来,拿过来,诶给它读到这边来,所以说你会发现是我们每一个字节在被它打印完毕之后才读取下一个,而我们这儿不是,我们这儿呢,是把读取的数据放到缓冲区里面,这时候还不需要输出,是当我们缓冲区超过了阈值之后才统一输出吧,这个是不是类似于我们的批处理啊,那批处理肯定要比一个一个执行,是不是性能要好很多,对不对?所以啊,这个是我们提升性能的一种方式啊,就是加一个缓冲区啊,就是这样的,好吧,同学们,我们先把这个咱们说清楚啊。
我来说两句