00:00
好,上节课呢,我们把这个S整体流程介绍完了,那沙当中啊,这个map方法里面的业务逻辑我们之前讲过,那再往后走呢,就进入到这个分区,那进入到哪我们就先讲哪,对吧?啊把这个分区也给大家讲了,按照这个数据这个流向。那首先呢,抛出来一个问题哈。大家分析一下,比如说在生产文件有这么一个场景,说要求你的统计结果啊,得按照这个产品经理提的需求输出到不同的文件当中。你说你默认是一个文件对不对?我希望他把结果输出到不同文件,那比如说我们将按照手机的归属地不同的省份输出到不同文件当中,啥意思呢?我给他简单简化一下这个需求啊,我这手机号呢,有1135开头的,有136开头的,有137开头的。那我让135的进入到一个文件,136开头的进入一个文件,137开头,这个文件没问题吧,哎,就这种需求。啊,那这个需求呢,就用到了对应的这个控制输出的一个分区。
01:00
那么high管默认的分区是什么逻辑呢?这是它的源码。哈西part,哎,默认的,那默认里面他重写了一个get part这个方法,那这里面就一个核心逻辑,就一行代码,特别简单。就是哈西扣的值与上一个in t格max value这句话什么含义呢?它与一个引T格最大值,其实啊,这种不知道你们学没学过那个二进制啊,哎,正常情况呢,这下面是不是11111最大值嘛,对不对,哎,下面全是幺,然后再往上呢,全是0000000,如果任何一个数跟一与的话,是不是都是一呀。假如说你上面这个,呃,111。零。嗯。1001,然后前面这个地方啊,你这个余乙与完之后,是不是还是你原来那个值啊,但是它高级部分,高级部分这块,假如说你是一,嗯,有零有一,你不管谁跟零与前面这部分数都是零。
02:00
那这个有什么好处啊,是防止溢血啊,溢血也就说它最大,你这个K哈西扣的值就是到引引T格的最大值就行了。啊,再往上前面都是零了啊,是这个含义啊,当然了,你说你这个不太懂没关系,不太懂的话你把它干掉。对吧,你当没看到,哎,就是key哈西的值,然后呢,对一个number reduce text个数进行取余。那取一的话,假如说这个number text,我设置为二。那这个K的哈值多少?那他最多是不是。要么是零,要么是一啊不可能是二吧,对吧?哎,不可能是二,那最终它输出的文件是不是就两个啊,一个是帕零,一个是帕之一,不就这样吗。对吧,嗯,那这样呢,给大家这个,呃,举个例子啊。啊,我们把我们的这个workout拿出来,嗯,再次把我们的处女秀哈拿下来,有一个parter。PR,好,那把这个work呢统一复制。CTRLV粘贴。
03:01
OK,搞定之后来到这个Java里面,那这个888我们改一下,改成999对吧?啊999999,然后我在这里面设置一个什么事呢。我设置这么一句话叫job.set number radio text个数我现在设置为二,因为以前的word看咱都看过,对吧,输出一个文件,那我设置为二,看看结果会发生什么情况。右键执行。执行完毕了,执行完毕之后,我们来看一下对应的结果。Hiop hideop output9对吧,哎,两个文件跟之前不一样了,打开。好,打开之后零一对吧,嗯,那你看一下这个零里面的内容是班长hi杜op交。那一里面内容呢,现在呢是。苍老师,宋宋老师学艾特,硅谷在一起。对吧,嗯,这俩在一起。
04:02
那他俩在一起我就有点儿看不过去了,对吧?啊,我有点看不过去了,我不希望这个苍老师和宋老师在一起,我希望的是班长和苍老师在一起。那这个又怎么控制呢?对吧,那就需要我们重写对应的这个分区啊,进行一个控制,那好,那他默认情况下为什么就走成走成这样了呢,说班长还给我教再一个分区了,那常老师和孙老师他俩怎么就整搞在一起了呢。那原因就是看一下这个对吗。这等于么?因为这个number里T个数是不是为二啊,对吧?然后是K的哈希扣的值对它取余。那取余的话,那很显然前面这个是零号分区,那就说明班长hi杜交它对应的哈西扣的值对它取余的结果是零,那艾特硅谷苍老师,宋老师和学对应的哈西扣的值是一,所以说他进入到一号分区,它进入到零号分区。
05:02
哎,是这样一套原理。行,那是不是这样呢?那下面呢,哎来教大家debug一下,哎,看一下这个结果哈,看一下结果那999现在不能用了。111,这行吧,哎,叔叔给我改变一下,那现在啊,我们想想debug看一下这个分区,那我在哪打打断点呢。你看一下这个这张图。我在哪打断点合适?分区在这。那分区在这,我现在这个阶段属于什么阶段,是不是属于map阶段,而且是map方法输出之后。对吧,是这样吗?啊,那是在这,那这个断点我应该打在哪呢?过来我是不是应该打在map往出写这个过程啊。哎,王硕写这个过程,那大家有没有疑问啊,或者说没讲这堂课之前。大家有没有想过说我这个map,呃,Map方法执行完之后,是直接就让水定出来拉取了吗?哎,不是,其实在这里面啊,他还做了很多很多事情啊,那我们来看一下哈。
06:03
嗯,找。右键。Debug运行。好,进入到这了吧,哎,进入到这,那进入到这,我们很显然我们想进入到这个right方法里面去看一看,那进入看的话,那就进呗,啊点这个红的进。对吧,进来之后呢,是map task right,那还得进再继续进。再进说这个还是一个right,那继续往里面走,走到这之后collect collect,比如说这个收集器,其实就是这个环形缓冲区,那环形缓冲区这块你注意一下,你看它这里面的参数里面就有一个partan.get partan,那我只要往下一点,它就会先执行参数里面的方法,再执行class里面内容是这样吗?好,那我们点。进入你看进入到哪了。丢到哪?就是他系统默认的哈西partitioner。
07:01
对吧?哎,那你看一下这里面的值,现在number reduce test个数是多少?二对吧?那当前进来的K是谁?K是at特硅谷啊at特硅那艾特硅谷你看艾特硅谷这个值是多少啊,是一,哎,求完之后呢,是一,那一的话,你看艾特谷是不是在这个一号分区里面。哎,就是这样的一个处理。嗯,能懂了吗?行,思考一下啊,进入到这个get法身,然后你再出去对吧?啊出去,然后你再循环,循环之后又来到这来这之后你再进来。进来。再见。再进进,哎,下一个值,嗯,下一值还是艾股吗?啊对at股它是一行对吧?啊还是at股,那我再全数运行又回来,回来之后呢,我再。这个吧,进入。进入进入。进进好来这那这回变成送数了吧,啊送数哎呀送数也是一是吧啊一你看它是一的话,是不是也进入到这个这个分区了,哎,就是这个这种逻辑啊行,那现在样呢,我我把这个全数运行完事。
08:08
执行完毕。执行完毕之后我再回来,回来之后呢,我变一个什么事呢,我把这个。注释掉啊注释掉,然后呢,把它变成二二。刚才啊,我们设置这个number task,它确实走了这个哈希盘断那形下头把它注释掉,注释掉之后呢,我还是回到这,我再打一个端点啊,再打断点,打断点之后呢,我再来执行,右键执行。所以这个debug呀,非常重要哈。之行进到这,进到之后我再次往里走,走走来了,来了之后我进。进看好了。到哪去了?还是不是这个哈西帕特?如果你用默认值的话,是不就不是了?嗯,为什么说不是了呢?你看啊,它上面往往上推一推,这个什么帕森斯啊,你的分级数如果大于一,那我后面要走对应的这个分区啊,Part parter,那如果else不是的话,它干了一个什么事呢?这个partitioner等于谬了一个partitioner什么意思,内部类。
09:11
啊,内部类,那内部类里面它重写了一个get partan方法,那么这个get part方法它只是用这个partan斯直接减一。那帕特森四是多少啊?是不是一呀?哎,默认值是一吗?你进来不就默认是一吗?那一减一等于零,那零的话,未来它只会产生一个零号分区的文件是吧?帕丁零吗?还记得吧?嗯。所以说这个如果说是默认值的话,它不走哈希盘在那直接走这个静态,这这个不是静态是内部类对吧?啊内部类就可以了。OK,行,那这个我就全数执行,把它干掉。执行完了。啊好,这是这个,呃,分区相关的一些事情啊,我再看一下文档啊,给大家这个查询补漏一下。
10:01
这上面默认一句话说默认分区啊,是根据key的哈希构的值对radio text的个数取模得到的,用户呢,没法控制哪个分区存在,呃,哪一个可以存储在哪一个分区,那当然我们后面可以自己自定义重写,你这个partition呢,不就OK了吗啊。再来。那就引出来,我们可以自定义part,那如何来自定义这个part呢?有这么如下几步,第一步,你首先要定义一个类,然后这个类呢,得继承partitioner。那那这个帕它是一个什么样的类啊,看一下。怕进来呀。是吧,哈西帕特森那嗯。打开。哎,Part啊,那我们找我们的,哎呀,还不是这个啊。
11:05
他这个是过时的了,嗯,帕西帕森呢,完了打上打上打上之后找到我们这个新的是这个是新的版的,哎,维岛书包了啊,那新版的话呢,就是它,那他继承的是parter,那parter是一个什么类啊,它是一个抽象的啊抽象类,那抽象类就需要对他一个。对吧,哎,重写那get重写这里面的get pass方法就OK了啊。行,那再回来,回到这个文档。这第一步呢,是定一个类继承part,那当然要重写里面的get partan方法,那get part方法需要跟你的业务逻辑相匹配上,那比如说咱的手机号呢,是135136,那你就要截取对应的手机号前三位,前三位前三位,然后控制它对应的一个K的输出,不就完了吗?啊。那在驱动包中还得怎么设置,你这个定义完之后,它跟你的代码没产生关系对不对,你得想让它产生关系是什么,你得让你这个job吧,重新更改一下这个partner,因为你不设置的,它默认不是哈希partner吗?哎,那改完之后把它塞进去,Set进去之后还没完,哎,你这里面啊,还需要设置一下这个number reduce text个数,为什么说要设置它呀,你不设置它,它默认是一呀。
12:21
你一的话,他会走你这个自定义这东西吗?他不会,他走的是静态,是他自己那个对不对啊,你用了一个这个内部类,嗯,所以这块要注意哈,这么几步,第一步呢,自定义,第二步呢,在这个驱动当中设置,第三步要设置这个number reduce text个数,那设置多少个,后面呢,我们会有专门案例给大家解释啊,多少个比较合适。行,那这个概念啊,先讲到这儿。
我来说两句