RecordReader:其作用就是将数据切分成key/value的形式然后作为输入传给Mapper。

一 方法分析:

1.1initialize: 初始化RecordReader,只能被调用一次。

1.2nextKeyValue: 读取下一个key/value键值对

1.3getCurrentKey: 获取当前的key

1.4getCurrentValue: 获取当前的value

1.5getProgress: 进度

1.6close: 关闭RecordReader

二 RecordReader运行流程

2.1 MapTask会构造一个NewTrackingRecordReader对象

2.2在执行Mapper#run方法之前会调用RecordReader的initialize方法初始化一些东西。

2.3在这个初始化方法里面,它会调用InputFormat#createRecordRead

er方法,我们知道默认的InputFormat就是TextInputFormat,所以这里就回到用TextInputFormat#createRecordReader,返回LineRecordRead

er。

2.4 初始化方法他会干这几样事情:

#将InputSplit转成FileSplit

#获取每一行能读取的最大的长度默认是Integer.MAX_VALUE

#获取当前FileSplit的开始位置

#获取当前FileSplit的结束位置

#获取当前FileSplit的文件路径

2.5 然后进入Mapper#run方法,首先会判断是否有下一个key/value,如果有则传入当前的key和value到map方法.

2.6 LineRecordReader是将当前行开始位置的offset作为key,当前行的值作为value传入给map方法

2.7 程序运行完毕,关闭RecordReader

三 常见的RecordReader

LineRecordReader:将文本行开始的便宜量作为key,整个文本行作为value

CombineFileRecordReader:处理CombineInputSplit里的每一个chunk

的RecordReader,CombineInputSplit包含不同的小文件chunk信息

但是具体读取每一个文件的数据,是由单独的RecordReader来读取的,CombineFileRecordReader只负责操作chunk数据

DBRecordReader:从数据库表中读取数据

KeyValueRecordReader:根据指定的分割符却切分每一行数据,如果没有指定分割符,那么key就是整行的文本,value就是空

四 自定义RecordReader

public static class CombineFileLineRecordReader

extends RecordReader<WordOffset, Text> {

private long startOffset; //offset of the chunk;

private long end; //end of the chunk;

private long pos; // current pos

private FileSystem fs;

private Pathpath;

private WordOffsetkey;

private Textvalue;

private FSDataInputStreamfileIn;

private LineReaderreader;

public CombineFileLineRecordReader(CombineFileSplit split,

TaskAttemptContext context, Integer index) throws IOException {

this.path =split.getPath(index);

fs = this.path.getFileSystem(context.getConfiguration());

this.startOffset =split.getOffset(index);

this.end =startOffset + split.getLength(index);

boolean skipFirstLine = false;

//open the file

fileIn = fs.open(path);

if (startOffset !=0) {

skipFirstLine = true;

--startOffset;

fileIn.seek(startOffset);

}

reader = newLineReader(fileIn);

if (skipFirstLine) { // skip first line and re-establish "startOffset".

startOffset += reader.readLine(newText(), 0,

(int)Math.min((long)Integer.MAX_VALUE,end - startOffset));

}

this.pos =startOffset;

}

public void initialize(InputSplitsplit, TaskAttemptContextcontext)

throws IOException, InterruptedException {

}

public void close() throws IOException { }

public float getProgress() throws IOException {

if (startOffset ==end) {

return0.0f;

} else {

return Math.min(1.0f, (pos -startOffset) / (float)(end -startOffset));

}

}

public boolean nextKeyValue() throws IOException {

if (key ==null) {

key = newWordOffset();

key.fileName =path.getName();

}

key.offset =pos;

if (value ==null) {

value = newText();

}

int newSize = 0;

if (pos <end) {

newSize = reader.readLine(value);

pos += newSize;

}

if (newSize ==0) {

key = null;

value = null;

return false;

} else {

return true;

}

}

public WordOffsetgetCurrentKey()

throws IOException, InterruptedException {

return key;

}

public TextgetCurrentValue() throws IOException, InterruptedException {

return value;

}

}

