1 MapReduce编程模型
MapReduce将作业的整个运行过程分为两个阶段:Map阶段和Reduce阶段
Map阶段由一定数量的Map Task组成
输入数据格式解析:InputFormat
输入数据处理:Mapper
数据分组:Partitioner
Reduce阶段由一定数量的Reduce Task组成
数据远程拷贝
数据按照key排序
数据处理:Reducer
数据输出格式:OutputFormat
2 MapReduce工作原理
如下图所示:
Map阶段
InputFormat(默认TextInputFormat)
Mapper
Combiner(local reducer)
Partitioner
Reduce阶段
Reducer
OutputFormat(默认TextOutputFormat)
InputFormat
1 数据文件分片(Input Split),按照固定块划分
2 处理跨行问题
3 将分片数据解析成key/value对
4 默认实现是TextInputFormat
TextInputFormat
Key是行在文件中的偏移量,value是行内容。若行被截断,则读取下一个block的前几个字符
Split与Block
Block: HDFS中最小的数据存储单位 默认是64MB
Spit:MapReduce中最小的计算单元,默认与Block一一对应
Split与Block是对应关系是任意的,可由用户控制
Combiner
Combiner可做看local reducer 合并相同的key对应的value通常与Reducer逻辑一样
好处:
减少Map Task输出数据量(磁盘IO)
减少Reduce-Map网络传输数据量(网络IO)
Partitioner
Partitioner决定了Map Task输出的每条数据交给哪个Reduce Task处理
默认实现:hash(key) mod R
R是Reduce Task数目允许用户自定义很多情况需自定义Partitioner 比如“hash(hostname(URL)) mod R”确保相同域名的网页交给同一个Reduce Task处理
3 MapReduce编程模型—内部逻辑
4 MapReduce编程模型—外部物理结构
5 MapReduce作业运行流程
流程分析:
6 Map、Reduce任务中Shuffle和排序的具体过程
如下图所示:
流程分析:
Map端:
这里还有一个Shuffle,Shuffle的中文意思是“混洗”,如果我们这样看:一个map产生的数据,结果通过hash过程分区却分配给了不同的reduce任务。
Reduce端:
MapReduce编程相关—InputFormat
InputFormat API
InputFormat 负责处理MR的输入部分有三个作用:
1 验证作业的输入是否规范。
2 把输入文件切分成InputSplit。 (处理跨行问题)
3 提供RecordReader 的实现类,把InputSplit读到Mapper中进行处理。
InputFormat类的层次结构
MapReduce编程模型—Split与Block
Split与Block简介
Block: HDFS中最小的数据存储单位,默认是64MB
Spit: MapReduce中最小的计算单元,默认与Block一一对应
Block与Split: Split与Block是对应关系是任意的,可由用户控制.
InputSplit
在执行mapreduce之前,原始数据被分割成若干split,每个split作为一个map任务的输入,在map执行过程中split会被分解成一个个记录(key-value对),map会依次处理每一个记录。
1. FileInputFormat只划分比HDFS block大的文件,所以FileInputFormat划分的结果是这个文件或者是这个文件中的一部分.
2. 如果一个文件的大小比block小,将不会被划分,这也是Hadoop处理大文件的效率要比处理很多小文件的效率高的原因。
3. 当hadoop处理很多小文件(文件大小小于hdfs block大小)的时候,由于FileInputFormat不会对小文件进行划分,所以每一个小文件都会被当做一个split并分配一个map任务,导致效率底下。例如:一个1G的文件,会被划分成16个64MB的split,并分配16个map任务处理,而10000个100kb的文件会被10000个map任务处理。
TextInputFormat
其他输入类
CombineFileInputFormat
相对于大量的小文件来说,hadoop更合适处理少量的大文件。
CombineFileInputFormat可以缓解这个问题,它是针对小文件而设计的。
KeyValueTextInputFormat
当输入数据的每一行是两列,并用tab分离的形式的时候,KeyValueTextInputformat处理这种格式的文件非常适合。
NLineInputformat
NLineInputformat可以控制在每个split中数据的行数。
SequenceFileInputformat
当输入文件格式是sequencefile的时候,要使用SequenceFileInputformat作为输入。
自定义输入格式
MapReduce编程模型—Combiner
如果不用combiner,那么,所有的结果都是reduce完成,效率会相对低下。使用combiner,先完成的map会在本地聚合,提升速度。
好处:①减少Map Task输出数据量(磁盘IO)②减少Reduce-Map网络传输数据量(网络IO)
【注意:Combiner的输出是Reducer的输入,如果Combiner是可插拔(可有可无)的,添加Combiner绝不能改变最终的计算结果。所以Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景。比如累加,最大值等。】
MapReduce编程模型—Partitioner
1.Partitioner决定了Map Task输出的每条数据交给哪个Reduce Task处理
2.默认实现:HashPartitioner是mapreduce的默认partitioner。计算方法是 reducer=(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks,得到当前的目的reducer。(hash(key) mod R 其中R是Reduce Task数目)
3.允许用户自定义
很多情况需自定义Partitioner比如“hash(hostname(URL)) mod R”确保相同域名的网页交给同一个Reduce Task处理
Reduce的输出
TextOutputformat 默认的输出格式,key和value中间值用tab隔开的。
SequenceFileOutputformat 将key和value以sequencefile格式输出。
SequenceFileAsOutputFormat 将key和value以原始二进制的格式输出。
MapFileOutputFormat 将key和value写入MapFile中。由于MapFile中的key是有序的,所以写入的时候必须保证记录是按key值顺序写入的。
MultipleOutputFormat 默认情况下一个reducer会产生一个输出,但是有些时候我们想一个reducer产生多个输出,MultipleOutputFormat和MultipleOutputs可以实现这个功能。(还可以自定义输出格式,序列化会说到)
Client
与MapReduce 1.0的Client类似,用户通过Client与YARN交互,提交MapReduce作业,查询作业运行状态,管理作业等。
MRAppMaster
功能类似于 1.0中的JobTracker,但不负责资源管理;
功能包括:任务划分、资源申请并将之二次分配个Map Task和Reduce Task、任务状态监控和容错。
MapReduce 2.0容错性
一旦运行失败,由YARN的ResourceManager负责重新启动,最多重启次数可由用户设置,默认是2次。一旦超过最高重启次数,则作业运行失败。
Map Task/Reduce Task
Task周期性向MRAppMaster汇报心跳;一旦Task挂掉,则MRAppMaster将为之重新申请资源,并运行之。最多重新运行次数可由用户设置,默认4次。
数据本地性
什么是数据本地性(data locality)如果任务运行在它将处理的数据所在的节点,则称该任务具有“数据本地性” 本地性可避免跨节点或机架数据传输,提高运行效率
数据本地性分类
推测执行机制
作业完成时间取决于最慢的任务完成时间,一个作业由若干个Map任务和Reduce任务构成, 因硬件老化、软件Bug等,某些任务可能运行非常慢 。推测执行机制:发现拖后腿的任务,比如某个任务运行速度远慢于任务平均速度;为拖后腿任务启动一个备份任务,同时运行,谁先运行完,则采用谁的结果 。
不能启用推测执行机制:任务间存在严重的负载倾斜 ;特殊任务,比如任务向数据库中写数据
常见MapReduce应用场景
复杂数据分析算法实现
聚类算法
分类算法
推荐算法
图算法