MapReduce是分布式运算编程框架,Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群上
为什么要MAPREDUCE
(1)海量数据在单机上处理因为硬件资源限制,无法胜任
(2)而一旦将单机版程序扩展到集群来分布式运行,将极大增加程序的复杂度和开发难度
(3)引入mapreduce框架后,开发人员可以将绝大部分工作集中在业务逻辑的开发上,而将分布式计算中的复杂性交由框架来处理
1 . MapReduce的整体工作机制
一个完整的mapreduce程序在分布式运行时有三类实例进程:
1、MRAppMaster:负责整个程序的过程调度及状态协调
2、mapTask:负责map阶段的整个数据处理流程
3、ReduceTask:负责reduce阶段的整个数据处理流程
MapReduce运行启动起来需要启动多个MapTask , 多个ReduceTask , 以及一个实例MRAppMaster .
MRAppMaster :是MapTask和ReduceTask的主管,(先启动,启动起来之后也运行在yarn的NodeManager提供的容器里面)
Map :里面产生大量的 key-value ,发送给reduce进行处理,reduce处理的时候,先处理key较小的(有一个排序机制,调用GroupingComparator方法判断多个对象是否是一组)
1.1 : MapReduce分为俩个阶段进行数据的处理 :
Map阶段 : (对MapTask读取的一行数据进行如何处理)
实现的程序是MapTask
MapTask可以在很多机器上同时运行
MapTask启动之后就会去你指定的数据输入集上读取数据 , 会将数据集上的数据进行均分,每个MapTask读取其中一部分(每个MapTaskMapTask负责的数据范围,成为一个数据切片)
MapTask启动之前会先进行所有文件扫描 , 计算出文件的大小和应该启动的MapTask数量 (如果数据的数量过大 , 导致MapTask启动的数量过多 , 机器无法运行的话 --->这时候MapTask可以分批量的进行运行)
MapTask将读取到的数据 ,发送给重写的map方法进行处理 , 处理完的数据通过Context方法返回给MapTask.如果只有Map阶段的话 , 处理完的数据在每台机器上无法将全局的数据进行合并 , 所以会有 Reduce 阶段来将所有数据进行合并处理 .
Inputsplit的作用 ? 用于描述每个MapTask所处理的数据任务范围 (如果MapTask读取的是文件 , 那么划分范围信息应该是 : 文件路径+偏移量范围 ; 如果 MapTask 读取的是数据库数据 , 那么划分范围信息应该是 : 库名.表名+行范围)
MapTask 启动之前已经注定了 , 他应该处理的数据切片的信息已经传递给每一个MapTask了(谁传递的?---context里面包含了该task处理的数据切片信息)
MRAppMaster监控到所有maptask进程任务完成之后,会根据客户指定的参数启动相应数量的reducetask进程,并告知reducetask进程要处理的数据范围(数据分区)
Reduce阶段 : ( 对 ReduceTask 拿到的一组相同的 key 的 key-value 数据如何处理 )
实现的程序锁是ReduceTask
ReduceTask也可以同时运行在多台机器上 , 但是Reduce的数量和MapTask的数量是没有关系的
Map会返回大量的key-value数据 , ReduceTask会去MapTask上拉取结果数据进行汇总
MapTask端产生的数据和ReduceTask之间会涉及到一个数据的分发(相同的key数据会给到同一个ReduceTask) , 叫做shuffle .
ReduceTask会调用一个接口的实现类方法进行聚合处理 , 处理完的数据通过Context将数据返回给ReduceTask , 然后ReduceTask 会将最后的数据写入输出目录 .
关于Hadoop的三大核心技术 :
分布式文件管理系统HDFS,分布式计算框架MapReduce,以及分布式资源管理调度平台YARN的文章请参考:
HDFS个人浅谈 : https://blog.csdn.net/weixin_35353187/article/details/82047892
MapReduce个人浅谈 : https://blog.csdn.net/weixin_35353187/article/details/82108388
YARN个人浅谈 : https://blog.csdn.net/weixin_35353187/article/details/82112174
Hadoop的各配置文件的配置以及参数的意义请参考文章 :
Hadoop的各个配置文件的配置 : https://blog.csdn.net/weixin_35353187/article/details/81780439