00:00
好,我们看一下这个第二个需求,第二个需求呢,就相对于第一个需求还简单一点。此时我们就直接将那个什么HDFS那个数据传入到h base表中,是不是比刚才还简单呀,对吧,因为从HDF读数据。大家比较熟吧,哎,大家比较熟的就是之前所有的操作都是从ID读出去,然后往这边的写,你同样的这个reducer是要是。Table吧,还要用table来写,是这样的,也就是说两个一个普通的map,一个tabler,这两个东西结合一下,我们看怎么用啊,是这样的一个需求,OK,那这块就直接快速操作一下喽。再建一个包号。二。然后这里面同样的也要三个类吧,我们这个地方叫什么呢。从HD读数据是吧,HDFS,然后这个map。
01:01
然后同样的这个包里边还有两个,一个是绿色,一个driver吧。HDFS。然后还有一个专给他写一下。喂药,那从写这个继承什么。就是普通的麦类了吧,因为我们是要从那个HDF出去,DF出去,OK,他的一个型还记得吗。吧,Long,然后是啊,注意是下的吧,然后他写出去的一个数据呢。写出的数据呢?我们是不是把value定义成put,然后这个K的话也无所谓啊,因为你没有做任何的一个聚合操作吧,所以说这个地方的K啊,我直接弄啊。
02:08
OK,那后面定义成不能就是说我们把业务啊尽量放到。Map端嘛啊,放到map端,不要在reduce端去做这个操作啊,增大video的一个压力,因为你是要多个map会将所有的数据汇总到video嘛,如果你去video端来生成这个获得对象的话,它的一个消耗的一个资源会相对来说高一些,是不是,哎,单个的一个任务呢,执行时间长一点,所以尽量的把任务放到map端去做,尽量把任务放到map端做,OK,那这个地方同样的我们要重写它的一个map方法啊,这个map方法就好写了吧。首先要。获取一行数据对吧,然后是切割还是以前的方法吧,切割之后。封装不的对象这个东西要有吧,不的对象OK,最后呢,写出去吧,哎,写出OK啊就这四步啊,首先获取一行数据Y6点。
03:09
对对。行来来对,然后切割我们那个是我们还是用那个那个文件啊,它里边应该是按什么。杠T它是TSV嘛,对吧,TSVCSV是逗号OK号的加L啊,它是一个Li OK封装的对象。封装铺的对象,那这块我们是不是应该把它的几个多点拿出来,或者说在封装铺的对象的时候,直接用那个数组加小标啊也可以吧,那服装不就像首先要用一个什么不的了。因为put,那这个put里边要一个入key,我们现在都知道对吧,那这个入key怎么写呢。我们的数据在这,我们还是用第一个作为它的一个入可以吧,第一个作为那这个地方就写成ba.to吧,然后把那个零给他扔进去吧,给他OK,然后接着往那个对象里面放一些。
04:18
咱们后面那些数据是不是应付下name,还有下什么。Column,对,OK,那这个地方put.at column column OK,那这个in for这东西我们是不是给他写词啊,在这对吧,OK这个地方写的是best。点in OK,然后第二个呢。点。To to这个地方我们要一个内对吧,然后最后是值是吧,best.to那最后我们值就是SPLIT1是不是1OK,然后把这个CTRLD复制一份,把这个name改成。
05:13
Color,然后这个变成二,那我们数据是不是就封装进去了,哎,这个就是我们讲的另外一种批量添加数据这个方法吧,就针对于一个rookie下可以添加多条数据是不是啊,添加多条数据OK,那最后写出去就是直接是context.right now readable的话直接now right。把这个库的对象给它扔进去,OK,要注意这个库的对象,我们没办法在外面溜达。之前不是讲了,说生成一个对象在外面,然后在里面set set这个吧,这个没法用吧,因为它的一个构造方法就必须要传参数,是不是你这个参数是根据你这个值来的吧,啊,所以它只能在这个方法里面用啊,只能在这个方法里面用,要注意了,OK,然后接下来写一个reducer,这个reducer要继成。
06:00
Table reducer是不是贴标?Table reduce它有三个分型,那前两个我们都知道。这个哎,CTRLC给它拿过来不得类行。OK,最后他有一个什么。Keep out还是同样的,我们这个out没有用吧,Ableable。Ctrl o,然后来它这个reduce方法,那这个reduce其实跟刚才这个reduce是不是写法是一模一样的呀,因为我们提前把这个负的对象给它封装好了吧,啊就不用在reduce它进行封装了啊,不用在这进行封装了,对那这个地方就是直接是VALUE4点。For循环for循环,诶,Continue是吧,点right。Now get,然后来一个。Value啊,把一个一个的value遍历写出去就行了,OK,这个就是就比较简单的,没有做任何逻辑处理。
07:06
但是但是虽然他没有做任何处理,但是你必须要有嘛,因为它后面是跟base做对接的啊,必须要有的一个东西,那最后还有这个driver,同样的这个driver要继承。对吧,汗。哈,那个包为什么每次放在后面OK,然后要实现一个什么接口对吧,注意是这个哈,多优报销的啊报销的。然后要实现相应的一个方法,实现相应的方法。那set康,我们先在外面定义一个什么configuration吧,Configuration等于一个no给它,然后把这个configuration给它赋值在这。等于康复吧,加不加this,它都是this点是不是OK,然后把这个con给它返回,返回这样的。
08:06
就这里边的一个封装啊,就快速写一下是吧。OK,首先是获取交互对象。叫我。杜6.getinstance,然后把这个con给他传进去。这个地方我们还是改它改成拍位的边那个屎黄色不好看,是啊不是,然后这个地方是获取。叫我对象是吧。然后干什么,设置主类,交个点赛。这样把class掉,哎,把我们那个hdfs driver.class给它扔进去,好,接下来设置完主力之后,还有一个map跟吧,那这个麦你用能用那个刚才那个工具类来设置吗?他是普通的一个卖对吧?那只能用老的一个方法是交va.set map class对吧?Map class OK,那这个地方是HDF啊。
09:18
Map点,然后同样的还要设置它的一个输入输出类型吧,因为你用普通的普通的来做的点set map奥和job点。Set map out the value对不对,它的一个key,我们用的是。对不对。然后他这个歪呢,我们用的是什么是不是的呀?好,然后接下来封装的是设置reduce吧,那这个reduce还是用刚才我们一个工具类的封装是不是。
10:03
他工具里还记得吗?不记得了。要。是。Table对table是吧。Map reduce table map刚才写多了,是map。点reduce还是同样的用那个map方向是不是点这个时候初始化的是reduce,叫报吧,它后面要一个表,来一个表,那我们来一个F有了是吧,二尔法。输的好,等会我们这张表是不是同样的也要创建一下呀,因为他没有他会报错是不是OK,然后第二个参数。Reduce的一个类对吧,Reduce类我们是hdfs reduce reducer点最后还有一个job要放在这吧,Job。
11:06
最后呢,返回值,我们还是要提交一下这个任务吧,提交交点wait for completion,然后给他一个处。然后还是用result吧,好看一点是吧,RT,最后这个返回result,然后问号一问号一问号一返回值。可能加L保存一下,那这块就是我们整个的一个所依赖的这个环境,全部封装完了,最后就写一个什么。PSVM是吧?啊,写一个卖方法,这个慢方法里边你首先要创建一个配置文件对吧?哎,配置文件那是h base configuration。是,然后接下来是用的是呢,是不是调用他的一个wrong方法,那confiration有了,然后第二个用一个hdfs driver,第三个阿克X。
12:16
一。然后把它一个返回值拿一下它这个I,其实我们最后还可以来一个system,就是系统点exist还是什么I,它到底是异常退出还是正常退出的,对吧?如果说零的话,还是正常退出的一个系统,对吧?零的话就说明这一块已经提交成功了,是吧?还是这样的,整个的一个逻辑,OK,然后接下来我们就打包测试吧。打包。Pack。好,你看啊,此时我们打了包之后,你说我刚才那个MR还能用吗?这个包。
13:01
二一我还想执行二一的程序,还能执行吗?还可以吧,哎,这个东西是不是就是类似于我们看到的官方案例那种形象呀,官方那他一个架包吧,它可以运行很多的类是不是。它其实里边呢,写了很多的一个卖方法,然后你传的那个参数,什么word count,什么我刚才看到的roll count或者input p SV,是不是它通过这个参数进行过滤找主类呀。他自己进去找主类的是这样的一个方式啊。这你要注意的,OK,那此时我们把这个给他导进来就行了吧。到这它会进行一个覆盖。还是第一个吧,因为它覆盖掉了。覆盖掉了,OK,那我们把这个表提前创建一下吧,我们叫F的二是吧,是不是叫F2。不OK。那我们创建一下这个。
14:03
二。OK。好,那这块好像打包之前少写了一个东西,少写了什么,我们那一个输入没写吧。输输出有了是吧。输入的一个参参数没写对吧,要写一下输入写这个,刚才写那个table map写习惯了,这个少了一个输入对吧,设置。哎,设置什么输入路径对吧?设置输入路径OK,那设置输入路径还记得怎么设置吗。File input for。注意是六点Li点一步的方向的吧,新的一个PI是不是,然后点。爱的还在的,在的爱的。
15:01
都行吧。Set at是不是都行啊,都可以吧,Set这个里边要一个叫广,然后要一个路径,那路径的话我们给它传进去可不可以啊。阿克。零阿克斯林,那这块呢,调用用方法之后,他是不是将那个阿克斯传进去了,那最终阿克斯会传到这个地方呢?啊,你用阿零就是这个阿克,也就是用的是慢方法的一个阿克,是不是我们在执行这个。加包的时候在最后添加一个额外的参数就OK了呀,对吧,我打下包。哎,我是。我点错了是吧。我刚才点的这上面运行了是吧。好,然后把这个包给他包进来。
16:03
放在这啊,它再进行一个覆盖,OK,那此时我们还是同样的OB model哈多并雅安。这然后还是执行的这个Java啊,只不过它进行了一个覆盖,接下来是填什么主类名,对不对啊,主类当前我们知道FDF包。战列,然后还要跟一个。路径啊,跟一个路径,那我们路径直接写根目录,像ru it.tsv就可以了吧,因为我们哈多的一个相关配置里面是不是。它的一个文件系统,默认的就是HDF的一个文件系统啊。你配了,如果说你配了SD的文件系统,你想从本地读取文件怎么读?就是说我假如说这个fruit,我现在要用这个fruit。会读吗?这样看。
17:03
然后这个地方从OBD开始写。用这种方式。就类似于你如果不改这个默认的配置啊。你写HDFS一个文件系统,你要把HDFS冒号杠杠杠把这个东西给它写上一样的啊,那个地方其实指定的是一个,你看那个配置文件叫什么,叫FS.d附FS对吧,指的是它的一个默认的文件系统,而不是说它只能用这一个文件系统,要懂这个意思,就是说它你写相对路径的时候,他找的是哪个文件系统,那你写绝对路径啊都可以啊,都可以,当前我们还是用,那我们用这种方式测一下吧,可以吧。但是我这个东西没法说明他啊,这个肯定是ID上没有这个路径嘛。他能走成功,肯定是走的是我们本地的。
18:06
其实HDFS冒号杠杠跟file冒号杠杠都一样,都是一个文件系统的一个协议。看一下这里面有什么错?这个地方路径错了吗?PWD。Fair冒号杠杠杠。这个路径没问题。不能够读本地。我们先测一下炸包对吧,等会再看这个本地文件系统来我们这个地方读的是HDFS,先把这个炸包看有没有错。这个地方封装进去的一个pass,我看一下这个地方,如果说在这里边封装了一个阿森林。冒号刚刚从本地读,应该是没有问题。
19:07
这个执行完了,先我们扫描一下这张表吧。看一下这个。输入到二那张表是吧,看那个数据有没有导进来。数据是没问题的,对吧?啊,还是我们刚才的那个还外上的一个数据,这边我们那个账包写的没问题,然后我们看一下那个,再测一下刚才那个。File冒号刚杠没有东西写错,什么OPT model。这个是前面的是协议头,然后后面是跟着一个路径。fruit.tsv。应该也没有问题啊,他还是找不到是吧。本地文件系统怎么不动?Input,这样我先把这个整个的输出一下。
我来说两句