00:00
嗯,数据生产呢,我们说啊,它其实啊,就是我们在整个业务当中的第一个啊,你得先把数据生产出来,我们后面才能采集数据,才能统计分析,才能把结果展现出来,所以数据生产是非常重要的,那对于我们来讲呢,可能我们啊,在实际工程当中,可能这个呃,生产的过程不需要我们参与,那么但是我们需要知道它生产的数据的格式要求,以及它的频率,这些是我们是需要了解的啊,然后呢,我们数据结构呢,对于我们当前业务来讲,比较简单啊,就是一个通话的记录的统计啊,比方说我们的某一个用户在某一个时间段,他的通话的时长和通话的一个用户是谁啊,包括一些我们的通话的一些记录的总和数啊,啊比方说时长啊,这些东西我要统计出来,那你统计的话,我就需要知道我的数据都有哪一些,所以在这种情况下,首先第一个我们数据结构当中必须有两个电话号码啊,我们的用户给谁打电话,这个我是需要知道的,第二个是我通话的时间在某个时间段啊,你打多长时间电话,这些数据我们也应该知道啊。
01:01
然后呢,这个姓名这个咱们暂时可以先不考虑啊,因为这涉及到一个查询的结果的问题啊,你的电话号码是哪个用户的呀,这个我想知道,但暂时呢,对于我们统计来讲的话,这个是不需要的啊,所以我们这个先不考虑,所以我们的数据结构这边呢,并不复杂啊,就是简单的一些数据,第一个电话号码,第二个电话号码,第三个是我们的通话时间啊,这边还有个通话的一个持续的一个时间啊,然后这边呢有个时间戳,这个时间戳呢是有特殊含义的,这个咱们后面再说啊,就是你可要也可以不要,但是你要知道他干嘛的,嗯。好,那后面我们编写代码的时候啊,我们可能跟课件呢不太一样,但是没关系,你的目的是把数据生产出来,用哪种变更方式,这个不重要啊,我们再给大家写程序的时候啊,用的是我们的工程化的这种编程思想,就意味着我们会面向接口编程,那么你面向接口编程的话,就意味着会有很多的接口存在,会有抽象类,会有一些我们的常量类出现啊,那这样的话,你要分析清楚哪些我们是接口,哪些是我的常量,哪些是我的抽象类,这个要多去写一写啊,不能每一回写代码呢,全都是一个类,跟class也不是这样的啊,你这么写了以后,你的程序是不具备扩展性的,嗯。
02:12
然后呢,接着我们往下写啊,往下看,他这边说了,首先第一个我们应该啊创建Java的集合来存放模拟的电话号码和联系人,就是我们的那个通话的联系人的一个信息,咱们称之为叫通讯录嘛,嗯,然后呢,随机选取两个手机号码当成主叫和被叫啊,产生我们两个不同的电话号码,嗯,然后下面呢,是创建随机的通话时间和我们的通话的时长啊就是这样,那么这边有个时间嘛,有一个随机的范围啊,然后后面呢,将我们生产出来的数据拼接成一个字符串,我们用的是对象的方式,然后有个to string方法,然后呢,再通过IO的方式呢,将我的那个数据呢,给它生成到文件当中,其实我们的思路呢,跟它是一样的,只不过实现方式呢,可能有点变化,嗯。然后接下来呢,新建我们的modu的项目啊,我们的producer差不多啊,然后呢,下面呢是我们的依赖关系,我们这没什么可依赖的啊,然后下面呢,是随机输入一些手机号码以及联系人在我们课件当中啊,他是事先把这些电话号码呢给他什么准备好了,放在我们的一个即可当中了,我们并没这么做,我们呢是在一个文件当中,我们动态去取这个文件的内容啊,文件呢有多少条我们取多少条就可以了啊,所以我们这个呢,跟他不太一样啊。然后下面呢,是创建随机生成通话时间的方法,它有一个叫random data,其实说白了就是一个功啊,一个我们的静态的方法来实现我们的功能,不过呢,它这里的格式呢是有殊要求的,YYMMDDHMS这个咱们给大家讲了啊,它是我们的格式,这个格式呢是有特殊含义的,每个字母的含义是不一样的,这个不要用错了啊,然后呢,它里面的这个方法呢,是这样的啊,它里面传了一个开始,一个结束时间,那么开始时间久了,结束时间有。
03:58
啊,然后呢,他是去计算它相应的一些什么范围,那么这里呢,其实跟我们的差不多,大家可以看到它这里面是不是也是那个master的那点,加上一个结束节去开始啊,它是一样的啊,就跟我们的差不多啊,你只要知道含义,怎么写都无所谓了啊然后呢,接下来呢,是创建生产日志的一条方法,就是produce log啊然后呢,随机抽取两个电话号码,随机产生通话时间,什么随机生成通话时长,将这几个字段拼接成了字符串啊,我们说了我们是个对象,嗯。
04:32
然后呢,我们接着往下看,他这边,他这边也是一样的,他这边呢,先随机从我的那个集合里面取得一个我的索引,那么索引之后呢,然后再取第二个,取第二个的时候这是有问题了,为什么呢?因为你第二个电话号码呀,他可能跟第一个是一样的,那这样的话情况下,我得重新再去取一遍,所以呢,他这边狗不要处啊,他这边呢,跟我们不太一样的是什么地方呢?我们是不是判断两个索引相不相等啊,他这里是判断两个电话号码相不相等啊,他这个会更准确一些,为什么呢?因为你无法保证我们的那个文件里面的电话号码有没有可能重复啊,对不对啊,咱们保证不了,那你要说,你说哎老师这个你们电话号码不重复,那没问题,咱们用所以就可以了,但是万一他要重复了呢,所以真正的判断方式其实还是应该是两个电话号码判断啊,我们只是为了简单给大家判断两个索引相不相等了啊。
05:21
然后接下来呢,是随机生成我们的通话时长,这里用的还是那个random啊,随机的从我们这个范围当中给它去取这个值啊,没有任何的问题啊,因为呢,它这里面是包含零的啊,你包含零的话,它这里呢,就加了个一啊,保证最少得有什么,还有一秒钟之类的是吧?嗯,然后呢,这里呢,下面是格式化通话时间啊,使它的位数一致,记住啊,我们在实际的使用当中,你这个随机生成的这个通话的时长,这个时长的长度它不是固定的,可能三位,可能两位,可能一位,这样的话会导致我们生成的文件呢,它感觉不规范啊,我们一般我们的数据文件,它的格式一般是有规范的,就跟我们之前讲那个卡夫卡一样,咱们卡夫卡当中的数据啊,它是种有长度的什么要求的,比方说第一个字节是多少长,第二个是多少,第三个是多少,它有这个长度以后,当你去跳过数据读取那个off的时候啊,比方举个例子,你想读第二条数据的时候,那我得知道第一条数据有多长啊,那么第一条数据的长度。
06:22
是什么?基本是可以算出来的,那能算出来的情况下,我直接跳过去,我读取第二条就可以了,同样道理我们这儿也是一样的啊,你这个长度如果固定的话,那我计算起来就更加容易啊,如果你要是这个长度可能三位,可能四位,可能两位,我操作起来它也不方便啊,所以我们尽量的把这些位数呢给它统一了啊,统一一个长度的情况下就挺好的了啊,那么我们这个长度呢,是根据我们最长的那个通话时长来决定的,就是你不可能太长嘛,所以我们四维应该是没问题的啊,所以我们这里呢,给大家准备了一下,而且我们之前给大家写了一个工具类,我们为了防止呀,在别的场合可能也会用到类似的功能,所以这个长度不是固定的啊,你给我传过来,你需要四位,我就准备四位,你需要六位,我准备六位啊,所以这个长度呢,我们说就是变化的了啊,所一些工具类呢,会更加通用一些,那么这里用到的是个December format啊,咱们之前用的也是这个东西,嗯。
07:18
然后接下来呢,它这里面呢,是随机那个时间,这个时间是2017年的1月1号到2018年的1月1号,没问题,我们是2018~2019,这个不重要啊,然后下面呢,是我们说啊获取我们的啊,就不要获取了,就拼接日志了,拼接的时候呢,它这个课件当中啊,用的是那个逗号给它连在一块儿,我们用的是那个tab键连在一块儿啊这个呢,其实都大同小异,这个就不管它了啊,然后接下来呢,去什么呢?打印它打印之后呢,下面呢是什么呢?是我们的点sleep休眠了,我们说了每秒钟两条,那么就是休眠500毫秒就可以了,然后呢,把我们的这个build,那个字符串的build给它返回一个字符串,这个自物串呢,我们就可以通过IO流把它生成到文件当中啊,对于我们来讲,其实我们用的也是IO流,只不过咱们封装的一个data in,一个data out啊,通过那个data out呢,把它输出到我们指定的位置,因为你不见得是肯定生成文件呢,万一你要生成到数据库里面呢,万一你要生到别的地方去呢,诶都不确定啊,所以啊,咱们那个是可扩展的啊。
08:19
然后下面呢,是创建写入日志的方法,有一个叫write log啊,就是写入我们的日志,那么写入日志的时候他说了啊,我们需要涉及到IO操作,需要注意的是输出流,每一次写一条以后呢,都需要flash,那么就意味着我们这边呢是要flash数据的,为什么呢?因为它的时间太长了啊,可能一秒钟两条数据这么间隔的时间比较长,那我就来一条,我就FLASH1条,来一条FLASH1条啊,但是你说了我要不断的生成,没有那个休眠的那种概念的话,那数据太快的话也不行啊,所以那个时候呢需要缓冲,现在就不需要缓冲了,来一条写一条,来一条写一条啊就是这样,对啊,这个呢,其实跟我们写的是完全一样的啊,这个呢,我们就了解一下,我们这里用的是那个叫print writer,跟它呢这个流不太一样啊,所以我们这个呢,就先不管它了,咱们能用的就可以了啊,然后呢,下面呢,是在主函数中初始化以上逻辑,把上面的方法呢给它封装好,封装以好以后呢去调用就可以了,但是呀,大家会发现它这里面是这样的,你看啊它的。
09:19
方法当中他加了这么一句话,这什么意思?大家想想这什么意思?这什么意思啊,首先记住啊,这个X不可能为零啊,如果是闷方法的话,它不可能为零啊,我出错啊,不可能为那啊它这个地方的闷方法不可能为,那你只要你去调用main方法的话,它肯定是零,就是你没传任何参数,它一定是零,就这个条件肯定不满足啊,这个不管它,那这个条件是有可能满足的,为什么有等于零这个概念啊,所以呢,我们说如果你不存任何的参数的话,这个X就是零了,那所以呢,等于零就会走里面去,走里面去以后大家看怎么了,这叫no argument是没有参数吧啊直接系统是吧,退出了对吧?然后呢,下面这个地方你会发现什么东西,看看这个东西叫做构建了一个我们的对象,然后呢,对象当中初始化了我们的数据,然后这边是什么呢?写入log吧,但是你会发现在这个地方干嘛了,有个叫X0什么意思啊,就是你前面如果没传参数的情况下,就直接报错了吧,也不要报错了就直接退出了吧,但是如果你传参数的话,我把第一个参数传过来对不对,然后那这个参数干嘛呢?
10:27
那看看这个叫rightlo,往上看这个right log里面有个叫什么东西啊,叫pass,那么这个pass看看它怎么有怎么做的,你会发现他大看在这呢吧。他这地方怎么回事,是不是用了我们这个东西,大家看是不是把这个fair pass放到这个叫fair里面去,那其实跟我们之间什么一样啊,是我的那个输出路径是一样的吧,那说的简单点就意味着这个输出路径没有固定写死对吗?还可以通过我的参数来指定它,那而且它这里面加了个数表示追加对不对啊,像咱们没有加,没有加的话,每回都重新写啊,每都重新写,其实咱们这个追加和重新写,你只要了解什么区别就行了啊,追加就意味着以前以前的文件不变,那么往下加就行了,那么这样的话数据会越来越多,越来越多,我们不怎么做啊,咱们就是为了演示,所以我们不需要去追加,每会产生新的就可以了啊,所以我们这个参数并没有加上啊,然后呢,我们这个能明白以后呢,我回过头来看咱们这个程序,咱们这个程序当中啊,这一块东西就有点问题了,为什么有点问题呢?是因为我们当前的这个路径是不固定写死了这第一点第二点。
11:36
我们的这个程序只是在Windows下面跑嘛,肯定不是吧,他应该是在我们服务器上面跑,对不对,比方说你Tom t的服务器啊,服务器运行在我们的Linux下面,那么然后产生的日志也应该是在我们的Linux下面,对不对,那所以啊,你这个写成E盘什么这些东西肯定就不合适了,所以在这种情况下,我们这个也应该把它什么变成我们的参数,而不是说固定些死了啊,所以把这个呢,我们给它注掉啊,这个给它注掉,注掉以后呢,我们同样跟它的判断方式应该一样啊,所以在我们前面这个地方,我们来if幅咱们改善一下来。
12:13
把这个呢,我们写上叫X啊,来我们这里需要两个参数,需要哪两个参数呢?第一个就是你的数据来源啊,你的那个通讯录在什么位置,第二个就是你输出的位置,所以我们这里呢,都不用判断别的,只要判断一下它的长度就可以了,它如果不等于二,那你不等于二,你会也别不等于二了,咱们小于吧,小于二吧。咱们小于二,你小于二你没传或者就传一个,那不行,你传两个以上,那没问题,我就取前两个啊,这也可以啊,所以呢,我们就写上,如果你小于二的话,这个是不对的,那不对的情况下,咱们按照他的这个方式呀,把它加上,所以呢,我们这里呢也来啊,就把这个拷贝就行了,嗯,拷贝拷贝以后呢,我们给它放到这边,然后呢,我写上叫做参数不正确啊来咱们叫做系统啊参数,它系统的参数啊不正确,嗯,好了,那请传递啊请请,嗯按照指令啊格式传递,请按照指令格式传递啊咱们叫传递传递OK,那么什么格式呀,大家想想,那首先我得运行这个程序吧,对不对,那我要运行的话是不是Java呀,对不对,Java然后呢,是某个类吧,哎,某个类,比方说我们就写上咱们,我想想咱们这个会运行,运行的话,运行这个程序,那我就假设是一个我们的produce吧,咱们假设啊,咱们。
13:37
的一个produce啊来后面后面加什么,加va,然后呢,我们这边应该是什么呢?咱们应该,嗯,运行以后是不是应该是一个我们的架包啊,是不是这样的啊,同学们想想,你想我这边要运行的话,是不是要打个包过去啊,你打个包过去以后应该是个架包啊,所以加va架包,然后呢,这边可能是个价啊就这样,那么架后面是不是应该传参数了,这个参数可能就是PASS1第一个路径,然后呢,怎么办?第二个路径啊,应该就是这样,所以我们这边应该有两个路径传过来,按照这个格式给我传就完事了啊好了,那这个时候呢,我这边系统就退出了,你就不用管它了,那么接着往下,那么下面这个位置呢,我们说啊,只要你没有退出,那么我们接下来呢,下面的程序是可以执行的,那既然可以执行的话,那咱们这个地方呢,就可以来了,拷贝,拷贝以后呢,我们这里直接来啊,然后把我们这边讲面叫X,诶拿过来第一个,嗯,咱们放到这啊,给它来一个我们的零啊好,然后呢。
14:37
再来这个呢,应该是我们的set out了,嗯,啊,那这个是呢,我们的date out,那这样写上一个一,诶好了两个参数就可以了啊好,那这么写完了以后,那我得试一试看看我对不对啊,咱们之前呢,是在我当前的这个开放工具当中,没什么太大问题,文件它也是对的,但是我现在呢,要运行在我们的这个程序当中了,这样把这个呢给它清掉啊,现在我打开,呃,打开以后呢,我来看一看啊来。
15:06
嗯,好点一下,点击之后,那我现在这个地方呢,我来点啊,然后呢OPT,然后呢我们的module module都之后这边有个叫data啊,我现在准备把数据呢放到这个里面去,所以我们来我们找一下啊,这个呢我点啊点完以后呢点,然后呢我们的它我们的这个叫电信客服,然后呢里面有一个资料,资料里面有一个我们的辅助文档,那么其中我就要把这个通讯录呢,给它放到我们这个位置,所以来给它放过来,放过来以后呢,我就放到了这里啊,就是它了,然后这个文件你不需要,这个文件是我自动生成的,这个文件你是不需要的,所以呢,现在这边有了,有了以后,现在我要把咱们当前的程序呢,给他打个包,然后放到我们的什么,哎,服务器当中去,那我要打包了,我该怎么做同学们。我这边该打包了,它打成可运行的还是依赖的,我们说了我们什么情况下,我们判断出它是打成我们可运行的是不是要你要看看你执不执行那个闷方法吧,哎,咱们要看看有没有闷方法,如果有闷方法就说明你要运行它,那我就打成可运行的就完事了,所以我点一下,点完了以后,在这里呢,我们找到我们的它,然后点击加号,然后选一下我们选择这个啊选完之后,那这里我们就选择我们这个脚本来啊往下走,下面呢,有一个我们叫做producer就是它了啊,然后呢,Class这里面就会有一个它启动就这个东西啊,然后呢点击copy,然后呢选择我们这个叫resource,然后点击OK啊点了OK以后,那么这个时候呢,我们接下来点击我们的应用啊,然后呢,点击OK,那我现在呢,把它配咱们就配好了,那接下来呢,给它打个包运行一下,运行的时候呢,Producer,我们点击build,嗯。
16:51
然后这个时候呢,我们就给他打包啊,打包以后只要没有任何的问题的话,我们直接去执行它就可以了啊。
17:00
嗯,好了,现在呢,已经成功了,那成功以后呢,我们这边的out啊,在我们out这边我们可以刷新一下啊,咱们来我们刷新啊,也不用刷新了,应该已经有了producer啊点架,然后呢,里面就有个架包,这个架包呢,你可以原封不动给它拖过来,所以拖过来啊,拖到我们这里直接拖过来就完事了,这边就是CT producer点价啊,就是它了,那么有了它以后,那现在我们就准备去执行它就可以了啊,所以呢,我们这里来,我们写上CD我们的date,然后在这里面呢,就有我们这个什么架包,那现在我准备要去执行它,那我要想去执行它的话,首先我们的Java什么杠架va对不对,然后呢是CT我们的价包对不对,那你这么写了以后,你回车,回车以后是不是不正确,因为你没传参数对不对,他说请按照这个格式来传,那么也就意味着我这应该是PASS1和PASS2吧,所以我们这里来,我写上叫斜杠OPT,我们叫Mo,然后呢,我写个叫date。里面是不是有一个叫做我们的通讯录的联系人的日志啊,哎,把这个拿到,然后呢,接下来呢是OBT,我们的Mo,然后呢是我们的date,我在这里准备要生成那个叫call log,诶我就这么写,你这么写以后,那我就开始回车了啊回车回车以后大家可以看到什么了,是不是正在生成呢?但这个生成我们说了不重要,为什么呢?重要的是那个文件有没有,所以呢,我们接下来把这个刷新一下,刷新以后是不是出现了,而且你看这个字节大小880万,说明里面是不是有数据了,诶那说明我的数据在不断的生成,诶就是这样啊,所以这样的话就说明啊,日志我们现在就没有任何问题了,那日志没有问题的情况下,那我们这一块呢,就可以暂时先停一停了啊,最起码呢,数据是已经出来的了,而且这个数据的格式呢,跟我要求呢,应该也是完全一样的啊主教电话号码,被叫电话号码,通话的时间以及通话的时长,这个咱们现在就都有了啊,好了,那既然都有了之后,我的数据也没有任何。
18:58
的问题,那咱们生产者其实就告一段落了啊来。
我来说两句