00:00
好,接下来呢,我们针对high度op的序列化啊,设计一个案例给大家讲解一下啊,因为大家也能感受到啊,其实我们课程的设置呢,就是呃,讲一个理论对应的一个案例实操,讲一个理论呢,对应一个案例实操,这样呢大家学起来会更轻松一些,那首先我们来看一下这个序列化这个案例啊,先看需求说我们需求是统计每一个手机号。耗费的这个总上行流量,总下行流量,还有呢总流量,那所谓的总流量呢,就是上行加上下行等于总流量。那光看这个。不是特别清楚,那么来看一下这个输入数据长什么样子。这是对应的输入数据。那给大家介绍一下啊,这样吧,这下面这个有描述,来看一下。对齐的。哎,这样的好一点啊,首先呢,第一列呢,它是代表着ID,哎之争的一个ID没啥说的,那第二列对应的是手机号,各种手机号,下一个呢,是网络IP地址。
01:02
再往下这是有域名解析器对吧,域名,那域名的话有的有有的没有。哎,在实际的这个项目当中就是这样的,对吧,那再往后下一个呢,对应的是上行流量。然后呢,下行流量。最后一个是不是总流量不是,哎,它是网络状态码,那两百呢,属于这个通讯正常,那当然这里面有404,还有对应的500服务器异常。对吧,哎,这么几个啊,那这是我们的输入数据看到了,那看完之后让我们去做什么事呢。我们期望输出的数据是这样的。以手机号对吧,哎,手机号为K。然后对应的这个手机号的上行流量是多少?下行流量是多少?总流量等于多少。这是我们想要的结果。看一下这是总需求统计一个手机号耗费的总上行流量,这个手机号总上行流量,总下行流量,还有总流量。
02:02
那让你去写一个外部流程序,怎么写呢?你是怎么想的?这事很重要。啊,有了输入数据。那输入数据进来之后,首先经过的是Mac阶段,然后经过的是radio阶段。最终输出输出成这样,那输入呢是这个。好,那map里面和reduce,你就关心这么两件事情就可以了,第一个是map的KV,输入的KV,这个不用关心,因为它都是默认的,默认呢K的就是行这个偏移量,V呢是对应的这一行内容。好,那接下来它输出的KV。我这个变个颜色啊。输出的KV和reduce输入的KV。是一样的对吧,然后以及他输出的K。我们就关心他,他他。
03:03
那根据这个结果,那它的K应该是谁呢?看需求说,统计的是每一个手机号耗费的总上行流量,限流。每一个。那如果说我这里面出现了重复的一条数据啊,我看看啊。嗯,有我打开。看到这一行。我这里面有重复的数据。那我未来希望是不是得把这俩加在一起,这俩加在一起,然后再把它们四个加在一起,得到总的流量。好,那我们还是仍然。说一下哎,Map的输入KV和输出KV,那输出的KV谁是K呢?我们希望将相同的手机号放在一起的值进行累加,那它未来传到reduce里面,那得K相同啊。才能进行累加吧。那我们这个K就只能是手机号。
04:01
对吧,得把相同的手机号聚合在一起。OK,那行,那这个K知道了,那我们的Y流是谁呢?放在这。我们的value。Y6我们最终输出的是这样对吧,这是这已经是K了,好,那Y6呢,有上行流量,有下行流量,还有总流量。那无论你是用这么test类型,Int类型还是long类型,Double类型,你觉得能表示出来三个字段的含义吗?不能,那怎么办?只能把它封装成对应的B对象。作为一个B啊,一个整体向后进行一个传输,那好了,那现在呢,我们map阶段对应的K呢,就是手机号Y6呢,就是对应的这个bin对象。然后进入到reduce。那reduce里面的key。V输入的KV跟你这个map的输出是一样的,那它最终输出的KV是什么?那最终输出,那你看你要展示什么样,我是不是还是要展示成这样,那最终的输出仍然也是手机号和对应的B对象就可以了,那以至于说我这个输出结果呀,中间是有这个空格啊,或者是这种黑包键,那我们可以重写它的to string方法。
05:18
进行一个控制就可以了。好,那我们大概有了一个思路之后,我们详细来看一下这张PPT啊。首先呢,哎,写写代码呢,主要关心的就是它的输入是什么,我期望的最终输出是什么,哎,就是我有啥。然后呢,我最终你让我干成什么样?这就跟企业开发一样的,首先产品经理会给你提出需求。那你接下来反问你的这个,呃,产品经理说,你能给我提供什么些帮助,我的数据在哪?问好了之后,然后要问清楚你最终这个东西要长什么样就行了,中间的逻辑是你来实现的,你程序员就干这个事儿,对吧。那下边map阶段。
06:01
首先进来的是要读取一行呗,对吧,上来就把这一行内容读过来,因为它是按行读的嘛,Y6就是一行。啊,那是一行内容进来之后。这么多,那这么多内容,首先我得把它转成使劲对吧?哎,因为进来的是test嘛,转换成使劲,那转换成使劲之后,我是不是就得七分呢。哎,切分,那切分用什么切呢?我这里原始数据就是用斜杠T进行一个分割的,这里面就是斜杠T。那我切就用这个形象T,之前我们word看的用的是空格,对吧,还用空格,那我用你是空格存的,那我就用空格切你是形象T,我就用形象T,那还有之前呢,还有这种百分号001这种特殊字符,那我就用它切啊,道理是一样的啊,用什么无所谓。行,切完之后,下面我们再思考一个问题,你这个序列号要不要?我后面统计的是这个结果,要不要你的序列号。不要跟我一点关系都没有,对不对,干掉这个网络IP地址要不要不要,最后这个状态码要不要不要啊,这些都不要,那我只把对应的手机号拿过来,上行流量拿过来,下行流量拿过来。
07:11
有同学说了,那海哥那个总流量哪呢?哎,总流量未来你是把它俩加一起不就行了吗?对吧?哎,这就OK了哈,这那就是获取想要的值,这没问题吧,因为它切割完之后是一个数组,那你从数组里面取出对应的这个值不就行了吗?嗯,你有更多的,你你填这这个挑少的还不容易吗?那调完之后最终呢,我们是以手机号为K,以它为K,然后B对象呢,Y流输出,哎输出,那这个B对象有上行流量下行流量,然后呢,总流量呢,是他俩一加输出属性。那思考一个问题,我这里面我是自己写的一个并对象,那默认这个并对象它能不能序列化呢?对吧,哎,它默认它只在内存里面,他想传输到reduce。
08:00
那同学说这个map和reduce之间为啥要序列化呀,思考问题,我这个map task之前给大家画过那个图啊,Map task。他是不是有可能在海底102上。如果102资源不够的话,我会把这个reduce放在哪里?放在海英龙三。那他俩是不是两台服务器啊。那两台服务器,你要想进行数据的一个传输。那他必须得支持虚拟化,那你就得重写它的,那就得实现它的right包接口呗。就这么简单。啊,是这么个原因,OK,那行,那接下来radio阶段,Radio阶段呢,就是拉取过来,你对应相同手机号的数据,对吧,相同手机号会聚合在一起,那它一般产生的类型就是呃,手机号。然后对应的这里Y流值是bin对象一,然后bin对象二对吧,这个手机号的BIN1B2。把它的值是不是一加呀。哎,循环一遍一累加,跟统计word就有点类似了,把它加在一起之后得到总流量。
09:03
OK,哎,这就是这个,呃,序列化这个对应的这个案例哈。
我来说两句