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

时间: 2024-10-13 12:29:01

MapReduce中的InputFormat(1)概述的相关文章

MapReduce中的InputFormat(2)自定义InputFormat

1 概述 Hadoop内置的输入文件格式类有: 1)FileInputFormat<K,V>这个是基本的父类,自定义就直接使用它作为父类. 2)TextInputFormat<LongWritable,Text>这个是默认的数据格式类.key代表当前行数据距离文件开始的距离,value代码当前行字符串. 3)SequenceFileInputFormat<K,V>这个是序列文件输入格式,使用序列文件可以提高效率,但是不利于查看结果,建议在过程中使用序列文件,最后展示可以

MyBatis中的resultMap简要概述_java

Mybatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. Mybatis的功能架构分为三层(图片借用了百度百科): 1)       API接口层:提供给外部使用的接口API,开发人员通过这些本地API

mongodb-MongoDB中的mapReduce中reduce文件只作用在一个文档上

问题描述 MongoDB中的mapReduce中reduce文件只作用在一个文档上 小白刚接触MongoDB,看到mapReduce这里不是很清楚,自己编了一段代码,想做个计数,然后发觉map方法出来的value如果只有一个元素的时候,好像不参与到reduce函数的计算中.如: var map=function(){ emit(this.name{count:1})}var reduce=function(keyvalues){ var count=0; for(var i in values)

hadoop map-reduce中的文件并发操作_数据库其它

这样的操作在map端或者reduce端均可.下面以一个实际业务场景中的例子来简要说明. 问题简要描述: 假如reduce输入的key是Text(String),value是BytesWritable(byte[]),不同key的种类为100万个,value的大小平均为30k左右,每个key大概对应 100个value,要求对每一个key建立两个文件,一个用来不断添加value中的二进制数据,一个用来记录各个value在文件中的位置索引.(大量的小文件会影响HDFS的性能,所以最好对这些小文件进行

MapReduce中连接负载均衡优化研究

MapReduce中连接负载均衡优化研究 翟红敏 刘国华 赵威 刘源源 翟红坤 数据分析和处理是大规模分布式数据处理应用中的重要任务.由于简单易用和具有灵活性,MapReduce编程模型逐渐成为大规模分布式数据处理系统(如Hadoop系统)的核心模型.由于所处理的数据可能不是均匀分的,MapReduce编程模型在处理连接操作时,会出现数据倾斜问题.数据倾斜问题严重降低了MapReduce执行连接操作的效率.针对MapReduce中连接操作的数据倾斜问题,分析了造成MapReduce连接性能瓶颈的

MapReduce中如何处理跨行的Block和InputSplit

1 提出问题 Map最小输入数据单元是InputSplit.比如对于那么对于一个记录行形式的文本大于128M时,HDFS将会分成多块存储(block),同时分片并非到每行行尾.这样就会产生两个问题: 1.Hadoop的一个Block默认是128M,那么对于一个记录行形式的文本,会不会造成一行记录被分到两个Block当中? 2.在把文件从Block中读取出来进行切分时,会不会造成一行记录被分成两个InputSplit,如果被分成两个InputSplit,这样一个InputSplit里面就有一行不完

hadoop详解(九) mapreduce中的压缩

作为输入 当压缩文件做为mapreduce的输入时,mapreduce将自动通过扩展名找到相应的codec对其解压 . 作为输出 当mapreduce的输出文件需要压缩时,可以更改mapred.output.compress为true, mapped.output.compression.codec为想要使用的codec的类名就 可以了,当然你可以在代码中指定,通过 调用FileOutputFormat的静态方法去设置这两个属性,我们来看代码: package com.sweetop.styha

Win XP中网络地址转换(NAT)概述

简介 随着越来越多的家庭和小型企业添置计算机,它们会发现网络是一种非常强大的计算机资源共享工具.Internet 连接则是网络上更珍贵的资源,有可能被共享.为共享 Internet 连接,同时利用价格便宜.管理简单的家庭或小型办公网络,需要部署 Internet 网关.Internet 网关通常将 NAT (网络地址转换) 作为将多个主机连接到 Internet 以共享单个公共 IP 地址的途径.但不幸的是,该解决方案却会破坏多种网络应用程序.我们将在本文中对此加以说明. 现有的"NAT 穿越&

Web应用程序中Resource Bundle技术概述

背景概述 世界经济日益全球化的同时,一个应用程序需要在全球范围内使用势在必然.传统的程序设计方法将可翻译信息如菜单按钮的标签,提示信息,帮助文档等文字信息硬编码在程序代码中,不能很好的适应全球化发展,程序的扩展性差,维护成本高.一个能支持全球化的应用程序,必须实现单一可执行的程序,动态地使用资源(Single Source Single Executable),图1 是两种模型的对比图. 图 1. 传统的程序模型和支持全球化程序模型 对于一个能支持全球化的应用程序来说: 一方面需要考虑的是用户的