- MapReduce
- 分而治之思想
- 设计构思
- 官方示例
- 执行流程
- YARN
- 介绍
- 架构组件
- 程序提交交互流程
- 调度器
MapReduce
分而治之思想
- Map:第一阶段,负责”拆分”
- Reduce:第二阶段,负责合并
设计构思
(1)如何对付大数据处理场景->分而治之
(2)构建抽象编程模型:
- map:对一组数据元素进行某种重复式的处理
- reduce:对Map的中间结果进行某种进一步处理的结果
(3)统一架构、隐藏底层细节
介绍
分布式计算
MapReduce:分布式计算框架
优点
- 易于编程(提供了许多二次开发的接口)
- 良好的扩展性(可以随节点数目增长保持近似于线性的增长)
- 高容错性(故障转移)
- 适合海量数据的离线处理
局限性
- 实时计算性能差
- 不能进行流式计算(针对静态数据集)
MapReduce实例进程
一个完整的MapReduce程序在分布式运行时有三类
- MRAppMaster:负责整个MR程序的过程调度及状态协调
- MapTask:负责map阶段的整个数据处理流程
- RedeuceTask:负责reduce阶段的整个数据处理流程
阶段组成
一个MapReduce编程模型中只能包含一个Map阶段和一个Reduce阶段,或者只有Map阶段
如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序串行运行
数据类型
整个MapReduce编程中,数据都是以kv键值对的形式流转的
官方示例
示例程序路径:
1 | /export/server/hadoop-3.3.0/share/hadoop/mapreduce/s |
示例程序:
1 | hadoop-mapreduce-examples-3.3.0.jar |
MapReduce程序提交命令
1 | [hadoop jar|yarn jar] hadoop-mapreduce-examples-3.3.0.jar args... |
提交到哪里去?
提交到YARN集群上分布式执行
评估pi的值(Monte Carlo)
- 第一个参数:pi
- 第二个参数:指定map阶段运行的任务task次数,并发度
- 第三个参数:指定每个map任务取样的个数
WordCount概述
- map阶段的核心:把输入的数据经过切割,全部标记为1,因此输出就是<单词,1>
- shuffle阶段核心:经过MR程序内部自带默认的排序分组等功能,把key相同的单词会作为一个数据构成新的kv对
- reduce阶段核心:处理shuffle完的一组数据,该组数据就是该单词所有的键值对。对所有的1进行累加求和,就是单词的总次数
第一个参数:wordcount
第二个参数:/input 输入路径
第三个参数:/output输出路径(提前不存在)
执行流程
Map阶段执行过程
第一阶段:输入文件逻辑切片:
默认Split size = Block size(128M),每个切片由一个MapTask处理
第二阶段:对切片中的数据按照一定的规则读取解析返回kv对
默认是按行读取数据
第三阶段:调用Mapper类中的map方法处理数据
没读取解析出来的一个kv对,调用一次map方法
第四阶段:按照一定的规则对Map输出的键值对进行分区partition。默认不分区,因为只有一个reducetask。分区的数量就是reducetask运行的数量
第五阶段:Map输出数据写入内存缓冲区,达到比例溢出到磁盘上。溢出spill的时候根据key进行排序sort。默认根据key字典序排序
第六阶段:对所有溢出文件进行最终的merge合并,成为一个文件
Reduce阶段执行过程
- 第一阶段:ReduceTask会主动从MapTask复制拉取属于需要自己处理的数据
- 第二阶段:把拉取来数据,全部进行合并merge,即把分散的数据合并一个大的数据。再对合并后的数据排序
- 第三阶段:对排序后的键值对调用reduce方法。键相等的键值对调用一次reduce方法。最后把这些输出的键值对写入到HDFS文件中
shuffle机制
shuffle:将map端的无规则输出按指定的规则”打乱”成具有一定规则的数据,以便reduce端接收处理
一般把从Map产生输出开始到Reduce取得数据作为输入之前的过程称作shuffle
YARN
YARN(Yet Anoter Resource Negotaitar) 另一种资源协调者
一个通用资源管理系统和调度平台
- 资源管理系统:集群的硬件资源,和程序运行相关,比如内存、CPU等
- 调度平台:多个程序同时申请资源如何分配,调度算法
- 通用:不仅支持MapReduce程序,理论上支持各种计算程序
角色
YARN3大组件:
ResourceManager(RM)
YARN集群中的主角色,资源分配的最终权限,最终仲裁者
NodeManager(NM)
YARN中的从角色,负责管理本机器上的计算资源
根据RM命令。启动Container容器、监视容器的资源使用情况,并向RM汇报资源使用情况
ApplicationMaster(App Mstr)(AM)
用户提交的每个应用程序均包含一个AM
应用程序内的”老大”,负责程序内部各阶段的资源申请,监督程序的执行情况
例如:MRApplicationMaster->MapReduce程序 AM
- Client
- Containe容器(资源的抽象)
核心交互流程
- MR作业提交 Client->RM
- 资源的申请 MRAppMaster->RM
- MR作业状态汇报 Container(Map|Reduce Task)->Container(MrAppMaster)
- 节点的状态汇报 NM->RM
整体概述
- 第一阶段:客户端申请资源启动运行本次程序的ApplicationMaster
- 第二阶段:由ApplicationMaster根据本次程序内部具体情况,为它申请资源,并监控它的整个运行过程,直到运行完成
MR提交YARN交互流程
用户通过客户端向YARN中RM提交应用程序(比如hadoop jar)
RM为该应用程序分配第一个Container,并与对应的NM通信,要求它在这个Container中启动这个应用程序的AM
- AM启动成功后,首先向RM注册并保持通信,这样用户可直接通过RM查看应用程序的运行状态
- AM为本次程序内部各个Task任务向RM申请资源,并监控它的运行状态
- 一旦AM申请到资源后,便于对应的NM通信,要求启动任务
- NM为任务设置后运行环境后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务
- 各个任务通过某个RPC协议向AM汇报自己的状态和进度,已让AM随时掌握各个任务的运行状态,从而可以在任务失败时重启任务。在应用程序运行过程中,用户可随时通过RPC向AM查询应用程序的当前运行状态
- 应用程序运行完成后,AM向RM注销并关闭自己
资源调度器Scheduler
Scheduler:根据一些定义的策略为应用程序分配资源,是RM的核心组件之一
调度器策略:
(yarn-site.xml->yarn.resourcemanager.scheduler.class)
- FIFO
- Capacity(default)
- Fair