暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

自定义Hadoop的输入格式

DLab数据实验室 2020-09-14
548



不点蓝字关注,我们哪来故事?



背景





最近要把一个文件中的的多个html代码块进行解析,该文件特别大将近1TB,所以想用Hadoop来处理。
该文件内容格式如下所示:
htmlds.txt
<html>
<title>title1</title>
<div>xxxx</div>
....
</html>
<html>
<title>title2</title>
<div>xxxxxxx</div>
...
</html>
....
现在就有个问题,Hadoop默认的map处理逻辑是对每一行进行同样的逻辑处理,而我现在需要对每一个<html>...</html>为一个单元进行处理,因此就需要进行Hadoop输入格式的自定义。







01

基础知识





1.什么是输入格式
MapReduce中接口InputFormat定义了获取数据分片和获取记录读取器的方法,分别是getSplits和createRecordReader方法,分别用于获取数据分片和定义数据访问方式;



RecordReader类是实际用来加载数据并把数据转换为适合Mapper读取的键值对,它会在输入块上被重复的调用直到整个输入块被处理完毕,每一次调用RecordReader都会调用Mapper的map()方法。






2.有哪些输入格式
抽象类FileInputFormat实现了InputFormat接口,是所有操作文件类型输入类的父类。InputFormat常见的接口实现类包括TextInputFormat、KeyValueTextInputFormat、NLineInputFormat、CombineTextInputFormat、SequenceFileInputFormat、DBInputFormat等。
TextInputFormat
TextInputFormat是默认的InputFormat。TextInputFormat提供了一个LineRecordReader,这个类会把输入文件的每一行作为值,每一行在文件中的字节偏移量为键。每条记录是一行输入,键是LongWritable类型,存储该行在整个文件中的字节偏移量,值是这行的内容,不包括任何行终止符(换行符和回车符)。
KeyValueTextInputFormat
每一行均为一条记录,被分隔符分割为key,value。可以通过在驱动类中设置conf.set(KeyValueLineRecordReader.KEY_VALUE_SEPERATOR, "");来设定分隔符。默认分隔符是tab(\t)。此时的键是每行排在制表符之前的Text序列。







02

实现方案



通过上面的介绍,我们知道了输入格式是什么东西,那怎么改呢,就是重写我们的InputFormat接口,由于我们的实现功能是一次读取多行数据,所以可以参照LineRecordReader来实现我们需要的功能。LineRecordReader类是每次读取一行就结束,那我们要想每次读取一个<html>...</html>代码块,只需要修改逻辑,即我们只有读取到</html>才结束这一次读取过程。

所以,我们可以自定义HtmlLineRecordReader类,继承RecordReader类,修改nextKeyValue里面的读取逻辑。






HtmlLineRecordReader.java












RecordReader类是实际用来加载数据并把数据转换为适合Mapper读取的键值对,它会在输入块上被重复的调用直到整个输入块被处理完毕,每一次调用RecordReader都会调用Mapper的map()方法。








readLine方法在HtmlLineReader.java里



然后重载readCustomLine和readDefaultLine两个方法










以上就完成了Hadoop输入格式的自定义工作,是不是很简单呢。







03

总结






我们再总结一下:
重写新实现InputFormat,其中比较重要的两个类:
HtmlLineRecordReader类,该类里面的nextKeyValue方法,主要完成设置清空value值的条件;
HtmlLineReader类,该类中的readCustomLine和readDefaultLine方法,根据清空指示进行清空操作
看懂了以上之后你是不是发现so easy,只需要自己根据需求修改逻辑即可,其他的一些文件都是改改类名即可,比如压缩功能之类的。现在你是不是迫不及待的想运行一下试试,我把项目放到开源平台上了(https://gitee.com/doubledue/htmlmr),可以自行下载运行(包含测试数据集)。









长按二维码识别关注








好文!必须在看
文章转载自DLab数据实验室,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论