MAPREDUCE原理篇
mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架。
Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群上。
分为三块:MRAppMaster(mapreduce application master)/MapTask/Reduce Task
MAPREDUCE框架结构及核心运行机制
结构
一个完整的mapreduce程序在分布式运行时由三类实例进程:
MRAppMaster:负责整个程序的过程调度以及状态协调
mapTask:负责map阶段的整个数据处理流程
ReduceTask:负责reduce阶段的整个数据处理流程
MR运行流程解析:
一个mr程序启动的时候,最先启动的是MRAppMaster,MRAppMaster启动后根据本次job的描述信息,计算出需要的maptask实例数量,然后想集群申请机器启动相应数量的maptask进程
maptask进程启动之后,根据给定的数据切片范围进行数据处理,主题流程为:
A)利用客户指定的inputformat来获取RecordReader读取数据,形成输入KV对
B)将输入KV对传递给客户定义的map()方法,做逻辑运算,并将map()方法输出的KV对收集到缓存
C)将缓存中的KV按照K分区排序后不断溢写到磁盘文件
MRAppMaster监控所有的maptask进程,任务完成之后,会根据客户指定的参数启动相应数量的reducetask进程,并告知reducetask进程要处理的数据范围(数据分区)
ReduceTask进程启动之后,根据MRAppMaster告知的待处理数据所在位置,从若干台maptask运行所在机器上获取若干个maptask输出结果文件,并在本地进行重新归并排序,然后按照相同key的kv为一个组,调用客户定义的reduce()方法进行逻辑运算,并收集运算输出的结果KV,然后调用客户指定的outputformat将结果输出到外部存储。
MapTask并行读决定机制
一个job的map阶段并行度由客户端在提交job时决定,而客户端对map阶段并行度的规划的基本逻辑为:
将待处理数据执行逻辑切片(即按照一个特定切片大小,将待处理数据划分成逻辑上的多个split),然后每一个split分配一个maptask并行实例处理
这个逻辑方法使用FileInputFormat实现类的getSplits()方法完成。
默认的切片机制:
a>简单的按照文件的内容长度进行切片
b>切片大小,默认等于block大小
c>切片时不考虑数据集整体,而是逐个针对每一个文件单独切片
建议查看FileInputFormat的getSplit()源码
选择并发数的影响因素:
1.运算节点的硬件配置
2.运算任务的类型:CPU密集型还是IO密集型
3.运算任务的数据量
ReduceTask的并行度决定
reducetask的并行度同样影响整个job的执行并发度和执行效率,但与maptask的并发数由切片数决定不同,Reducetask数量决定是可以直接手动设置。
job.setNumReduceTask(4);
如果数据分布不均匀,就有可能在reduce阶段产生数据倾斜
注意:reducetask数量并不是任意设置,还要考虑任务逻辑需求,有些情况下,需要计算全局汇总结果,就只能有一个reducetask
MAPREDUCE中的Combiner
(1)combiner是MR程序中Mapper和Reducer之外的一种组件
(2)conbiner组件的父类就是Reducer
(3)combiner和reducer的区别在于运行的位置:
combiner是在每一个maptask所在的节点运行
Reducer是接收全局所有Mapper的输出结果
(4)combiner的意义就是对每一个maptask的输出进行局部汇总,以减少网络传输量
具体实现步骤:
1.自定义一个combiner集成reducer,重写reduce方法
2.在job中设置:job.setCombinerClass(CustomCombier.class)
(5)combiner能够应用的前提是不影响最终的业务逻辑
而且,combiner的输出kv应该和reducer的输出kv类型要对应起来。
MAPREDUCE的shuffle机制
1.概述
mapreduce中,map阶段处理的数据如何传递给reduce阶段,是mapreduce框架中最关键的一个流程,这个流程就叫shuffle。
shuffle:洗牌,发牌—-(核心机制:数据分区,排序,缓存)
具体来说:就是将maptask输出的处理结果数据,分发给reducetask,并在分发的过程中,对数据按key进行了分区和排序。
2.主要流程
shuffle是MR处理过程中的一个过程,他的每一个处理步骤是分散在各个map task和reduce task节点上完成的,整体来看,分为三个操作:
1.分区partition
2.Sort根据key排序
3.Combiner进行局部value的合并。
3.详细流程
1.maptask收集我们的map方法输出的kv对,放到内存缓冲区中
2.从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件
3.多个溢出文件会被合并成大的溢出文件。
4.在溢出过程中,及合并过程中,都要调用partitoner进行分组和针对key进行排序
5.reducetask根据自己的分区号,去各个maptask机器上取相应的结果分区数据
6.reducetask会取到同一个分区的来自不同的maptask的结果文件,reducetaskh会将这些文件再进行合并
7.合并成大文件后,shuffle的过程也就结束了,后面进入reducetask的逻辑运算过程(从文件中取出一个一个的键值对group,调用用户自定义的reduce方法)
shuffle中的缓冲区大小会影响到mapreduce程序的执行效率,原则上说,缓冲区越大,磁盘的io次数越小,执行熟读就越快。
缓冲区的大小可以通过参数调整,参数:io.sort.mb 默认:100M
MapReduce与YARN
YARN概述
yarn是一个资源调度的平台,负责为运算程序提供服务器运算资源,相当于一个分布式操作系统平台,而mapreduce等运算程序则相当于操作系统之上的应用程序。
YARN的重要概念
1.yarn并不清楚用户提交的程序的运行机制
2.yarn值提供运算资源的调度(用户程序向yarn申请资源,yarn就负责分配资源)
3.yarn中的主管角色叫做ResourceManager
4.yarn中具体运算资源的角色叫做NodeManager
5.这样一来,yarn其实就与运行的用户程序完全解耦,就意味着yarn上可以运行各种类型的分布式程序,比如mapreduce,storm程序,spark程序..
6.spartk、storm等运算框架都可以整合在yarn上运行,只要他们各自的框架中有符合yarn规范的资源请求机制。
7yarn成为一个通用的资源调度平台,从此,企业中以前存在的各种运算集群都可以整合在一个物理集群上,提高资源利用率,方便数据共享。
Mapreduce中的分区partitioner
Mapreduce中会将map输出的kv对,按照相同key分组,然后分发给不同的reducetask默认的分发规则为:根据key的hashcode%reducetask数来分发所以:如果要按照我们自己的需求进行分组,则需要改写数据分发(分组)组件Partitioner自定义一个CustomPartitioner继承抽象类:Partitioner然后在job对象中,设置自定义partitioner:job.setPartitionerClass(CustomPartitioner.class)