1 概念
InputFormat用于描述输入数据的格式,提供以下两个功能:
A、数据切分:按照某种策略将输入的数据切分成若干split,以便确定Map Task个数,以及对应的Split。
B、提供数据:为Mapper提供输入数据,对于给定split,能将其解析为<k,v>格式。即<K1,V1>

2 新老版本

老版本:package org.apache.hadoop.mapred

public interface InputFormat<K, V> {InputSplit[] getSplits(JobConf job, int numSplits) throws IOException;RecordReader<K, V> getRecordReader(InputSplit split,JobConf job, Reporter reporter)  throws IOException;
}

新版本:package org.apache.hadoop.mapreduce

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;
}

3 解析
3.1 设计思想
所有基于文件的InputFormat的实现基类都是FileInputFormat。
针对文本格式:TextInputFormat、KeyValueTextInputFormat、NLineInputFormat
针对二进制格式:SequenceFileInputFormat


基于文件的FileInputFormat的设计思想是:

A 由公共基类FileInputFormat采用统一的方法,对文件进行切分成InputSplit(如按照统一的大小)。getSplit方法
B 由各个派生类根据自己的需求,解析InputSplit。即各个子类实现的createRecordReader方法


3.2 getSplits

主要完成数据切分的功能,它会尝试着将输入数据切分为numSplit个inputSplit。有以下两个特点:
A、逻辑分片:inputSplit只记录分片的元信息。
B、可序列化:为了进程间通信。
在Hadoop1.X在JobClient的中writeNewSplits方法使用了getSplits。

// 通过反射获得设置的inputFormat.class的inputFormat对象
InputFormat<?, ?> input = ReflectionUtils.newInstance(job.getInputFormatClass(), conf);
// 获取逻辑分片信息
List<InputSplit> splits = input.getSplits(job);

3.3 getRecordReader
该方法返回一个RecordReader对象,它实现了类似迭代器的功能,将某个split解析为一个个<k,v>对。该类需要考虑以下两点:
A、定位边界记录:为了识别一条完整的记录,记录之间要加上一些同步标志。
对于TextInputFormat:同步标识就是换行符。
对于SequenceFileInputFormat:每隔离若干条记录,会添加固定长度同步字符串。
B、解析<k,v>:定位到一条记录后,需要将该记录分解为key和value两部分。
对于TextInputFormat:key就是该行在文件的中的偏移量,value就是该行的内容。
对于SequenceFileInputFormat: 每条记录的格式为[record length] [key length] [key] [value]。
前两个字段分别是整条记录的长度和key的长度,均为4个字节,后半部分分别是key和value的内容。知道每条记录的格式后,很容易解析。

整理自董西成老师的《Hadoop技术内幕》,并阅读源码小有体会。

MapReduce中的InputFormat(1)概述相关推荐

  1. mapreduce工作流程_详解MapReduce中的五大编程模型

    前言 我们上一节讲了关于 MapReduce 中的应用场景和架构分析,最后还使用了一个CountWord的Demo来进行演示,关于MapReduce的具体操作.如果还不了解的朋友可以看看上篇文章:[初 ...

  2. Hadoop在MapReduce中使用压缩详解

    Hadoop对于压缩格式的是透明识别,我们的MapReduce任务的执行是透明的,Hadoop能够自动为我们将压缩的文件解压,而不用我们去关心. AD:51CTO学院:IT精品课程在线看! Hadoo ...

  3. MapReduce中各个阶段的分析(转自道法—自然老师)

    MapReduce中各个阶段的分析: 在MapReduce的各个阶段: 在文件被读入的时候调用的是Inputformat方法读入的.inputformat-->recordreader--> ...

  4. MapReduce中加强内容

    课程大纲(MAPREDUCE详解) MapReduce快速入门 如何理解map.reduce计算模型 Mapreudce程序运行演示 Mapreduce编程规范及示例编写 Mapreduce程序运行模 ...

  5. 详解MapReduce中的五大编程模型

    前言 我们上一节讲了关于 MapReduce 中的应用场景和架构分析,最后还使用了一个CountWord的Demo来进行演示,关于MapReduce的具体操作.如果还不了解的朋友可以看看上篇文章:初识 ...

  6. Hadoop大数据——mapreduce中的Combiner/序列化/排序初步

    mapreduce中的Combiner (1)combiner是MR程序中Mapper和Reducer之外的一种组件 (2)combiner组件的父类就是Reducer (3)Combiner和red ...

  7. 前、中、后缀表达式概述及转换+栈的计算器原理及代码分析(含完整源码)

    目录: 1.前中后缀表达式的概述 2.中序表达式转前后缀表达式 3.运用栈的后缀表达式实现计算器原理步骤 4.代码实现和分析 1.前中后缀表达式的概述及相互转换 前缀表达式:运算符位于操作数之前. 中 ...

  8. MapReduce中源码分析(map端的过程)

    MapReduce阶段,map中key面向文章的偏移量=上一行面向文章的偏移量+本行相对于上一行的偏移量+本单词相对于本行的偏移量. 这个key为本单词相对于文章的偏移量 这个是MapReduce中m ...

  9. Hadoop学习笔记—11.MapReduce中的排序和分组

    Hadoop学习笔记-11.MapReduce中的排序和分组 一.写在之前的 1.1 回顾Map阶段四大步骤 首先,我们回顾一下在MapReduce中,排序和分组在哪里被执行: 从上图中可以清楚地看出 ...

最新文章

  1. 你真的了解计算生物学和AI for Science吗?
  2. C语言中关于字符串常量的进一步分析 转
  3. dos2unix批量转换的脚本
  4. nginx的upstream问题记录
  5. WordPress搬家全攻略
  6. java字符的输入流_Java:字节流和字符流(输入流和输出流)
  7. efcore调用函数_EF Core 3.1 执行sql语句的几种方法
  8. 为用户提供出游指南,抖音发起“抖音美好打卡地”文旅认证品牌
  9. 45 岁以后的程序员都到哪里去了?
  10. 右键脚本html,基于JavaScript实现右键菜单和拖拽功能
  11. 从eoeandroid换到CSDN-[回顾]
  12. DDD-领域驱动设计
  13. uniapp微信小程序使用canvas自定义分享名片
  14. 如何更好更快的站在巨人的肩膀上?
  15. 地表反射率影响因素_【专题突破】影响气候形成的因素及主要气候判别(高中地理),务必掌握!...
  16. jpa 人大金仓数据库方言_人大金仓+springboot配置
  17. retrofit介绍
  18. 之江汇空间如何加音乐背景_如何给空间添加背景音乐
  19. 如何保存或打印出清晰的域名证书
  20. 自学篇之如何高效地学习网络安全

热门文章

  1. [Windows Phone] 实作不同的地图显示模式
  2. Oracle错误集!
  3. 数据库字段属性配置工具界面[用于代码生成]
  4. 内存四区(代码区 静态区 栈区 堆区)
  5. 大学python怎么过_大学生该不该学Python?太纠结了?
  6. java代码块的定义_Java几种代码块的定义与常见问题
  7. 面试题-- 什么是偏向锁
  8. Java String类型转换成Date日期类型
  9. 手机知识:NFC是什么,有什么用?看完你就明白了!
  10. 手机技巧:快速清理出40G的垃圾文件,赶快试试吧!