【Hadoop】- MapReduce 框架详细介绍

MapReduce 简介

说明: 经过由普通机器组成的集群对大量数据集进行并行处理可依靠的容错软件框架。html

MapReduce做业能够将数据集分割为Map任务并行处理的数据块,框架对对Map过程产生的数据进行排序,而后最为reduce任务的数据输入,一般做业的的输出和输入数据保存在一个文件系统(Spark一般保存在内存),框架主要关注点在任务调度,任务监控,执行失败任务。node

一般计算节点和存储节点是相同的,也就是Mapreduce框架和HDFS在同一组DataNode运行,这种配置能够容许框架在集群高效调度任务,从而避免由于节点之间的数据传输形成宽带的浪费以及效率的下降算法

数据靠近原则:运行任务以及执行任务须要的数据最好在同一台机器,这样任务执行过程当中涉及到的数据能够提供相似本地访问的方式处理,从而提升效率apache


MapReduce组件

MapReduce框架有一个主ResourceManager,集群节点的NodeManager以及每一个应用匹配的MRAppMaster组成,也就是一个MapReduce只有一个ResourceManager,可是能够有许多个NodeManger,而且一个做业只对应一个MRAppMaster(hadoop 2.x使用YARN做为资源管理器)网络

最低限度应用须要经过抽象类的实现来指定map和reduce的input/output位置,并结合其余的做业参数构成MapReduce任务的配置,Hadoop做业客户端而后提交做业和配置信息给ResourceManager,ResourceManger接收Worker的响应信息,而且调度任务、监控任务、返回做业状态信息给做业客户端,尽管Hadoop框架是由Java实现,MapReduce做业能够不使用Java编写,Hadoop Streaming容许用户使用做为Mapper和Reducer的可执行文件来建立和运行做业,hadoop Pipes是一个兼容C++ API实现的mapReduce应用(非基于JNI)app


Inputs and Outputs

MapReduce框架只操做pairs,框架将一组key-value的pair做为做业的输入和输出,输入、输入能够是不一样的类型,key和value必须能支持经过网络传输,所以必须序列化,实现Writable接口,为了方便排序则实现WritableComparable接口负载均衡


mapReduce工做过程

(input) (k1, v1) --> map -->( k2, v2) --> combine --> (k2, v2) --> reduce --> (k3, v3) (output)

Mapper接口:

将框架分割输入数据映射为一组中间key-value对,Map只是将输入记录转换为一个中间记录,转换以后的数据类型不要求和输入类型相同,Hadoop MapReduce为每一个由做业的InputFormat生成的InputSplit产生对应的Map任务,总之mapper能够经过做业的Job.setMapperClass(Class)传递给做业,框架而后调用处理任务InputSlipt内部的key-value的map(WritableComparable, Writable, Context)方法,应用能够重写cleanup(Context)方法来执行清理任务。output对不要求和input对的类型一直,output对只要经过context.warite(WritableComparable, Writable)收集,应用一样可使用Counter来报告它的统计信息。注意全部的中间结果随后都会被框架排序分组,而且传递给Reducer来就决定最终结果,用户可经过Job.setGroupingComparatorClass(Class)方法来指定Comparator来控制分组过程,Mapper输出数据被排序,而后分区给每一个Reducer,分区的总数量与做业的reduce做业的数量一致,用户能够在Reducer实现Partitioner接口开控制分区中包含的key,注意Mapper会将Ouput对放在某个位置,Reducer会从对应的位置主动抓取数据。用户可选择的经过 Job.setCombinerClass(Class)来指定一个combiner去执行中间结果的本地聚合,这样有利于减小从Mapper到Reducer的传输数据。中间排序的output老是保存为一个简单的(key-len, key, value-len, value)格式。应用能够经过Configuration控制Output是否压缩、如何压缩。框架

Mapper数量

Maps的数量是根据input的总大小,也就是输入数据文件的总的数据块数决定,推荐并行执行map过程大约是10-100/单节点,例如输入数据为10T,数据块大小128M,map做业数=1010241024/128 = 81920 个,实际Map做业可能出现失败,也就是最小的,map做业数量是81920,可是可使用Configuration.set(MRJobConfig.NUM_MAPS, int) 方法设置map的数量函数

