00:00
好,接下来我们看一下第三张MAP6框架原理,那这一张呢,是MAP6当中最核心的一块了啊。那大家都知道啊,Map reduce呢,分两个阶段,一个呢是map阶段,另一个叫reduce阶段,那map阶段呢,我们一般统称为map test测,那reduce阶段呢,是reduce test测,比如说map阶段的任务,Reduce阶段的任务,那在map阶段它处理什么事呢?它主要处理的是根据你的数据源,对吧,你数据往这一放,那我可以选择用什么方式来读取你这个数据。啥叫用什么方式呢?那还记得吗?咱们默认的读取这个输入的文件,是不是按行读啊?对吧,哎,它的KV一个呢是偏移量,另一个呢是这一行内容,哎,一行一行去读取。那是不是所有的这个读取方式只能按照这个K是偏移量,V是一行呢?不是,哎,这里面就有一个组件叫input format,它可以对这个输入进行一个控制。
01:02
你说这里面我可以用这个fair input,还可以用test combine test,还有还有这个。啊,以前还有这个像什么k value啊,K value还有on online啊等等啊,那个叫我删掉了啊,因为在群里面用的不是特别多啊,但是呢,它的这个实现类啊,有非常多的这种啊处理方式可以来读取数据源。好,那这那这个数据源读进来之后,那么就把它交给这个map进行后续业务逻辑的一个处理,那这里面是用户要写的业务逻辑。好,那接下来进入到reduce阶段。那reduce阶段呢?哎,首先由这个reduce来拉取map阶段。处理完的数据,哎,是主动拉啊,后面会详细说哎那拉其实这个过程当中啊,中间要经历一个杀发的过程,哎沙发是一个非常复杂的过程啊,在这里面要进行排序。可以进行分区,还可以进行压缩。
02:02
哎,还可以进行合并,哎等等很多事情都会在这个S里面去讲,而且是咱们外六当中最核心的就是它,那我们后面再说啊,嗯,再往下reducer处理完之后,我想输出到哪。那这块我们也能够进行对它进行控制,叫output ma,它也有很多种实现类,比如说我现在啊,这个output输出的都是写到文件里面。对吧,那大家有没有思考过说我不想写在文件里面,我能不能写到。对应的其他数据库,比如说我写到买里面行不行。对吧,哎,我或者我写到后面我要学的h base。觉得ES。哎,我写到其他框架里面行不行呢?哎,只要有了这个out book map,我可以对它进行自定义。去实现,包括前面这个input也可以进行自定义。实现我们想要的功能啊,然后S当中中间这些变换啊,排序,我们也可以对它进行一个重新排序。
03:05
啊,分组排序。还可以进行啊,分区压缩啊,合并等等。每一个细节都能够进行根据用户的需求进行灵活调整。啊好,那我们先学哪呢?哎,我们学习的顺序啊,先学这个input map,再学呢suffer,再学out,就按照这个数据流的方向一点点往后给大家讲啊行,那首先我们来看一下第一个问题,说input数据的一个输入啊,切片呢,与map task并行度决定机制,上来一看,上来来一个新单词叫切片。啊,切片这个词呢,你先不懂,一会儿给大家讲啊,那与map task的一个并行度,那map task的并行度是什么含义?什么叫map test并行度啊,就说你前面啊,我画张图。那我们画一下图,假如说这里面有一堆数据。
04:03
是吧,哎,数据什么宋送啊,嗯,苍老师,嗯杨哥波波吧,是吧?哎,这些数据你有了这些数据,那好,那下面你派了多少个人来干活呢?比如说你需要开启多少个map task来处理这个数据呢?对吧,哎,一个。两个。三个还是多少个?这这个意思,那好,那我这里面开启的这个map test越多。是不是就是我处理的速度就是并发度要高一些。镜像我的map个数。个数决定。了我。并行度,并行度啊好,因为你看我这个三个map test之间是不误进行相互通讯啊,各干各的,比如说我这个map test,我处理这部分数据你给我了。
05:10
然后呢,下一个map处理这部分数据,你再给我最后这一部分给他。相互之间并不进行信息的一个交互,那我我这个map test个数是不是越多越好呢?大家思考问题是不是越多越好。那假如说我这个数据量现在是一个G的数据。那是我我我开三个,那我再加一个。效率大家能感觉到是吧,哎,可能会快一些,那好,那我再思考一下,我这一个G的数据,我变了,我不用一个G数据了,我说啊,这里面是1KB数据。然后再来再小可能说嗯,这里面是8B。哎,八个字节。那你觉得我还要开这么多吗?好像也不太合适,也就是说这个map task并不是越多越好,因为你的数据量,比如说已经到了这个1KB这种这种级别了,你再开八个这个map task。
06:08
你觉得会出现什么情况?你开启每个map test的时间都比你计算任务的时间都长了。因为开启map task需要一些前置准备工作,对吧,还需要呃内存的一个初始化。啊,然后初始化完毕之后,咔,一秒钟结束了,那么典型的宋老师嘛,对不对,哎,前期这个准备工作啊,做了一个健一顿健身啊,健身了十分钟,结果呢,啊一上战场啊,三秒钟结束。你这个就有点儿这个呃,得不偿失了是吧?哎,所以说这个就会有一个问题呢,并不是map test的个数越多越好,也不是越少越好,那到底多少合适呢?哎,我们来看一下。说map并行度决定机制,也就说设置多少合适,首先看第一个概念叫数据块。Block呢是ATS啊,物理上把数据分成一块一块,数据块呢是as的中种单元,这个块的概念大家应该有印象吗?大家复习一下,还记得它吧?哎,你点开这里面,是不是在将这个嗨豆架包分成了三块啊,还三块,而且这三块之间。
07:15
有什么相互联系吗?就从这个存储位置上。有联系吗?我第一块存在这,我第二块是完全可以存在103上。比如说你这块在102啊,啊这块103,那我这个呢是104。我可以分别去存,假如说我要设成一个副本的话。我可以分别继承。存在不同机器。好,那它就是物理上的一个切割吧。对吧,哎,你这个块啊,是纯HD Fi上物理的一个切割,那我们一般是多大一块,128兆一块。哎,物理仓的存储好,那数据切片是什么意思?数据切片呢?只是在逻辑上对输入的数据进行分片。并不会在磁盘上将其分成,呃,这个分片进行一个存储。
08:05
数据切片是MAP6计算输入的数据单元,一个切片呢,对应启动一个map task啊,啥意思啊,给大家举个例子。现在啊,这还是呃,数据我这个呢,变成128啊,我129兆好。我129兆的数据,我在物理上会怎么存?比如说我在ad上怎么存呢?他是不是这样存呢。128。然后再来一块。他会怎么说呢?还会这。对吧,哎,物理上它是这样的一个存储,哎,这个呢,可能在102,这可能在103,那么什么叫切片呢?逻辑上的存储呢?逻辑上的存储它只是比如说开一个T,它会记录说从零。
09:06
到128这个索引对吧?啊,物理上的地址,那这个呢,是一片记录上来,然后第二片呢,是从128~129啊,然后所以。是一点,哎,我这只是一个记录。对吧,我并没有把它这个数据啊,真正的去切割,你看我去切割了吗?我只是说记录一下啊,零到128呢,你要按一片处理,那128~129按一片处理。那我说的单位是兆对吧,那但是我这个呢,是实实在在的改变了它物理的存储,这叫物理存储。好,那我下边呢,这个叫逻辑存储。
10:01
哎,能理解了吧,啊,这是这块好,那懂了这个概念之后啊,那下面我们来看一下下面这道啊PPT啊。再来看一下我们的这个送送点avi,它有零到300兆啊,就是300兆的一个数据,那300兆的数据呢,我集群上目前有DATE1 date2 date33台服务器,那它在集群上的这个块的存储呢?哎,DATE01,哎上呢,存储的是128兆,那DATE2呢,存储的也是128兆,只不过呢是第二块开始,那date的零三上存储的这是多少?300减二百五六,嗯,是44兆,对吧?哎,44兆,OK,这么大存储空间。那存储完了之后,那下面。你如何来分配这个任务?啥意思,就说我要启动多少个map task来执行啊,对吧?哎,假设呢,假设我这个切片我按100兆去切,因为我想了你这是300兆,我可以开启三个麦菜车,我希望让他们每个人都尽量的均匀一些,这是不是我们直观的想法?
11:04
对吧,因为你这是300兆的一个数据嘛,我除以三这不很正常吗?对吧?哎,这个每人干100兆很公平,哎,但是你现在想的啊,是很公平,但是你看啊看看什么情况呢?第一个map test,它处理这128兆数据,从零到100兆没问题,都在本地吧,都在当前这台服务器上。但是到了这个map task2的时候,你看它怎么处理数据,它处理的数据是这里面有28兆数据,这里面还要拿72兆。对吧,那这72兆没问题,很快在本地拿出来了,那这这28兆呢。你是要跨服务器的一个通讯呢。那么这个效率怎么样?哎,效率就比较慢了,哎,你每次都跨节点进行通讯,而且这两块还要拼在一起进行处理。那就会比较麻烦,那接下来你看看第三个ma它又怎么处理。
12:01
那它处理的剩下56兆,加上你这个44兆,我说这样就处理。哎,同样这40兆没问题,在本地执行,那你第二个第三个ma test,它仍然需要跨节点进行一个通讯。效率非常低下。那好,那不这么切,能不能有更高效的处处理办法呢?好,按切片大小128兆进行切片。那我就会将数据切成128 256,还剩40兆。对吧,那好,那第一个卖太处理这零到128都在本地吧,哎,这个数据都在本地,那好,那第二块呢,第二块128到二百五六是不是也在本地,是不是也由他由他来处理,那剩下的事上。MA3由他来处理,那是不是也是在本地处理,那本地的计算速度是最快。节点距离最近吗?哦,那也就是说我们得出个结论啊,这个map test啊,按照这个切片大小进行处理数据最好啊,就说切片大小设置128,跟你这个块大小保持一致。
13:07
那我这里面计算的这个效率最高,那好。说一个job的map阶段并行度由客户端提交job时的切片数决定,比如说你切了多少片,我就开启多少个map task啊。再来每一个切片分配一个map test,对吧,你切出来一个128 128,那我就来一个map test。再往后找,默认情况下切片大小等于块大小。记住这里面是默认情况下是切片大小等于块大小,那当然隐含之意就是它可以进行一个后配置。那后面会教大家哎如何来配置啊,一会儿呢,我们就看源码哈。这回来切片时不考虑数据集整体,而是逐个对每一个文件单独切片。
14:00
这个很重要,我现在呢是一个送送点avi对吧,那好,我接下来我再来一个送送2.avi。这是两个文件。那有同学该想了啊,那既然你按照切片切,那切吧,那我是不是我把300兆加上100兆变成400兆,然后再128兆,128兆的切呢。是不是这样呢?不是,你看这句话叫每个文件单独切片。我不管你提交的是几个文件,那我都是按照,诶,你这个文件单独切,你这个文件单独切。你上面切了三片,那你这个切一片。哎,不会说按照你这个400兆统一去写。啊,没有这个概念啊,是以文件为单位,那你看那这边再开一个对诺斯,它就是专门处理这100兆数据。哎,这就是这个数据切片和map test的一个并行度决定机制,那这里面大家要重点记住的就是默认情况下切片大小和块大小是相等的。然后我们按照切片的个数来开启ma test的个数,你切了多少片,你就开启多少个ma test,而且还有一点呢,就是每个文件单独切很重要。
15:12
哎,单独去计算,不要把它合在一起。行,那这个我们先了解到这儿,后面呢,我们来看源码。
我来说两句