MapReduce之RecordReader理解
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理解相关推荐
- 大数据培训之核心知识点Hbase、Hive、Spark和MapReduce的概念理解、特点及机制等
今天,上海尚学堂大数据培训班毕业的一位学生去参加易普软件公司面试,应聘的职位是大数据开发.面试官问了他10个问题,主要集中在Hbase.Spark.Hive和MapReduce上,基础概念.特点.应用 ...
- MapReduce之InputFormat理解
一 InputFormat主要作用: #验证job的输入规范 #对输入的文件进行切分,形成多个InputSplit文件,每一个InputSplit对应着一个map任务 #创建RecordReader, ...
- MapReduce优劣,理解MapReduce与Hadoop
MapReduce是一种计算模型,用于大规模数据集(大于1TB)的并行运算.概念"Map(映射)"和"Reduce(归约)",是它们的主要思想,都是从函数式编程 ...
- MapReduce之OutputFormat理解
一 OutputFormat作用 1校验job中指定输出路径是否存在 2将结果写入输出文件 二 OutputFormat的实现 2.1DBOutputFormat: 发送Reduce结果到SQL表中 ...
- MapReduce之RecordWriter理解
RecordWriter:其实主要就是负责将task的key/value结果写入内存或者磁盘 一 方法分析 1.1 write:写key/value键值对 1.2 close: 关闭RecordWri ...
- qt怎么输出一个map里的所有键值_《长安十二时辰》里的MapReduce原理
一 什么是MapReduce MapReduce是一种编程模型,也是一个处理和生成超大数据集的算法模型的相关实现.最早是由谷歌2004年公布的 MapReduce论文,论文描述了大数据的分布式计算方式 ...
- 【大数据实验】06:MapReduce操作
MapReduce操作 OVERVIEW MapReduce操作 实验环境 一.WordCount单词计数 1.实验内容 2.实验原理 3.实验步骤 (1)启动Hadoop集群 (2)准备数据文件 ( ...
- 2.2.1 hadoop体系之离线计算-mapreduce分布式计算-mapreduce架构概念
目录 1.写在前面 2.为什么需要MapReduce? 3.MapReduce具体细节 3.1 Hadoop MapReduce构思: 4.block,split,map,reduce关系 5.Shu ...
- MapReduce的核心资料索引 [转]
转自http://prinx.blog.163.com/blog/static/190115275201211128513868/和http://www.cnblogs.com/jie46583173 ...
最新文章
- Rational工具介绍『转』
- Vue开发跨端应用(七)添加生成二维码
- c语言不用switch做计算器,超级新手,用switch写了个计算器程序,求指导
- 查看用户账户过期信息
- Java初学者疑难杂症之:一对一和一对多的关系
- linux关于bashrc与profile
- jmeter参数值只读取了第一个_基础入门篇Jmeter(五)_函数
- 基本的SVG样式属性
- IntelliJ IDEA 修改缓存文件设置
- oracle 切割字符串加引号_oracle存储过程中单引号及字符串拼接处理
- 运维监控软件 wgcloud 更新,v3.2.7 重构告警模块
- [环境搭建]-IIS下搭建FTP过程 解决无法连接及534 Policy requires SSL错误
- 【JAVA程序设计】(C00005)基于springboot的进存销管理系统
- 程序员版本的八荣八耻,爱了
- 一个index.html怎么添加备案号,ICP备案号怎么添加到自己网页底部?
- 推荐系统遇上深度学习(十二)--推荐系统中的EE问题及基本Bandit算法
- SpringCloud微服务架构学习
- ECharts-中国省市地图
- 《禅与摩托车维修艺术》摘录(一)
- 悄悄告诉你:11个高质量PNG素材来源,再也不用抠图了~
热门文章
- java arraylist_死磕 java集合之ArrayList源码分析
- Golang 实现求素数【 输入N,求N内素数个数 】
- java返回链表的中间结点_876. 链表的中间结点
- MySQL 表分区 Partition
- java 匿名委托_委托,匿名方法,λ 表达式
- (五)Netty之Selector选择器
- STM32F405 标准库 SHT20温湿度传感器
- c语言程序设计第二版课后答案 机械工业出版社,C语言程序设计 第2版
- python查看pypi第三方库可安装的全部版本
- Linux安装以太坊geth客户端