MapReduce输入输出

2024-08-20 17:48
文章标签 输入输出 mapreduce

本文主要是介绍MapReduce输入输出,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MapReduce输入输出

作业的输入

InputFormat  为Map/Reduce作业描述输入的细节规范。

Map/Reduce框架根据作业的 InputFormat 来:

  1. 检查作业输入的有效性。
  2. 把输入文件切分成多个逻辑 InputSplit 实例, 并把每一实例分别分发给一个 Mapper 。
  3. 提供 RecordReader 的实现,这个RecordReader从逻辑 InputSplit 中获得输入记录, 这些记录将由 Mapper 处理。

基于文件的 InputFormat 实现(通常是  FileInputFormat 的子类) 默认行为是按照输入文件的字节大小,把输入数据切分成逻辑分块( logical   InputSplit  )。 其中输入文件所在的 FileSystem 的数据块尺寸是分块大小的上限。下限可以设置mapred.min.split.size  的值。

考虑到边界情况,对于很多应用程序来说,很明显按照文件大小进行逻辑分割是不能满足需求的。 在这种情况下,应用程序需要实现一个 RecordReader 来处理记录的边界并为每个任务提供一个逻辑分块的面向记录的视图。

TextInputFormat  是默认的 InputFormat 。

如果一个作业的 Inputformat 是 TextInputFormat , 并且框架检测到输入文件的后缀是 .gz 和 .lzo ,就会使用对应的 CompressionCodec 自动解压缩这些文件。 但是需要注意,上述带后缀的压缩文件不会被切分,并且整个压缩文件会分给一个mapper来处理。

InputSplit

InputSplit  是一个单独的 Mapper 要处理的数据块。

一般的 InputSplit  是字节样式输入,然后由 RecordReader 处理并转化成记录样式。

FileSplit  是默认的 InputSplit 。 它把  map.input.file  设定为输入文件的路径,输入文件是逻辑分块文件。

RecordReader

RecordReader  从 InputSlit 读入 <key, value> 对。

一般的, RecordReader  把由 InputSplit  提供的字节样式的输入文件,转化成由Mapper 处理的记录样式的文件。 因此 RecordReader 负责处理记录的边界情况和把数据表示成keys/values对形式。

作业的输出

OutputFormat  描述Map/Reduce作业的输出样式。

Map/Reduce框架根据作业的 OutputFormat 来:

  1. 检验作业的输出,例如检查输出路径是否已经存在。
  2. 提供一个 RecordWriter 的实现,用来输出作业结果。 输出文件保存在FileSystem 上。

TextOutputFormat 是默认的  OutputFormat 。

任务的Side-Effect File

在一些应用程序中,子任务需要产生一些side-file,这些文件与作业实际输出结果的文件不同。

在这种情况下,同一个 Mapper 或者 Reducer 的两个实例(比如预防性任务)同时打开或者写  FileSystem 上的同一文件就会产生冲突。因此应用程序在写文件的时候需要为每次任务尝试(不仅仅是每次任务,每个任务可以尝试执行很多次)选取一个独一无二的文件名(使用attemptid,例如task_200709221812_0001_m_000000_0 )。

为了避免冲突,Map/Reduce框架为每次尝试执行任务都建立和维护一个特殊的 ${mapred.output.dir}/_temporary/_${taskid} 子目录,这个目录位于本次尝试执行任务输出结果所在的 FileSystem 上,可以通过  ${mapred.work.output.dir} 来访问这个子目录。 对于成功完成的任务尝试,只有${mapred.output.dir}/_temporary/_${taskid} 下的文件会 移动 到${mapred.output.dir} 。当然,框架会丢弃那些失败的任务尝试的子目录。这种处理过程对于应用程序来说是完全透明的。

在任务执行期间,应用程序在写文件时可以利用这个特性,比如 通过  FileOutputFormat.getWorkOutputPath()获得 ${mapred.work.output.dir} 目录, 并在其下创建任意任务执行时所需的side-file,框架在任务尝试成功时会马上移动这些文件,因此不需要在程序内为每次任务尝试选取一个独一无二的名字。

注意:在每次任务尝试执行期间, ${mapred.work.output.dir}  的值实际上是 ${mapred.output.dir}/_temporary/_{$taskid} ,这个值是Map/Reduce框架创建的。 所以使用这个特性的方法是,在 FileOutputFormat.getWorkOutputPath()  路径下创建side-file即可。

