MapReduce定义
MapReduce是一种分布式计算框架,由Google公司2004年首次提出,并贡献给Apache基金会。
MR版本
- MapReduce 1.0,Hadoop早期版本(只支持MR模型)
- MapReduce 2.0,Hadoop 2.X版本(引入了YARN资源调度框架后,除了支持MR,还支持其他计算模型
MR V1 执行流程
- JobTracker一直在等待JobClient提交作业;
- TaskTracker每隔3秒向 JobTracker发送心跳heartbeat询问有没有任务可做,如果有,让其派发任务给它执行;
- 这是一道pull过程: slave主动向master拉生意;
MR v2 vs MR v1 流程
MR v2运行机制的改进,启动了YARN
- 增加了ResourceManager、NodeManager;
- ResourceManager(RM), 包含:ApplicationManager、ResourceScheduler两种功能;即把应用管理和资源调度分开;
- NodeManager(NM)负责节点的运行,当收到任务时,启动Container完成(map或reduce)任务;
- ResourceManager对应于v1的JobTracker;
- NodeManager对应于v1的TaskTracker
MR V2 执行流程
- 用户向YARN中提交应用程序,其中包括MR App Mstr程序、启动ApplicationMaster的命令、数据等。
- ResourceManager为该应用程序分配第一个Container,并与对应的NodeManager通信,要求它在这个Container中启动应用程序的ApplicationMaster。
- ApplicationMaster首先向ResourceManager注册,这样,用户可以直接通过ResourceManager查看应用程序的运行状态,然后,它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7
- ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请和领取资源。
- 一旦ApplicationMaster申请到资源后,则与对应的NodeManager通信,要求其启动任务。
- NodeManager为任务设置好运行环境(包括环境变量、jar包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务
- 各个任务通过某个RPC 协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过RPC 向ApplicationMaster 查询应用程序的当前运行状态。
- 应用程序运行完成后,ApplicationMaster 向ResourceManager 注销并关闭自己。
Resource Container, 资源容器
1)是集群节点将自身内存、CPU、磁盘等资源封装在一
起的抽象概念;
2)调度器根据应用的资源需求和集群各个节点的资源容
器进行调度;
3)RM的应用管理器负责接收作业,协商获取第一个资源
容器用于执行应用的任务主体并为重启失败的应用主体分
配容器;
4)DN节点的应用主体负责通过协商从调度器获取资源容
器,并跟踪这些容器的状态和应用执行的情况
Mapper任务流程
① 读取输入文件,解析成key、value对。对输入文件的每
一行(k1,v1),解析成多个key、value对(k2,v2)。每
个(k1、v1)键值对调用一次map函数;
② 写代码逻辑将输入的k1、v1处理成新的k2、v2输出;
③ 对输出的k2、v2进行分区(如果不指定默认1个分区,
分区号为0);
④ 对不同分区的数据,按照k2进行排序、分组。相同k2的
v2放到集合v2’
={v21
,v22
,v23
,…v2n}中;
⑤ (可选)分组后的数据进行归约(combiner);
⑥ Mapper的结果写入本地磁盘
Reducer任务流程
① 对多个map任务的输出,按照不同的分区,通过网络
复制到不同的reduce节点(取map端的结果数据);
② 一个Reduce任务处理一个分区数据;
③ 对属于当前分区的多个map任务的输出结果进行合并
、排序。写reduce函数的代码,对输入的k2,v2’处理
,转换成新的k3、v3输出;
④ 把reduce的输出保存到文件中。文件名为 part-r- 0000N
MapReduce核心概念
- 不同的Map任务之间不会进行通信
- 不同的Reduce任务之间也不会发生任何信息交换
- 用户不能显式地从一台机器向另一台机器发送消息
- 所有的数据交换都是通过MapReduce框架自身去实现的
文件输入格式InputFormat
定义了数据文件如何分割和读取。InputFile提供了以下一些功能
- 选择文件或者其它对象,用来作为输入
- 定义InputSplits, 将一个文件分为不同任务
- 为RecordReader提供一个工厂,用来读取这个文件
例如:有一个抽象的类FileInputFormat,
FileInputFormat从这个目录中读取
所有文件,然后FileInputFormat将
这些文件分割为多个InputSplits。
输入数据分块InputSplits
InputSplit定义了输入到单个Map任务的输入数据
- 一个MapReduce程序被统称为一个Job,可能有上百个任务构成
- InputSplit将文件分为128MB的大小
数据记录读入RecordReader
InputSplit定义了一个数据分块,但是没有定义如何读取数据记录。RecordReader实际上定义了如何将数据记录转化为一个(key,value)对的详细方法,并将数据记录传给Mapper类。
例如:TextInputFormat提供了
LineRecordReader,读入一个文
本行数据记录
Mapper
每一个Mapper类的实例生成了一
个Java进程,负责处理某一个
InputSplit上的数据
- V1中,有两个额外参数OutputCollector以及Reporter,前者收集中间结果,后者获得环境参数以及设当前执行的状态。
- 现在的版本V2用Context提供给每一个Mapper函数,用来提供上面两个对象的功能
Combiner
对Map端的输出进行合并,即合并相同key的键值对,以便
减少partitioner数据通信开销。
可以不用指定;如果指定合并类,其性质类似于本地执行
的一个Reducer,满足一定的条件才能够执行
Partitioner & Shuffle&Sort
-
Partitioner & Shuffle
在Map工作完成之后,每一个 Map函数的结果会被传输到对
应Reducer所在的节点,此时用户可以提供一个Partitioner
类,用来决定一个给定的(key,value)对传给哪个节点。 -
Sort
传输到每一个Reducer节点上的、将被所有的Reduce函数接
收到的Key,value对会被Hadoop自动排序(即Map生成的结
果传送到某一个节点的时候,会被自动排序)
Shuffle
Shuffle过程就是从map端输出到reduce端输入之间的过程;是Hadoop中最核心的部分!!!
Shuffle的Map端
- 在Map任务全部结束之前进行归并
- 归并得到大的文件放在本地磁盘
- 文件归并时,如果溢写文件数量大于预定值(默认是3)则可以再次启动Combiner,少于3不需要
- JobTracker会一直监测Map任务的执行,并通知Reduce任务来领取数据
Shuffle的Reduce端
- Reduce任务通过RPC向JobTracker询问Map任务是否已经完成,若完成,则领取数据
- Reduce领取数据先放入缓存,来自不同Map机器,先归并,再合并写入磁盘
- 多个溢写文件归并成一个或多个大文件,文件中的键值对是排序的
- 当数据很少时,不需要溢写到磁盘,直接在缓存中归并,然后输出给Reduce
Reducer
做用户定义的Reduce操作。
编程接口是Context。
一个分区对应一个Reducer。
每个分区对应一个输出文件 part-r-0000X。
文件输出格式OutputFormat
写入到HDFS的所有OutputFormat
都继承自FileOutputFormat
。 每一个Reducer都写一个文件到一
个共同的输出目录,文件名是part- nnnnn,其中nnnnn是与每一个
reducer相关的一个号(partition id)
MapReduce-任务执行总结
- 提交作业
- 初始化作业
- 分配任务
- 执行任务
- 更新任务执行进度和状态
推测式执行(speculative) –如果某个节点的任务执行过慢,会启动备份任务
YARN定义
YARN 是Hadoop 2.0 中的资源管理系统
,它是一个通用的资源管理模块,可为
各类应用程序进行资源管理和调度。
YARN三大组件
- ResourceManager –处理客户端请求
- 启动/监控ApplicationMaster
- 监控NodeManager
- 资源分配与调度
- NodeManager –单个节点上的资源管理
- 处理来自ResourceManager的命令
- 处理来自ApplicationMaster的命令
- ApplicationMaster
- 数据切分
- 为应用程序申请资源,并分配给内部任务
- 任务监控与容错
YARN资源调度器
- FIFO,先进先出调度器
- Fair Scheduler,公平调度器
- Capacity Scheduler,容量调度器