MapReduce中的InputFormat(1)概述

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技术内幕》,并阅读源码小有体会。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283282.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在anaconda中运行jupyter notebook,无法自动打开浏览器的解决方案,亲测100%有效

运行jupyter notebook&#xff0c;无法自动打开浏览器的解决方案 第一步 找到 Jupyter_notebook_config.py文件&#xff0c;无论你anaconda装在哪个盘&#xff0c;这个文件一般都在C盘&#xff0c;我的在C:\Users\wyf峰.jupyter 如果没有可以在anaconda prompt中输入以下语句…

本地配置_Hadoop本地模式的安装配置

Hadoop 是一个由 Apache 基金会所开发的分布式系统基础架构&#xff0c;它可以使用户在不了解分布式底层细节的情況下开发分布式程序&#xff0c;充分利用集群的威力进行高速运算和存储。从其定义就可以发现&#xff0c;它解決了两大问题&#xff1a;大数据存储、大数据分析。也…

基于 Filter 实现条件路由

基于 filter 实现条件路由Intro在我们的项目有几个测试用的接口&#xff0c;有的接口我们往往不想在生产环境上使用&#xff0c;于是会在代码里判断当前环境是不是生产环境&#xff0c;如果不是生产环境才允许执行&#xff0c;否则就返回一个错误&#xff0c;这样的接口多了之后…

ORM框架通过映射(反射)获取数据库的数据

ORM&#xff08;Object Relational Mapping&#xff09;框架采用元数据来描述对象一关系映射细节&#xff0c;元数据一般采用XML格式&#xff0c;并且存放在专门的对象一映射文件中。只要提供了持久化类与表的映射关系&#xff0c;ORM框架在运行时就能参照映射文件的信息&#…

找不到r低版本_R 语言与数据挖掘直播班开始招生,生信分析帮你发高分文章

数据单薄很难支撑文章内容&#xff1f;数据有了不知道怎么处理作出高级的图片&#xff1f;这个时候需要的是生信分析——深度的数据挖掘和分析处理&#xff0c;可以帮助临床医生通过数据处理得到自己想要的信息&#xff0c;更快速地发文章。学习哪种生信分析的工具&#xff1f;…

读两本敦煌书杂记-敦煌由盛转衰(二)

公元420-589年&#xff0c;中国分为南北两个部分&#xff08;史称魏晋南北朝&#xff0c;由西晋末年八王之乱引起&#xff0c;北方游牧少数民族趁机侵扰中原&#xff0c;并先后建立多个少数民族政权&#xff0c;又称“五胡乱华”。“五胡”主要指匈奴、鲜卑、羯、羌、氐五个胡人…

第三方app_为什么第三方APP不能下载呢?

这些年科学技术发展日新月异&#xff0c;信息技术和网络技术也层出不穷&#xff0c;大众出行工具的汽车电器化集成度越来越高&#xff0c;汽车上娱乐主机的智能化和网络化程度也越来越高&#xff0c;汽车娱乐主机也成了人民除手机外的第二个娱乐工具&#xff0c;用惯了手机娱乐…

WPF效果第一百九十七篇之Path范围内拖拽

前面效果中分享了彩色马蹄图的效果;这不今天再次在马蹄图的基础上,实现只能在Path内的拖拽效果;闲话不多扯直接看效果:1、关于拖拽顶点实现色域范围选择,参考:https://www.codeproject.com/Tips/828310/The-simplest-WPF-diagram-designer-part2、通过Blend绘制了色度图中间区域…

PHP面向对象常见的关键字和魔术方法

在PHP5的面向对象程序设计中提供了一些常见的关键字&#xff0c;用来修饰类、成员属性或成员方法&#xff0c;使他们具有特定的功能&#xff0c;例如final、static、const等关键字。还有一些比较实用的魔术方法&#xff0c;用来提高类或对象的应用能力&#xff0c;例如__call()…

如何在论文中自动生成标准的参考文献格式

