HADOOP学习笔记(二):mapreduce

前言

Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架;

Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群上。

MapReduce进程

一个完整的mapreduce程序在分布式运行时有三类实例进程:

1)MrAppMaster:负责整个程序的过程调度及状态协调

2)MapTask:负责map阶段的整个数据处理流程

3)ReduceTask:负责reduce阶段的整个数据处理流程

MapReduce程序运行流程

1、一个 mr 程序启动的时候,最先启动的是 MRAppMaster,MRAppMaster 启动后根据本次 job 的描述信息,计算出需要的 maptask 实例数量,然后向集群申请机器启动相应数量的 maptask 进程

2、 maptask 进程启动之后,根据给定的数据切片(哪个文件的哪个偏移量范围)范围进行数 据处理,主体流程为:

   A、利用客户指定的 InputFormat 来获取 RecordReader 读取数据,形成输入 KV 对

  B、将输入 KV 对传递给客户定义的 map()方法,做逻辑运算,并将 map()方法输出的 KV 对收 集到缓存

  C、将缓存中的 KV 对按照 K 分区排序后不断溢写到磁盘文件

3、 MRAppMaster 监控到所有 maptask 进程任务完成之后(真实情况是,某些 maptask 进 程处理完成后,就会开始启动 reducetask 去已完成的 maptask 处 fetch 数据),会根据客户指 定的参数启动相应数量的 reducetask 进程,并告知 reducetask 进程要处理的数据范围(数据 分区)

4、Reducetask 进程启动之后,根据 MRAppMaster 告知的待处理数据所在位置,从若干台 maptask 运行所在机器上获取到若干个 maptask 输出结果文件,并在本地进行重新归并排序, 然后按照相同 key 的 KV 为一个组,调用客户定义的 reduce()方法进行逻辑运算,并收集运 算输出的结果 KV,然后调用客户指定的 OutputFormat 将结果数据输出到外部存储

MapReduce程序中的组件

mapTask

并行度

一个job的map阶段并行度由客户端在提交job时决定
而客户端对map阶段并行度的规划的基本逻辑为:
将待处理数据执行逻辑切片(即按照一个特定切片大小,将待处理数据划分成逻辑上的多个split),然后每一个split分配一个mapTask并行实例处理
注意:
block是HDFS上物理上存储的存储的数据,切片是对数据逻辑上的划分。两者之间没有关系。即使hdfs上是128M存储,Mapreduce也会切片,只是默认切片也是128M。也可以非128M切片,如100M,多余的部门由框架内部处理和其他结点进行拼接切片。因为切片决定了给其分配mapTask进程数量。 

InputFormat数据切片机制

主要有两个方法:getsplit(),客户端用来切片。
                  creatRecordReader()MR用来读数据
1、切片定义在InputFormat类中的getSplit()方法
2、FileInputFormat中默认的切片机制:

 通过分析源码,在 FileInputFormat 中,计算切片大小的逻辑:  Math.max(minSize, Math.min(maxSize, blockSize)),翻译一下就是求这三个值的中 间值

切片主要由这几个值来运算决定:

blocksize:默认是 128M,可通过 dfs.blocksize 修改

minSize:默认是 1,可通过 mapreduce.input.fileinputformat.split.minsize 修改

maxsize:默认是 Long.MaxValue,可通过 mapreduce.input.fileinputformat.split.maxsize 修改

因此,如果 maxsize 调的比 blocksize 小,则切片会小于 blocksize 如果 minsize 调的比 blocksize 大,则切片会大于 blocksize 但是,不论怎么调参数,都不能让多个小文件“划入”一个 split

ReduceTask

reducetask的并行度同样影响整个job的执行并发度和执行效率,但与maptask的并发数由切片数决定不同,Reducetask数量的决定是可以直接手动设置:

//默认值是1,手动设置为4

job.setNumReduceTasks(4);

如果数据分布不均匀,就有可能在reduce阶段产生数据倾斜

注意: reducetask数量并不是任意设置,还要考虑业务逻辑需求,有些情况下,需要计算全局汇总结果,就只能有1个reducetask

 

尽量不要运行太多的reduce task。对大多数job来说,最好rduce的个数最多和集群中的reduce持平,或者比集群的reduce slots小。这个对于小集群而言,尤其重要。

Shuffle机制

概述

1)mapreduce中,map阶段处理的数据如何传递给reduce阶段,是mapreduce框架中最关键的一个流程,这个流程就叫shuffle;

2)shuffle: 洗牌、发牌(核心机制:数据分区、排序、缓存);

3)具体来说:就是将maptask输出的处理结果数据,分发给reducetask,并在分发的过程中,对数据按key进行了分区和排序。

Shuffle流程

shuffle是MR处理流程中的一个过程,它的每一个处理步骤是分散在各个map task和reduce task节点上完成的。

map阶段

1、split过程

2、partition过程:partition是分割map每个节点的结果,按照key分别映射给不同的reduce,也是可以自定义的。

3、溢写过程(sort&combine

4、Merge过程

reducer阶段

1、Copy过程

2、Merge阶段

3、把数据按键输入到 reduce 函数中。

 

参考:MapReduce的核心运行机制:https://www.cnblogs.com/qingyunzong/p/8573252.html

           MapReduce:详解Shuffle过程: http://langyu.iteye.com/blog/992916

posted @ 2018-09-14 13:59  gloomysun  阅读(239)  评论(0编辑  收藏  举报