一、Hadoop MapReduce介绍
1、设计构思
1)如何对付大数据处理场景
对相互间不具有计算依赖关系的大数据计算任务,实现并行最自然的办法就是采取MapReduce分而治之的策略。
不可拆分的计算任务或相互间有依赖关系的数据无法进行并行计算!
2)构建抽象编程模型
MapReduce借鉴了函数式语言中的思想,用Map和Reduce两个函数提供了高层的并行编程抽象模型。
- map: 对一组数据元素进行某种重复式的处理
- reduce: 对Map的中间结果进行某种进一步的结果整理
MapReduce处理的数据类型是<key,value>键值对。
3)统一架构、隐藏底层细节
程序员仅需要关心其应用层的具体计算问题,仅需编写少量的处理应用本身计算问题的业务程序代码。
2、分布式计算概念
分布式计算是一种计算方法,和集中式计算是相对的。
分布式计算将该应用分解成许多小的部分,分配给多台计算机进行处理。
3、MR介绍
Hadoop MapReduce是一个分布式计算框架,用于轻松编写分布式应用程序,这些应用程序以可靠,容错的方式并行处理大型硬件集群(数千个节点)上的大量数据(多TB数据集)
特点:易于编程、良好的扩展性、高容错性、适合海量数据的离线处理
局限性:实时计算性能差、不能进行流式计算(数据不能是动态的)
4、MR实例进程
MRAppMaster:负责整个MR程序的过程调度及状态协调
MapTask:负责map阶段的整个数据处理流程
ReduceTask:负责reduce阶段的整个数据处理流程
5、阶段组成
只能包含一个Map阶段和一个Reduce阶段,或者只有Map阶段
二、MapReduce执行流程
1、MapReduce整体执行流程图
2、Map阶段执行过程
- 把输入目录下文件按照一定的标准逐个进行逻辑切片,形成切片规划。
默认Split size = Block size(128M),每一个切片由一个MapTask处理。(getSplits) - 对切片中的数据按照一定的规则读取解析返回<key,value>对。默认是按行读取数据。key是每一行的起始位置偏移量,value是本行的文本内容。(TextInputFormat)
- 调用Mapper类中的map方法处理数据。每读取解析出来的一个<key,value> ,调用一次map方法。
- 按照一定的规则对Map输出的键值对进行分区partition。默认不分区,因为只有一个reducetask。分区的数量就是reducetask运行的数量。
- Map输出数据写入内存缓冲区,达到比例溢出到磁盘上。溢出spill的时候根据key进行排序sort。默认根据key字典序排序。
- 对所有溢出文件进行最终的merge合并,成为一个文件。
3、Reduce阶段执行流程
- ReduceTask会主动从MapTask复制拉取属于需要自己处理的数据。
- 把拉取来数据,全部进行合并merge,即把分散的数据合并成一个大的数据。再对合并后的数据排序。
- 对排序后的键值对调用reduce方法。键相等的键值对调用一次reduce方法。最后把这些输出的键值对写入到HDFS文件中。
三、Shuffle机制
1、Shuffle机制概述
在MapReduce中,指的是将map端的无规则输出按指定的规则“打乱”成具有一
定规则的数据,以便reduce端接收处理。
一般把从Map产生输出开始到Reduce取得数据作为输入之前的过程称作shuffle。
2、Map端Shuffle
Collect阶段:将MapTask的结果收集输出到默认大小为100M的环形缓冲区,保存之前会对key进行分区的计算,默认Hash分区。
Spill阶段:当内存中的数据量达到一定的阀值的时候,就会将数据写入本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了combiner,还会将有相同分区号和key的数据进行排序。
Merge阶段:把所有溢出的临时文件进行一次合并操作,以确保一个MapTask最终只产生一个中间数据文件。
3、Reducer端shuffle
Copy阶段: ReduceTask启动Fetcher线程到已经完成MapTask的节点上复制一份属于自己的数据。
Merge阶段:在ReduceTask远程复制数据的同时,会在后台开启两个线程对内存到本地的数据文件进行合并操作。
Sort阶段:在对数据进行合并的同时,会进行排序操作,由于MapTask阶段已经对数据进行了局部的排序,ReduceTask只需保证Copy的数据的最终整体有效性即可。
四、Hadoop YARN
1、YARN概述
YARN是一个通用资源管理系统和调度平台
- 资源管理系统:集群的硬件资源,和程序运行相关,比如内存、CPU等。
- 调度平台:多个程序同时申请计算资源如何分配,调度的规则(算法)。
- 通用:不仅仅支持MapReduce程序,理论上支持各种计算程序。YARN不关心你干什么,只关心你要资源,在有的情况下给你,用完之后还我。
可以把Hadoop YARN理解为相当于一个分布式的操作系统平台,而MapReduce等计算程序则相当于运行于操作系统之上的应用程序,YARN为这些程序提供运算所需的资源(内存、CPU等)
Hadoop能有今天这个地位,YARN可以说是功不可没。因为有了YARN ,更多计算框架可以接入到 HDFS中,而不单单是 MapReduce,正是因为YARN的包容,使得其他计算框架能专注于计算性能的提升。
2、YARN架构与组件
ResourceManager(RM):YARN集群中的主角色,决定系统中所有应用程序之间资源分配的最终权限,即最终仲裁者。接收用户的作业提交,并通过NM分配、管理各个机器上的计算资源。
NodeManager(NM):YARN中的从角色,一台机器上一个,负责管理本机器上的计算资源。根据RM命令,启动Container容器、监视容器的资源使用情况。并且向RM主角色汇报资源使用情况
ApplicationMaster(AM):用户提交的每个应用程序均包含一个AM。应用程序内的“老大”,负责程序内部各阶段的资源申请,监督程序的执行情况。
3、核心交互流程
MR作业提交 Client–>RM
资源的申请 MrAppMaster–>RM
MR作业状态汇报 Container(Map|Reduce Task)–>Container(MrAppMaster)
节点的状态汇报 NM–>RM
4、YARM交互整体概述
- 客户端申请资源启动运行本次程序的ApplicationMaster
- 由ApplicationMaster根据本次程序内部具体情况,为它申请资源,并监控它的整个运行过程,直到运行完成。
5、MR提交YARN交互流程
- 用户通过客户端向YARN中ResourceManager提交应用程序(比如hadoop jar提交MR程序)
- ResourceManager为该应用程序分配第一个Container(容器),并与对应的NodeManager通信,要求它在这个Container中启动这个应用程序的ApplicationMaster。
- ApplicationMaster启动成功之后,首先向ResourceManager注册并保持通信,这样用户可以直接通过ResourceManage查看应用程序的运行状态(处理了百分之几)
- AM为本次程序内部的各个Task任务向RM申请资源,并监控它的运行状态。
- 一旦 ApplicationMaster 申请到资源后,便与对应的 NodeManager 通信,要求它启动任务。
- NodeManager 为任务设置好运行环境后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。
- 各个任务通过某个 RPC 协议向 ApplicationMaster 汇报自己的状态和进度,以让 ApplicationMaster 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过RPC 向 ApplicationMaster 查询应用程序的当前运行状态。
- 应用程序运行完成后,ApplicationMaster 向 ResourceManager 注销并关闭自己。
五、YARN资源调度器Scheduler
1、资源调度概述
在理想情况下,应用程序提出的请求将立即得到YARN批准。但是实际中,资源是有限的,并且在繁忙的群集上,应用程序通常将需要等待其某些请求得到满足。
YARN调度程序的工作是根据一些定义的策略为应用程序分配资源。
2、调度器策略
1)FIFO Scheduler(先进先出调度器)
先进先出的思想,即先提交的应用先运行。
- 优势:无需配置、先到先得、易于执行
- 坏处:任务的优先级不会变高,因此高优先级的作业需要等待不适合共享集群
2)Capacity Scheduler(容量调度器)
允许多个组织共享整个集群资源,通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源。
- 特性优势:层次化的队列设计、容量、保证安全、弹性分配
3)Fair Scheduler(公平调度器)
提供了YARN应用程序公平地共享大型集群中资源的另一种方式。
公平调度可以在多个队列间工作,允许资源共享和抢占。
- 特性优势:分层队列、基于用户或组的队列映射、资源抢占、保证最小配额、允许资源共享、默认不限制每个队列和用户可以同时运行应用的数量