对于只使用map不使用reduce的作业,这个结论也成立。这种情况下,map的输出结果直接生成到HDFS上。

RecordWriter

RecordWriter  生成 <key, value>  对到输出文件。

RecordWriter的实现把作业的输出结果写到  FileSystem 。



这篇关于MapReduce输入输出的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1090753

相关文章

【Hadoop|MapReduce篇】MapReduce概述

1. MapReduce定义 MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。 2. MapReduce优缺点 2.1 优点 MapReduce易于编程 它简单的实现一些接口,就可以完成一个分布式

HDU1720(输入输出涨姿势)

A+B Coming Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5953    Accepted Submission(s): 3901 题目链接: http://acm.hdu.edu.cn/showproblem.p

ACM比赛中如何加速c++的输入输出?如何使cin速度与scanf速度相当?什么是最快的输入输出方法?

在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。还有人说Pascal的read语句的速度是C/C++中scanf比不上的,C++选手只能干着急。难道C++真的低Pascal一等吗?答案是不言而喻的。一个进阶的方法是把数据一下子读进来,然后再转化字符串,这种方法传说中

MapReduce算法 – 反转排序(Order Inversion)

译者注:在刚开始翻译的时候,我将Order Inversion按照字面意思翻译成“反序”或者“倒序”,但是翻译完整篇文章之后,我感觉到,将Order Inversion翻译成反序模式是不恰当的,根据本文的内容,很显然,Inversion并非是将顺序倒排的意思,而是如同Spring的IOC一样,表明的是一种控制权的反转。Spring将对象的实例化责任从业务代码反转给了框架,而在本文的模式中,在map

Java中的输入输出方法及格式

输入 通过Scanner类的对象进行输入 Scanner类位于java.util.Scanner包中,需要使用import关键字导入 Import java.util.Scanner 首先创建一个Scanner类的对象 Scanner 对象名=new Scanner(System.in); Scanner类中提供的方法包括 next():获取字符串,但不包括空格、Tab键和换行符

圆形缓冲区-MapReduce中的

这篇文章来自一个读者在面试过程中的一个问题,Hadoop在shuffle过程中使用了一个数据结构-环形缓冲区。 环形队列是在实际编程极为有用的数据结构,它是一个首尾相连的FIFO的数据结构,采用数组的线性空间,数据组织简单。能很快知道队列是否满为空。能以很快速度的来存取数据。 因为有简单高效的原因,甚至在硬件都实现了环形队列。 环形队列广泛用于网络数据收发,和不同程序间数据交换(比如内核与应用

【硬刚Hadoop】HADOOP MAPREDUCE(11):Join应用

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的Hadoop部分补充。 1 Reduce Join Map端的主要工作:为来自不同表或文件的key/value对,打标签以区别不同来源的记录。然后用连接字段作为key,其余部分和新加的标志作为value,最后进行输出。 Reduce端的主要工作:在Reduce端以连接字段作为key的分组已经完成,我们只需要在

【硬刚Hadoop】HADOOP MAPREDUCE(10):OutputFormat数据输出

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的Hadoop部分补充。 1 OutputFormat接口实现类 2 自定义OutputFormat 3 自定义OutputFormat案例实操 1.需求 过滤输入的log日志,包含atguigu的网站输出到e:/atguigu.log,不包含atguigu的网站输出到e:/o

【硬刚Hadoop】HADOOP MAPREDUCE(9):MapReduce内核源码解析(2)ReduceTask工作机制

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的Hadoop部分补充。 1.ReduceTask工作机制 ReduceTask工作机制,如图4-19所示。 图4-19 ReduceTask工作机制 (1)Copy阶段:ReduceTask从各个MapTask上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中

【硬刚Hadoop】HADOOP MAPREDUCE(8):MapReduce内核源码解析(1)MapTask工作机制

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的Hadoop部分补充。 MapTask工作机制 MapTask工作机制如图4-12所示。 图4-12  MapTask工作机制 (1)Read阶段:MapTask通过用户编写的RecordReader,从输入InputSplit中解析出一个个key/value。 (2)Map阶段:该节点主要是将解析出