hadoop源码研究-input (3)

转载 2013年12月03日 10:10:46
InputFormat,它描述了一个MapReduce Job的输入,通过InputFormat,Hadoop可以:

l           检查MapReduce输入数据的正确性;

l           将输入数据切分为逻辑块InputSplit,这些块会分配给Mapper;

l           提供一个RecordReader实现,Mapper用该实现从InputSplit中读取输入的<K,V>对。

在org.apache.hadoop.mapreduce.lib.input中,Hadoop为所有基于文件的InputFormat提供了一个虚基类FileInputFormat。下面几个参数可以用于配置FileInputFormat:

l           mapred.input.pathFilter.class:输入文件过滤器,通过过滤器的文件才会加入InputFormat;

l           mapred.min.split.size:最小的划分大小;

l           mapred.max.split.size:最大的划分大小;

l           mapred.input.dir:输入路径,用逗号做分割。

类中比较重要的方法有:

  protected List<FileStatus> listStatus(Configuration job)

递归获取输入数据目录中的所有文件(包括文件信息),输入的job是系统运行的配置Configuration,包含了上面我们提到的参数。

  public List<InputSplit> getSplits(JobContext context)

将输入划分为InputSplit,包含两个循环,第一个循环处理所有的文件,对于每一个文件,根据输入的划分最大/最小值,循环得到文件上的划分。注意,划分不会跨越文件。

FileInputFormat没有实现InputFormat的createRecordReader方法。

FileInputFormat有两个子类,SequenceFileInputFormat是Hadoop定义的一种二进制形式存放的键/值文件(参考http://hadoop.apache.org/core/docs/current/api/org/apache/hadoop/io/SequenceFile.html),它有自己定义的文件布局。由于它有特殊的扩展名,所以SequenceFileInputFormat重载了listStatus,同时,它实现了createRecordReader,返回一个SequenceFileRecordReader对象。TextInputFormat处理的是文本文件,createRecordReader返回的是LineRecordReader的实例。这两个类都没有重载FileInputFormat的getSplits方法,那么,在他们对于的RecordReader中,必须考虑FileInputFormat对输入的划分方式。

FileInputFormat的getSplits,返回的是FileSplit。这是一个很简单的类,包含的属性(文件名,起始偏移量,划分的长度和可能的目标机器)已经足以说明这个类的功能。

RecordReader用于在划分中读取<Key,Value>对。RecordReader有五个虚方法,分别是:

l           initialize:初始化,输入参数包括该Reader工作的数据划分InputSplit和Job的上下文context;

l           nextKey:得到输入的下一个Key,如果数据划分已经没有新的记录,返回空;

l           nextValue:得到Key对应的Value,必须在调用nextKey后调用;

l           getProgress:得到现在的进度;

l           close,来自java.io的Closeable接口,用于清理RecordReader。

我们以LineRecordReader为例,来分析RecordReader的构成。前面我们已经分析过FileInputFormat对文件的划分了,划分完的Split包括了文件名,起始偏移量,划分的长度。由于文件是文本文件,LineRecordReader的初始化方法initialize会创建一个基于行的读取对象LineReader(定义在org.apache.hadoop.util中,我们就不分析啦),然后跳过输入的最开始的部分(只在Split的起始偏移量不为0的情况下进行,这时最开始的部分可能是上一个Split的最后一行的一部分)。nextKey的处理很简单,它使用当前的偏移量作为Key,nextValue当然就是偏移量开始的那一行了(如果行很长,可能出现截断)。进度getProgress和close都很简单。

举报

相关文章推荐

hadoop源码研究 -M/R(1)

InputFormat   将输入的数据集切割成小数据集 InputSplits, 每一个 InputSplit 将由一个 Mapper 负责处理。此外 InputFormat 中还提供一个...

hadoop源码研究--output (5)

Map的结果,会通过partition分发到Reducer上,Reducer做完Reduce操作后,通过OutputFormat,进行输出,下面我们就来分析参与这个过程的类。 Mappe...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

mybatis3源码研究-构建SqlSessionFactory(一)

从mybatis3用户指南(翻译版)中我们可以看到下面这段话: 每一个 MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。 SqlSessionFactory对象...

block实现源码分析3-深入研究Block捕获外部变量和__block实现原理

转自:http://www.cocoachina.com/ios/20161103/17936.html 前言 Blocks是C语言的扩充功能,而Apple 在OS X S...

Hbase源码研究(五)------put(3)

继续上面的分析,主要看提交这下 OperationStatus[] codes = region.put(putsWithLocks.toArray(new Pair[]{})); 仔细看put...

Mybatis源码研究3:包和类的概述

org.apache.ibatis      1.annotation   本包定义了Mybatis框架中的24个注解。   本包对Mybatis的其它包没有任何依赖,也不依赖于第三方的库。 ...

一步一步DIY zepto库,研究zepto源码3 -- event模块

上面的博文介绍的都是源码src下的zepto.js文件,接着我们来看看zepto的事件模块,对应文件是event.js 代码挂在我的github上,对应文件夹v0.3.2(只实现on),v0.3....

Hadoop DFS源码研究之---Hadoop RPC机制

先记录server端的机制   最初接触RPC,用自己的思路来猜测RPC的实现机制:   Server端开启socket监听,listen()à accept()àread()àwrite...

Hadoop0.21.0源码流程分析(3)-Task节点管理启动任务

源码流程分析3-Task节点管理启动任务 1.     代码执行流程1)       TaskTracker的启动的时候会加载所有信息,包括利用RPC获得JobTracker 的R...

Hadoop0.21.0源码流程分析(3)-Task节点管理启动任务

源码流程分析3-Task节点管理启动任务 1.     代码执行流程1)       TaskTracker的启动的时候会加载所有信息,包括利用RPC获得JobTracker 的R...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)