首先下载EndNote软件&#xff0c;word中会自动显示EndNote选项 选择EndNote 选择导出会下载一个txt文件 打开EndNote中向下的箭头导入&#xff08;从文件导入文献到库中&#xff09;找到刚才下载的txt文件 点击选择按键找到txt文件 选择打开即可 选择导入 选择导入的内容…

PrincetonAlgorithm I - Assignment2 Deques and Randomized Queues

Programming Assignment2 - Deque and Randomized Queues Review Assignment Specification 课程笔记 Subtext: Modular Programming Stacks and Queues are fundamental data types Value: collection of objectsBasic Operation: insert, remove, iterate.Difference: which …

TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—基础知识篇...

最近遇到一个线上报警&#xff1a;服务器出现大量TIME_WAIT导致其无法与下游模块建立新HTTP连接&#xff0c;在解决过程中&#xff0c;通过查阅经典教材和技术文章&#xff0c;加深了对TCP网络问题的理解。作为笔记&#xff0c;记录于此。 备注&#xff1a;本文主要介绍…

开源许可证,欢迎来到云时代

出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013)作者 | 唐建法前言开源许可证从最早的 GPL 开始&#xff0c; 逐渐演进到 GPLv2 和 v3&#xff0c;中间还有 Apache、MPL、AGPL、LGPL 等&#xff0c;但是近几年来有一批新的许可证的出现&#xff0c;引起了社区的一些…

selenium - Select类 - 下拉框

WebDriver提供了Select类来处理下拉框。 如百度搜索设置的下拉框&#xff0c;如下图&#xff1a; from selenium import webdriver from selenium.webdriver.support.select import Select from time import sleepdriver webdriver.Chrome() driver.implicitly_wait(10) drive…

.NET 7 预览版 7

点击上方蓝字关注我们&#xff08;本文阅读时间&#xff1a;12分钟)今天我们发布了 .NET 7 预览版 7。这是 .NET 7 的最后一个预览版&#xff0c;下一个版本将是我们的第一个候选版本 &#xff08;RC&#xff09;。.NET Conf 2022 的日期已经公布&#xff01;请于 2022 年 11 月…

android--------volley之网络请求和图片加载

为什么80%的码农都做不了架构师&#xff1f;>>> Volley是 Google 推出的 Android 异步网络请求框架和图片加载框架。 Volley的特性 封装了的异步的请求API。Volley 中大多是基于接口的设计&#xff0c;可配置性强。一个优雅和稳健的请求队列&#xff0c;一定程度符…

经典算法学习——冒泡排序

冒泡排序是我们学习的第一种排序算法。应该也算是最简单、最经常使用的排序算法了。无论怎么说。学会它是必定的。今天我们就用C语言来实现该算法。演示样例代码已经上传至&#xff1a;https://github.com/chenyufeng1991/BubbleSort算法描写叙述例如以下&#xff1a;&#xff…

Mybatis之设计模式之装饰者模式

了解&#xff0c;什么是装饰者模式? 1.定义 装饰模式是在不必改变原类文件和使用继承的情况下&#xff0c;动态地扩展一个对象的功能。它是通过创建一个包装对象&#xff0c;也就是装饰来包裹真实的对象。 2.特点 1 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真…

一天掌握Android JNI本地编程 快速入门

一、JNI&#xff08;Java Native Interface&#xff09; 1、什么是JNI&#xff1a;JNI(Java Native Interface):java本地开发接口JNI是一个协议&#xff0c;这个协议用来沟通java代码和外部的本地代码(c/c) 外部的c/c代码也可以调用java代码2、为什么使用JNI&#xff1a;效率上…

[转]CentOS 7忘记root密码解决办法

转自&#xff1a;http://www.linuxidc.com/Linux/2016-08/134034.htm 亲测可用&#xff01; CentOS 7 root密码的重置方式和CentOS 6完全不一样&#xff0c;CentOS 7与之前的版本6变化还是比较大的&#xff0c;以进入单用户模式修改root密码为例。 1.重启开机按esc 2.按e 3.编…