Reducer接口

经过相同的key聚合中间结果(key-valueList),reducer的数量能够经过Job.setNumReduceTasks(int)设置,总之Reducer能够经过Job.setReducerClass(Class)方法传递给做业,在Map分组的key-valueList调用 reduce(WritableComparable, Iterable<Writable>, Context),应用能够经过重写cleanup(Context)方法执行清理任务工具

reducer分给3个过程:shuffle,sort,reduce

  • shuffle: 导入Reducer的是Mappers已排序的输出结果,shuffle主要经过HTTP方式住区全部的Mapper输出的数据分区

  • sort: 框架主要根据key对Reducer进行分组,shuffle和sort是同时进行的,Mapper输出会被抓取合并

  • Secondary Sort: 若是想要对中间记录实现与在reduce之间的key分组方式不一样,可经过Job.setSortComparatorClass(Class) 来设置一个Comparator。Job.setGroupingComparatorClass(Class)用于控制中间记录的分组方式,这些能用来进行值的二次排序。

  • reduce: 这个阶段reduce(WritableComparable, Iterable<Writable>, Context)方法被调用,reduce任务结果会经过Context.write(WritableComparable, Writable)写入文件系统,应用能够Counter报告reduce任务的统计信息,Reducer的输出数据是不会排序的

Reducer数量

推荐的数量是node节点数与0.95或1.75的积,0.95d的时候当map完成以后,全部的reduce任务会当即运行并传输map的输出数据,1.75更快的节点会首先完成第一轮的reduce任务,接着发动第二轮的reducer任务,可以起到更好的做业执行的负载均衡的效果。图稿reduce的数量会提升框架的消耗,可是会提升负载均衡和较低失败的几率,缩放因子的reduce数会少于所有的全部redcue任务,由于存在部分reduce处理特殊任务和失败任务

Reducer None

经过设置reducer数量为0,MapReduce只会执行Map过程,而且经过 FileOutputFormat.setOutputPath(Job, Path).方法设置Map的输出数据保存路径,在保存在文件系统以前,map的输出数据不会进行排序

partioner

partioner主要划分key的空间,控制map输出数据的key分区过程,key通常是经过hash函数产生,传给partioner用于构建分区,分区的数量与reduce任务数量相同,默认的分区器:HashPartitioner,hash算法计算ke

counter

Counter是MapReduce应用报告统计信息的工具


做业输入

过程:

  1. 校验做业数据是否符合规范
  2. 切分输入文件为逻辑的InputSplit实例,InputSplit被分配给一个map任务
  3. RecordReader 从InputSplit中读取数据,用于Mapper处理 基于文件的Inputformat基于文件的大小用于切分输入文件为InputSplit实例,fileSystem的输入文件的blockSize视为inputSplit的上限,hadoop2.x 128M,hadoop1.x 64M,能够经过mapreduce.input.fileinputformat.split.minsize来调整MapReduce过程当中的blockSize,从而改变map的数量,TextInputFormat 是默认Inputformat

InputSplit

表示一个独立的Mapper处理的数据,FileSplit是默认的InputSplit,可经过设置 mapreduce.map.input.file设置逻辑切分的输入文件路径

RecordReader

从InputSplit读取key-value键值对,用于Map过程处理


做业输出

过程:

  1. 校验做业输出数据
  2. RecordWriter 将做业的输出数据写入文件系统TextOutputFormat 是默认的OutputFormat

OutputCommitter

描述一个MapReduce做业的任务提交

  1. 初始化时设置做业
  2. 做业完成后清理做业
  3. 设置任务零食输出
  4. 检测任务是否须要提交
  5. 提交任务输出
  6. 取消任务提交

FileOutputCommitter 是默认的OutputCommitter

RecordWriter

将输出key-value键值对写入输出文件

源网页: http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html

相关文章
相关标签/搜索