00:00
好,接下来呢,给大家总结一下map尔就开发在企业里面我们需要注意哪些事项啊,以及呢,你与拿到一个程序之后,在各个组件当中你是怎么思考的,就是说你要知道你会什么对不对?哎,那首先我们回到这个原来这个地方哈。嗯,原来的map原理还记得这张图吧,这张图呢,我们给他定出来啊。带着大家去复习一下。行,那有了它之后呢,我们把我们原来的笔记打开。现在呢,第三项。六。快速回忆一下卖六你会啥?对吧,哎,来一个程序之后,你针对它的输入map沙reducer以及输出这块,你想对它怎么控制。那想对他控制的前提是不得你得知道你会什么。那比如说第一个。你来了一个数据对它输入端,哎,这里面对应的是谁来处理呢?由这个input。
01:04
Format。哎,由他来处理对吧,那针对这个技术点你会什么内容呢。首先第一个它默认的input是哪一个。默认的。Test input对吧?好是他那行,那它的输入KV是什么。它的输入key是偏移量对吧。还天一亮。OK,它的V呢?V是对应的一行内容。OK,这是默认的,那除了默认之外,我们还应该会哪个呢?我们是不是还应该会它的一个处理小文件啊。处理。小文件对应的一个combine com。
02:03
Past。In foot。同学们这种方式进行处理,它呢是把多个文件。文件合并到一起。统一切片。是吧,诶了解到这你说input的时候啊,我们可以采用这种方式,哎,如果说这两个还满足不了,以及呢,它的实现类子类也满足不了,你还可以采用自定义。哎,其实在我们之前的版本也给大家讲过哈,只不过呢,这个hi豆版现在这块呢,用的比较少了,所以说没有给大家讲这个自定义input码啊。啊,那再往下来。下一个input处理完之后,数据进到哪里?数据进入到map。那进入到map,你要清楚这个map里面分了几大步。对不对,哎,几大部,那它是有map阶段用户写的,那在map之前有一个set up。那setup主要用来处理什么?它处理的就是初始化。
03:04
对吧,它用来处理初始化,那好,那map呢。用户的业务。业务逻辑。那再来,那还有一个叫clear up。它是什么时候调用,是最后调用,那它是用来关闭资源用的。哎,相当于是收尾的一个操作,OK,那麦你要掌握到这儿,那再来。麦出来之后,数据进入到S,哎,首先我们要控制的是分区。对吧,哎,分区好。那进的就是get方法,那分区这里面我们可以自定义分区。那他默认的分区哪一个默认。分区是哈西part。
04:03
对吧,哈希盘在那,那哈希盘在那它是怎么一个分区啊,默认按照。Kid。哈希扣的值对吧,嗯,哈希值。然后模拟。哎,它是与上那个呃,引梯格最大值,然后摩椅,摩椅是不是number里就有T个数对吧,嗯,Number。Reduce啊,Test个这样去处理哈,好,这是分区,那分区出来之后,比如说这个环形缓冲区,如果要满了之后,我要往出溢血,溢血前要进行一次。排序,哎,那我就把环境缓冲区当中所有的排序给大家说一下,那排序呢分这么几种,第一种呢叫部分排序。什么叫不排序?就说你最终输出的文件,每一个文件内部有序。每个。
05:00
输出的文件内部有序。啊,那所有的文件。如果说你把它放到一那个,这样你多个文件对吧,那多个文件整体上它是有序的吗?整体上是无序的。是这样吗?哎,好,这是部分,就是说每个输出文件的内部有序。那再来还有一个呢,叫全排序。全区很简单,就一个reduces。对所有数据排序。大牌去。那这种排序在企业里面要慎用,因为你所有的数据都要进到一个reduce里面,很容易将你这个reduce给撑爆,产生这个OM对吧,那还有二次。排序那二次排序啊,其实就是属于这个自定义排序范畴了。范畴。对吧,哎,你制定一个排序的时候,是不是要重写它一个,嗯叫嗯,我们是实现嘛,嗯实现先实现。
06:07
实现一个什么接口?实现一个叫compable。Comparable。啊,Comparable接口。然后呢,重写里面compare to方法。Compare to方法。那在这个方法里面,你就可以根据你传进来数据进行排序,那排序的话,如果你有多个多重排序,比如说我们之前上课讲的是按照先按照总流量。总流量倒去。对吧,哎,之后呢,又按照。呃,上行流量。正确啊。正序来去排。这是倒叙。OK。这呢就是二次排序,那如果你是多多个字段参与,那就是多次排序,好,这是排序相关的一些事情,那再来。
07:09
排完序之后是不是就进入到对应的reduce,那进入到reduce之前,嗯,跟这个reduce有个类似的功能的,还记得有一个combine吗?啥意思啊,哎,这个commander呢,可以在map阶段提前进行一次预聚合,那当然了,Commander有前提条件。Com啊command,比如说它有前提条件。不是所有的组件啊,所有的这个任务都能执行commander。前提什么条件不影响?影响最终的业务逻辑。哎,这是它的一个前条件,然后后面那它有什么好处啊,哎,提前预聚合。去和。嗯,玉聚合。
08:05
就提前集合吧,嗯。是吧,啊提前聚合。那提前聚合,那它是在哪里面完成的,是在map端完成的。是吧,哎,效率比较高啊,其实这种方式啊,还可以是解决数据倾斜的一个办法,解决数据。倾斜。的一个方法。因为我map阶段的map test个数比较多,我每个人分担一点呢,总比你传到最终一个reduce里面,它的这个压力要小一些。哎,所以说能在map阶段处理的,尽量在map阶段进行一个处理,这是核心逻辑,好那再往下来,那这个再给你详细点吧,那什么情况下叫不影响最这个最终业务逻辑啊,叫求和没问题。对吧,啊没问题。求什么有问题啊,求平均值啊平均。值。这是不行的。
09:00
那再来。六。那第六个呢,就是reducer。啊,这都是用户写的聚合操作对吧,用户写的,嗯。用户。的业务逻辑,OK,那这里面有三个方法啊,仍然是把上面拿过来。叫set up初始化。Clean up关闭资源。中间有一个理生。啊。那它呢,是用户编写的业务逻辑。OK,行吧,哎,这是这块,你要知道它有三个方法,什么时候用,什么时候用它,什么时候用它,什么候用它,哎,OK,那再来最后一个,最后一个是这个out put吧,也是最终输出的时候,我们还可以对他进行一个控制。Art。Put。嗯,那out不默认是哪种啊。
10:04
默认,默认的是这个test out。Put。对吧,诶奥特曼这种方式进行输出,那它呢是呃按行输出。嗯,行。输出到哪呢?到文件普通的T就可以了,那当然如果说这种输出方式啊,你不满足要求,不满足你的要求,那怎么办?还可以自定义输出对吧,自定义out,这就是你整个这个过程对吧?哎,开发的时候啊,你要哎一拿到input,我应该怎么处理,Map怎么处理分区如何处理排序,Commander reducer output在你心中必须做到心中有数。这样你开发的时候呢,才能够游刃有余哈。
我来说两句