MapReduce之RecordReader理解相关推荐

  1. 大数据培训之核心知识点Hbase、Hive、Spark和MapReduce的概念理解、特点及机制等

    今天,上海尚学堂大数据培训班毕业的一位学生去参加易普软件公司面试,应聘的职位是大数据开发.面试官问了他10个问题,主要集中在Hbase.Spark.Hive和MapReduce上,基础概念.特点.应用 ...

  2. MapReduce之InputFormat理解

    一 InputFormat主要作用: #验证job的输入规范 #对输入的文件进行切分,形成多个InputSplit文件,每一个InputSplit对应着一个map任务 #创建RecordReader, ...

  3. MapReduce优劣,理解MapReduce与Hadoop

    MapReduce是一种计算模型,用于大规模数据集(大于1TB)的并行运算.概念"Map(映射)"和"Reduce(归约)",是它们的主要思想,都是从函数式编程 ...

  4. MapReduce之OutputFormat理解

    一 OutputFormat作用 1校验job中指定输出路径是否存在 2将结果写入输出文件 二 OutputFormat的实现 2.1DBOutputFormat: 发送Reduce结果到SQL表中 ...

  5. MapReduce之RecordWriter理解

    RecordWriter:其实主要就是负责将task的key/value结果写入内存或者磁盘 一 方法分析 1.1 write:写key/value键值对 1.2 close: 关闭RecordWri ...

  6. qt怎么输出一个map里的所有键值_《长安十二时辰》里的MapReduce原理

    一 什么是MapReduce MapReduce是一种编程模型,也是一个处理和生成超大数据集的算法模型的相关实现.最早是由谷歌2004年公布的 MapReduce论文,论文描述了大数据的分布式计算方式 ...

  7. 【大数据实验】06:MapReduce操作

    MapReduce操作 OVERVIEW MapReduce操作 实验环境 一.WordCount单词计数 1.实验内容 2.实验原理 3.实验步骤 (1)启动Hadoop集群 (2)准备数据文件 ( ...

  8. 2.2.1 hadoop体系之离线计算-mapreduce分布式计算-mapreduce架构概念

    目录 1.写在前面 2.为什么需要MapReduce? 3.MapReduce具体细节 3.1 Hadoop MapReduce构思: 4.block,split,map,reduce关系 5.Shu ...

  9. MapReduce的核心资料索引 [转]

    转自http://prinx.blog.163.com/blog/static/190115275201211128513868/和http://www.cnblogs.com/jie46583173 ...

最新文章

  1. Rational工具介绍『转』
  2. Vue开发跨端应用(七)添加生成二维码
  3. c语言不用switch做计算器,超级新手,用switch写了个计算器程序,求指导
  4. 查看用户账户过期信息
  5. Java初学者疑难杂症之:一对一和一对多的关系
  6. linux关于bashrc与profile
  7. jmeter参数值只读取了第一个_基础入门篇Jmeter(五)_函数
  8. 基本的SVG样式属性
  9. IntelliJ IDEA 修改缓存文件设置
  10. oracle 切割字符串加引号_oracle存储过程中单引号及字符串拼接处理
  11. 运维监控软件 wgcloud 更新,v3.2.7 重构告警模块
  12. [环境搭建]-IIS下搭建FTP过程 解决无法连接及534 Policy requires SSL错误
  13. 【JAVA程序设计】(C00005)基于springboot的进存销管理系统
  14. 程序员版本的八荣八耻,爱了
  15. 一个index.html怎么添加备案号,ICP备案号怎么添加到自己网页底部?
  16. 推荐系统遇上深度学习(十二)--推荐系统中的EE问题及基本Bandit算法
  17. SpringCloud微服务架构学习
  18. ECharts-中国省市地图
  19. 《禅与摩托车维修艺术》摘录(一)
  20. 悄悄告诉你:11个高质量PNG素材来源,再也不用抠图了~

热门文章

  1. java arraylist_死磕 java集合之ArrayList源码分析
  2. Golang 实现求素数【 输入N,求N内素数个数 】
  3. java返回链表的中间结点_876. 链表的中间结点
  4. MySQL 表分区 Partition
  5. java 匿名委托_委托,匿名方法,λ 表达式
  6. (五)Netty之Selector选择器
  7. STM32F405 标准库 SHT20温湿度传感器
  8. c语言程序设计第二版课后答案 机械工业出版社,C语言程序设计 第2版
  9. python查看pypi第三方库可安装的全部版本
  10. Linux安装以太坊geth客户端