MapReduce
什么是MapReduce(分布式计算系统)?
mapreduce是一种分布式运算程序的编程模型,用于大规模数据集(大于1TB)的并行运算。必须构建在hdfs之上,一种大数据离线计算框架
概念
MR有两个阶段组成:Map和Reduce,用户只需实现map()和reduce()两个函数,即可实现分布式计算。
map–>映射(key value)
reduce–>归纳
核心功能
核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的 分布式运算程序,并发运行在一个 hadoop 集群上
为什么需要mapreduce ?
(1) 海量数据在单机上处理因为硬件资源限制,无法胜任
(2) 而一旦将单机版程序扩展到集群来分布式运行,将极大增加程序的复杂度和开发难度
(3) 引入 MapReduce 框架后,开发人员可以将绝大部分工作集中在业务逻辑的开发上,而将 分布式计算中的复杂性交由框架来处理
mapreduce程序运行实例
在 MapReduce 组件里, 非常有名的就是 wordcount 和 pi 程序这是官方提供。这些 MapReduce 程序的代码都在 hadoop-mapreduce-examples-2.6.4.jar 包里, 这 个 jar 包在 hadoop 安装目录下的/share/hadoop/mapreduce/目录里
MapReduce架构
MapReduce1.x
JobTracker与namenode的区别
计算任务找JobTracker
存储任务找namenode
JobTracker
接受客户端的mr任务
选择一个资源丰富的,执行对应的任务
并且给这个任务分配资源
与TaskTracker保持心跳,接受汇报信息
TaskTracker
保持心跳,汇报资源
当前机器内存,当前机器任务数
当分配资源之后,开始在本机分配对应的资源给Task
并且实时监控任务的执行,并汇报
Slot(槽)
属于JobTracker分配的资源
计算能力,IO能力…
不管任务大小,资源是恒定的,不灵活但是好管理
Task(MapTask–ReduceTask)
task分成maptask 和reducetask
开始按照MR的流程执行业务
当任务完成时,JobTracker告诉TaskTracker回收资源
缺点:
单点故障(jobTracker只有一个)
内存扩展
业务瓶颈
只能执行MR的操作
如果其他框架需要运行在Hadoop上,需要独立开发自己的资源调度框架
MapReduce2.x
2.x开始使用Yarn(Yet Another Resource Negotiator,另一种资源协调者)统一管理资源
以后其他的计算框架可以直接访问yarn获取当前集群的空闲节点
Container(容器)
2.x资源的代名词
Container动态分配的
ResourceManager
资源协调框架的管理者
分为主节点和备用节点(防止单点故障)
主备的切换基于Zookeeper进行管理
时刻与NodeManager保持心跳,接受NodeManager的汇报
NodeManager汇报当前节点的资源情况
当有外部框架要使用资源的时候直接访问ResourceManager即可
如果有MR任务,先去ResourceManager申请资源,ResourceManager根据汇报相对灵活分配资源
资源在NodeManager1,NodeManager1要负责开辟资源
资源协调框架的管理者
分为主节点和备用节点(防止单点故障)
主备的切换基于Zookeeper进行管理
时刻与NodeManager保持心跳,接受NodeManager的汇报
NodeManager汇报当前节点的资源情况
当有外部框架要使用资源的时候直接访问ResourceManager即可
如果有MR任务,先去ResourceManager申请资源,ResourceManager根据汇报相对灵活分配资源
资源在NodeManager1,NodeManager1要负责开辟资源
NodeManager
Yet Another Resource Negotiator(另一种资源协调者)
资源协调框架的执行者
每一个DataNode上默认有一个NodeManager
NodeManager汇报自己的信息到ResourceManag
ApplicationMaster
我们本次JOB任务的主导者
负责调度本次被分配的资源Container
当所有的节点任务全部完成,application告诉ResourceManager请求杀死当前ApplicationMaster线程
本次任务所有的资源都会被释放
MR的计算流程
MapTask
https://www.edrawsoft.cn/viewer/public/s/max/eacdf644540127
1. map task读取HDFS文件。每个block(128M),启动一个map task。每个map task按照行读取一个block中的内容,对每一行执行map函数
2. map函数对输入的数据(block—>split)进行拆分,拆分成一个个键值对<a, 1> <b,1>
3.再利用环形数据缓冲区去像硬盘传递数据(溢写Spill)
4.在溢写过程中先分区(Partation)再排序(Sort),每个分区对应1个reduce task
4.对每个分区中的数据,按照key进行分组并排序(相同分区在一起,相同Key的在一起)
在map段执行合并Merge合并成一个有序的大文件(分区0 分区1…)
reduceTask
https://www.edrawsoft.cn/viewer/public/s/max/b7ed5235951037
0. 将Map的临时结果拉取 Fetch到 Reduce节点
1.每个分区对应一个reduce task,这个reduce task会读取相同分区的map输出;reduce task对接收到的所有map输出,进行排序分组<a,{0}><b,{0}>…
2.执行reduce 操作,对一个分组中的value进行累加<c,1><a,0><b,0>
3.每个分区输出到一个HDFS文件中 part 0 part 1 …
.每个分区对应一个reduce task,这个reduce task会读取相同分区的map输出;reduce task对接收到的所有map输出,进行排序分组<a,{0}><b,{0}>…
2.执行reduce 操作,对一个分组中的value进行累加<c,1><a,0><b,0>
3.每个分区输出到一个HDFS文件中 part 0 part 1 …