Hadoop自定义Writae与InputFormat实战教程.pdfVIP

  • 0
  • 0
  • 约1.29万字
  • 约 22页
  • 2026-01-08 发布于四川
  • 举报

•Writable自定义类实战

1.修改WordCount类中Mapper的key,改为自定义WritableCompable类型,自定义类每个

单词的内容和单词的长度,执行M/R程序,让输出变为如下形式:

wordcount

[word=Alexia,len=6]2

2.修改上例中Mapper的Value,改为自定义Writable类型,自定类型单词的长度和出现次数

注意:实现WritableCompare接口,需要重写toString,hashCode,equals方法

•输入-InputFormat接口

在实战之前,先来复下上章节关于M/R程序文件输入的内容,从上节我们知道,

InputFormat会为M/R程序InputSplit分片,并将分片转化为相应格式,传给map函数.

Hadoop为了简化我们的编程,了一个所有文件操作的基类FileInputFormat,其实现了对输

入文件计算split的方法,但是对于获取记录的方法是有不同的子类实现(如:TextInputFormat

•InputSplit分片说明

1.在执行mapreduce之前,原始数据被分割成若干split,每个splitmap任务的输入,在

map执行过程中split会被分解成一个个记录(key-value对),map会依次处理每一个记录

2.FileInputFormat只划分比HDFSblock大的文件,所以FileInputFormat划分的结果是这个文件

或者是这个文件中的一部分

3.如果一个文件的大小比block小,将不会被划分

4.当Hadoop处理很多小文件(文件大小小于hdfsblock大小)的时候,由于FileInputFormat不会

对小文件进行划分,所以每一个小文件都会被当做一个split并分配一个map任务,导致效率

如:一个128M的文件,经过分片后会被划分为2个64M的split,但128个1M的文件,会被当做

128个map任务来处理

•InputFormat自定义类实战

编写一个自定义的InputFormat,利用KeyValueInputFormat以制表符分割的主机名和URL的

文件,并将URL作为URLWritable类型

思路:扩展FileInutFormat生成我们的InputFormat类

1.自定义一个URLWritable的类型

2.扩展FileInputFormat类,实现重写getSplits和createRecordReader方法

•输出-MultiOutputs接口

一般来说Map/Reduce都是输出一组文件,但是有些情况下需要我们输出多组文件,好比不同学

校分成不同组,有些时候数据不整齐,还要把不符合格式要求的数据单独输出。旧版本中划分多

个输出文件主要有2个类实现:MultipleOutputFormat和MultipleOutputs。

新版本中整合了上面旧API两个的功能,没有了MultipleOutputFormat

驱动中不需要额外改变,只需要在MapClass和Reduce类中加入如下代码:

privateMultipleOutputsmos;//定义多文件输出类

//初始化

publicvoidsetup(Contextcontext)throwsIOException,InterruptedException{

mos=newMultipleOutputs(context);

}

publicvoidcleanup(Contextcontext)throwsIOException,InterruptedException{

///流操作必须有,否则在数据量小的情况,数据全

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档