00:00
好,接下来呢,我们讲一下这个map工作流程啊。应该是整个这个map任务当中最核心,最核心地方,无论从开发角度还是从这个面试角度。都是一个非常重要的啊。你都需要掌握的,那下面呢,我们先简单的过一遍啊,因为以目前你们这个储备的知识的话啊。是完全掌握是不太可能,因为后面的像分区排序啊,合并等等,我们还没有讲什么时候讲,明天讲。啊,明天就讲。明天能把它补齐,所以说今天呢,呃,把我们之前讲过的啊。回顾一下啊啊看一下。外,这工作流程首先呢,还是有一个待处理的文件在优质input下啊,存放什么呢?送送点T啊200兆。好200条的数据,那么在提交之前,你说这个张币的之前,获取处理数据的这个信息包括什么呢?哎。
01:02
配置信息,形成一个任务分配的规划,其实这个就是切片啊。就是它的欺骗信息。分成两片。两片,那两片之后,接下来他就要提交,他提交哪些信息呢。包括它的切片信息、价信息以及造网参脉络。这块代码之前带大家去读过,只不过这里面呢,这个价包。啊,你在本地运行的时候,它不需要提交啊。只有在集群模式下才需要提交运行,对这个地方略微区别,稍微近一下就行,那切片是要有的,配置信息要有的。提交完这个信息之后啊,那由谁来控制呢?由一个雅恩。雅安调用resource,用它他会创建一个Mr master,其实是m master。也就是说,创建一个job的资源状态协调的老大。
02:05
波及到他。那有了它之后,它就会根据谁呢?根据这个job的split。造的欺骗信息起决定启动多少个ipad。他一看那个切片信息里边正好有两片啊,有两片。那它就要启动两个。启动两个ma之后,第一个ma负责处理零到一百八的数据。第二个ma负责处理一。28~200。那么启动完map test之后,接下来就要去读取这些数据。啊,这个数据呢,就在这个user input下。200兆。那读的时候用什么读呢?哎,默认是test怎么慢。啊,也就是说一行一行去读默认情况下。当然你也可以自定义,自定义的话,你就自定义它的record。
03:04
乘以它,那就能改变了,包括我们之前已经制定过一个,其实写的就是它最核心的,你怎么读,哎,由这个record reader决定了你的读法。我们自定义的是读了一个文件,那默认的读的是一行。比如说他读完一行之后,哎,把这个数据就返回给。那麦里面处理相应的这个业务逻辑,对这一行进行这个转换,转换成string类型,然后切割,切割完之后封装,封装完之后最后一步就是。刚点right。那他写出到哪了呢?写出到一个环形缓冲区。啊,他先到这个C收集器,收集器里面就会往这个关缓冲句里面去写。缓冲区大家不陌生啊,但是呢,这个缓冲区有点特殊,它是环形的。
04:03
呃,默认大小100兆,默认大小100兆。这些数据怎么写,哎,从这开始。往左侧写数据,往右侧写数据,左侧写的是实实在在的这个KV数据,右侧写的什么呢?写的是你对这个数据的。所以。所以大家学过买吧。是买这个也有索引呢,哎,跟那索引是一样的啊。标记它的相应的这个长度位置啊等等这些信息。那么他写到80%的时候。也是80号的时候干什么呢?他要进行一次一写。因为你这个目前是在内存中。还原缓冲期吗?是在内存中。那将内存中的数据写入到。啊,往磁盘中写,放不下了,往磁盘中放。那到什么时候放呢,到80%。
05:00
一旦到达80%之后,把这些数据通通都读走。这个时候干什么呢?再从他俩中间这个位置。再选一下是不是各剩10%啊,哎,再往回写。洗完之后再往回写。再到80%的时候,然后再再往这边写。这就叫这个环形缓冲区。我们可以看这个结构哈,这结构你这么看是一个环形的,其实呢,真正的在底层存储的时候呢,它其实就是一个队列。一样的啊。只不过呢,这里面是从这儿画一道线。往左侧写的是原数据,往右侧写的是KV数据。啊,这是按右的,后面还会再无限的往后写,往后写啊。KV数据,那左侧呢,存的就是这个数据对应的这个原数据信息,包括它的。起始位置啊。K的起始位置,那这块它并没有定义这个K的结束位置,它只是给了你一个Y的。
06:01
那你看K的起始位置在这儿,Y轴的起始位置在这儿,你能不能算出P的位置?能啊多长是不是都知道,包括这个value value的话,它是不是下一个这个K的起始位置。啊是一样的,所以说它都能把你这个具体这个k value给描述出来,存在什么问题。那同时还标记了一个什么呢?啊,也就是说你这个数据属于哪一个。分区。后面我会讲这个分区哈,先有个印象。分区,分区是为了分文件夹。多少个分区,最终输出结果就有多少个文件。那还有一个index是说。那后面的话会带大家去debug调试一下啊,看一下这块源码啊,那你首先要记住啊,这个呢是。卖吧。往出写数据之后,它先写到一个collect收集器里面,收集器往外写,写到一个环形缓冲区。关于管冲区数据的处理特点是左侧这边写索引,右侧呢写数据。
07:05
数据呢,其实就是这个KV数据。啊,一条一条PV数据。那右侧呢,这个是索引,索引呢,这个元数据信息主要描述的就是你这个KV。组的起始位置、长度。等等这些信息,同时呢,还有一个最核心的是一个。分区。分区的一个标记,这个分区的标记啊呃,后来最终它会影响你决定你输出到多少个文件,比如说之前我们最开始说了一个A到P到一个文件。到这到一个文件。啊,那这块呢,就要求你得分两个区。两个来处理啊。那先走到这,后面我们讲完分期排序之后,这个流程再给大家说,这个流程至少要给大家说三到五遍吧。真正的去理解啊。好,往下。
08:00
那这个华网城区一进来之后,首先呢,就是分区。西安分区。分完区之后干什么呢?每一个分区内部进行。排序啊,他并不会把所有的数据进行一个排序,因为没有意义,因为最终这两个分区的数据不会进入到一个reduce里面去。啊,分区一的进入到reduce是一,分区二的进入REDUCE2,所以说呢,它只需要对应。分区内部的数据进行一个排序。那这块呢,排序呢,是按照什么顺序排呢。试点顺序排序。所有的数据,它默认都会对你的key。这是他框架内部决定的。并不是说你愿意和不愿意。他都给你排了。啊,而且必须要拍。法,那实现这个质点顺序,呃,这个字典这个顺序排序的手段是什么呢?
09:00
啊,手段是快牌啊。实现了是字典顺序排序。这个要理解哈。大再往下。那这个排完序之后,你说在一写的过之前这地方进行排序,排完序之后往这个文件里面去一写,其实就是序列化到磁盘。记到吃饭。那这是他可能会溢血多次啊,这地方会溢血多次。因为你这总共是一百一百兆末100兆,那这100兆里面你寄存了这个。数据是不是又存在原数据啊。那它实际存储的数据呢,就少了很多。他才会一血多次。比如说这里面易写了N次。那一写完之后干什么呢?哎,最后它有一个叫规定排序。对,你每一个小的分区的数据。
10:01
哎,进行一个排序,那就说对这种有本身自的自己内部有序的文件,再进行一个排序的话啊。这种排序方法呢,就是规定啊。合并成一个大的有趣的。啊在这块啊将这块呢,有这些文件。提成这样啊。将后面这一块排序完之后放在这。都是按独立的分区去做的。再往下呢,这个是合并啊,后面再说啊,先先不管。这个是下面这个呢是麦二。跟这个MAP1呢是一样的。都是这个前面这一系列操作之后到这儿。好,那这个分期完事之后,那下面哎来看继续看reduce阶段,刚才是map阶段做了这么多事情,那reduce阶段做了什么事情呢。先了解一下哈。
11:02
这个呢,还是卖这个一就。准备的数据啊,跟上一张图是一样的,相当于准备的数据放在一个分区一,一个分区二啊。第一分加二。放好了。放好之后,哎,这下边有一个Mr master。他是负责整个集群资源的调度和协调啊,这个任务单个任务的。那么就是所有的map task任务完成后。他完成了,他也完成了,启动相应数量的radio。那到底起多少个radio task呢?就看你有多少个分区啊,多少分区,你两个分区就启动两个卖task,三个分区就启动三个。OK。那一看呢,前面这块我正好启动了两个分区。那我对应的就起两个比。你前面多少分区就决定了我多少个map。
12:02
那么这个太如何工作呢?首先哎,你这个review它是个一,它就专门处理这个分区零的数据。那怎么办呢?哎,你就将这个。分之零啊这个。就读那个分区零的数据。那接下来那这个分区里的数据也给跑了。那二呢,它专门处理的是。那就将分期一的数据。通通的跑过来。分期一的数据拷过来。然后后续再进行处理,后续进行处理。这属于一个拷贝的过程。拷过来之后。拷过来之后,你是从多个Mac拿过来的有序的文件。那有趣的文件呢?你还需要对它进行一个汇总操作规定。
13:00
啊归排序,形成一个有序的大的文件。为什么要形成一个大的游戏文件?否则你单独是不是得处理一下它,又处理一下它呀,在reduce方法里面,Reduce的方法是不是就是为了这个聚合的。那你让他进进多是吗?不可能哈,所以说要合成一个最终的一个大的文件之后再处理将这个这个数据。我们按照K的相同值。P相同的进来,比如说A1 a1就这两个进俩。我进到这个方法同时写出去。啊,那你这个是C,那你只能再进下一次。意义呢?那就是下一次了。记忆再下一次。啊,只有这个A1A1,它属于相同的K,能进入到这几种方法。那另一个呢是分组啊,分组的话明天再讲,先不说。最后呢,他就通过Outlook。往出写,这个跟那个外部阶段那个读是类似的,只不过呢,这个是以流的方式向外斜。
14:09
最终呢,就写出到一个PART0这么一个。那下面这个map radio2呢,依然是。文艺家啊。稍微回顾一下啊。刚一接触,有点晕。再来一把。首先,这是待处理的文件。放在哪了呢?放在user input下面有一个送送TRT。百。然后呢,你需要对它进行一个处理。一个处理,那处理你看经过这个分析,预算这200兆呢,分成了两个切片啊。一个是零到128,一个128~200。OK,那再往下呢,就是要提交切片信息。
15:00
提交新闻,那提交什么呢?的一个是一个是价,还有一个配置。这三个东东都要提交到这个集群上。提交完之后。有这个resource manager。启动一个。Application master。他就是这个job,提交这个job的资源的老大。他一看,按照这个切片规划,需要两个。那就给他起的两个太。哎,几两个。一个呢,负责处理零到128,一个负责处理128~200。写完之后,那他就开始去读这个相应的文件。那读文件的时候默认的我们选用的是test input。那就是按行读,一行一行去读。
16:03
读完一行读回来,走到这形成K,对,那这个KV数据呢,就会进入到这个map里面。Map里面是处理具体的业务逻辑。处理完之后,最终把他的KV写出去。解除到哪里呢?写出到环形缓冲区。已被后面处理,那这个还原缓冲区的多大呢?默认100兆。从这开始写。右侧写的就是它实实在在的原这个数据,PV数据。左侧呢,这块呢,就是描述这个KV数据的,所以。其实还有一个分期。所以出具以及分期出具。那么这个数据呢,到达80%的时候,它进行反向一写,比说像这个你写往这么写。
17:01
写到头的时候。干什么呢?哎,把你这个原来的数据都。堵手啊,堵手之后再反向写,向这么写,写到这个位置对吧,啊,斜到这个位置,然后再反向走,再反向走。相当于是一个闭环是一样的,所以说呢,形象的把它称为环形缓冲区。那这个呢,是一写的过程中呢,先把这些数据呢,进行标记了一个分区。降下。那在内存当中,只要他达到了80%,或者呢,这个文件已经都已经读取完了。他要干什么呢?对这个数据进行排序。那排序呢?默认排序是字典排序,按照。十点顺序排序。那排序的手段呢,是快速排序。回头呢,我会带着你去看一下。它有一个快速排序的一个类啊。
18:01
不着急,在这一下。排完序之后,就可以将这个数据一写到文件中。啊,你写到文件中。往这一写吧,但是呢,它的一写过程并不是,呃,你看你。认为的128兆,然后这边是100兆,我是不是最多也就两个一写文件呢?哎,不是这样的啊,不是这样的。因为这里面它既存放了原数据,又有存放了这个实实在的这个数据,包括一些辅助信息,就会导致这个白网络区被占用的很臃肿。所以说这里面会一些到大量的文件啊。比如说这里面有很多很多文件。那这么多很多有序的文件,我们要对它进行一个墨是规定。排序。相同分区内的数据进行规定排序。这样才是有意义的,因为为了,因为这个数据会升到就是一,这个升到就是二。
19:04
再往下很卖,先不用管。那下面这个呢,是这个MAP2。他进行处理的。跟下面这个过程呢,是一模一样的,这里。在技术。啊,处理完之后来到这儿。也说radio阶段,那阶段呢,需要所有的map全部处理完成。他搞定,他搞定。之后开启reduce。那么接下来就是开多少个。由谁来决定?这里面呢,由这个Mr application master他来决定。所有的麦车启动完成后。嗯,就要启动相应数量的test。那这个test就有你这个分区。多少个分区?买多少个?那这里面呢,正好是两个分区,那就开两个。就是。
20:04
那么radio test1呢?它专门处理的是R0里面的数据。那就将这个盘森零点的数据拷过来。那么reduce reduce2呢?专门处理的是分区一的数据。反过来。都拷过来之后,在你的radio端就会形成多个有序的。文件。这块啊,我再稍微稍微展开一点什么呢,它拷过来的数据,如果说不大的话,他会先把它放在。内存里面啊。如果大的话,它才会一写的。文件里面去啊,一写到磁盘这里。大家稍微注意一下啊,后面我会也会想一想。啊,那它有多个文件啊。不管你是在磁盘还在内存当中,我都要对你进行一个。合并的手段呢,就是规定。
21:02
运用完之后,将这个数据按照P相同的原则。传入到reduce方法里面去。OK。那下面这分组后面再说。之后呢,就写出到外表。那下面也就太二呢,跟上面是一模一样的。致使呢,这个map啊,这个详细的这个工作流程。
我来说两句