InputFormat接口(package org.apache.hadoop.mapreduce包中)里包括两个方法:getSplits()和createRecordReader(),这两个方法分别用来定义输入分片和读取分片的方法。

 public abstract class InputFormat<K, V> {

   public abstract
List<InputSplit> getSplits(JobContext context
) throws IOException, InterruptedException; public abstract
RecordReader<K,V> createRecordReader(InputSplit split,
TaskAttemptContext context
) throws IOException,
InterruptedException;
}

  getSplits()负责将文件切分成多个分片(InputSplit),但InputSplit并没有实际切分文件,而只是说明了如何切分数据,也就是说,InputSplit只是逻辑上的切分。createRecordReader()则创建了RecordReader,用来从InputSplit读取记录。

  

  再看InputSplit类,它包括了getLength()和getLocation()两个方法。getLength()方法用来获取InputSplit的大小,getLocation()则用来获取InputSplit的位置。

 public abstract class InputSplit {

   public abstract long getLength() throws IOException, InterruptedException;

   public abstract
String[] getLocations() throws IOException, InterruptedException;
}

  每个InputSplit对应一个map任务。作为map的输入,在逻辑上提供了这个map任务所要处理的key-value对。

  InputSplit只是定义了如何切分文件,但并没有定义如何访问它,这个工作由RecordReader来完成。RecordReader的实例是由InputFormat定义的。例如,在InputFormat的默认子类TextInputFormat中,提供了LineRecordReader。

 package org.apache.hadoop.mapreduce.lib.input;

 public class TextInputFormat extends FileInputFormat<LongWritable, Text> {

   @Override
public RecordReader<LongWritable, Text>
createRecordReader(InputSplit split,
TaskAttemptContext context) {
return new LineRecordReader();
}

  LineRecordReader会把文件的每一行作为一个单独的记录,并以行偏移为键值。这也就解释了WordCount例子中,行偏移为key值,每一行的内容作为value的原因。

  本文基于hadoop1.2.1

  如有错误,还请指正

  参考文章:《Hadoop应用开发技术详解》  刘刚

  转载请注明出处:http://www.cnblogs.com/gwgyk/p/3997734.html 

最新文章

  1. 解决Linux系统下程序找不到动态库的方法
  2. C#实现WinForm DataGridView控件支持叠加数据绑定
  3. 控件 UI: 字体的自动继承的特性, Style, ControlTemplate
  4. vim安装YouCompleteMe 插件
  5. hdu 1116 并查集和欧拉路径
  6. MySQL5.5半同步模式
  7. Oracle 自定义函数Function
  8. maven(一)初步搭建,项目结构
  9. jdbc_连接数据库
  10. Android在Context详细解释 ---- 你不知道Context
  11. jar中没有主清单属性
  12. Geohash-》通过经纬度计算两地距离的函数
  13. mysql Access denied for user \&#39;root\&#39;@\&#39;localhost\&#39;” 本人解决方案:
  14. PHP程序运行性能分析
  15. Activiti 工作流之所学所感(基本配置) DAY1
  16. puppet使用 apache passsenger 作为前端 (debian)
  17. 微信小程序 条件渲染 wx:if
  18. oracle随机数(转)
  19. Javascript构造函数的继承
  20. JS模块化编程(二):require.js基本用法

热门文章

  1. 6.能够使HTML和PHP分离开使用的模板
  2. enbale blakboxing
  3. asp.net单例模式
  4. 嵌入式Linux内核制作【转】
  5. php用mysql函数出错
  6. Maven 使用介绍
  7. linux Nginx VirtualHost虚拟主机多站点设置
  8. sprint2 项目的粗略展示
  9. 对于JQuery的一些见解
  10. python 学习笔记十一 SQLALchemy ORM(进阶篇)