MapReuce笔记六之输入类InputFormat

使用hadoop jar执行mapreduce任务时首先从hdfs中读取数据将这些数据解析为inputsplit,然后再将inputsplit中的内容解析为一个一个的<k,v>键值对,这个过程就是有InputFormat的子类完成的。之前在MR例子中有一段代码job.setInputFormatClass(TextInputFormat.class);就是指定TextInputFormat来完成这项工作,这个类是hadoop默认的其实可以不写。

         InputFormat是一个抽象类,类中有两个抽象方法List<InputSplit> getSplits和RecordReader<K,V>createRecordReader,getSplit负责将hdfs数据解析为InputSplit,createRecordReader负责将每个InputSplit中的每一行解析为<k,v>键值对。

TextInputFormat
getSplits

         FileInputFormat继承了InputFormat并实现了getSplits方法。

主要完成的功能是:

根据路径解析hdfs数据,判断文件是否可以被切分。

计算splitSize,默认等于blockSize,128M

获取每一个hdfs对象并进行遍历并将结果放入List<InputSplit>中返回。

       Hadoop中一个block对应一个inputsplit,一个inputsplit对应一个map任务。

注意:

hadoop不会对小于128M的文件进行切分,例如一个文件1G那就是8个map任务,如果有1000个100kb的文件则对应1000个map任务,这样会造成效率下降。所以MapReduce不适合处理小文件。

如果inputsplit和blocksize不一样比如大于,那么在解析为inputsplit时一个block就不够用,此时框架就会去别的节点上读取数据来构造inputsplit,这样会产生网络消耗影响效率。

 

createRecordReader

         TextInputFormat继承了FileInputFormat并实现了createRecordReader方法。此方法的返回值是抽象类RecordReader,而最终返回的是LineRecordReader,LineRecordReader实现了RecordReader并在实现的抽象方法中完成解析。

         主要完成的功能是:

                在initialize方法中获取FileSplit对象并读取每一行内容。

                获取<k,v>键值对作为map任务的入参再调用map任务。

         框架每获取一个<k,v>就会调用一次map任务。

 

至此我们可以通过下图大概了解一下这几个类的关系

NlineInputFormat

Hadoop中默认是一个block一个inputsplit,但是在代码中可以指定其他的inputFormat

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值