目录
大数据导论与Linux基础
Apache Hadoop、HDFS
MapReduce
MapReduce思想
MapReduce设计构思
MapReduce介绍
MapReduce官方实例
Map阶段执行流程
Reduce阶段执行流程
shuffle机制
YARN
YARN介绍
YARN架构、组件
程序提交YARN交互流程
YARN资源调度器Scheduler
MapReduce
MapReduce思想
-
MapRuduce的核心思想是“先分再合,分而治之”
-
Map表示第一阶段,负责“拆分”:即把复杂的任务分解为若干个“简单的子任务”来并行处理。可以拆分的前提是这些小问题之间没有依赖关系。
-
Reduce表示第二阶段,负责“合并”:即对map阶段的结果进行全局汇总
MapReduce设计构思
-
MapReduce借鉴了函数式语言中的思想,用Map和Reduce两个函数。
-
map:对一组数据元素进行某种重复式的处理
-
reduce:对Map的中间结果进行某种进一步的结果整理
-
-
MapReduce中定义了如下的Map和Reduce两个抽象的编程接口,由用户去编程实现:
-
map:(k1;v1)-->(k2;v2)
-
reduce:(k2;[v2])-->(k3;v3)
-
-
MapReduce处理的数据类型式键值对
-
程序员仅需关心其应用层面的具体计算问题,仅需编写少量的处理应用本身问题的业务程序代码。至于如何具体完成这个并行计算任务所相关的诸多系统层细节被隐藏起来,交给计算框架去处理
MapReduce介绍
-
分布式计算将应用分解成许多小的部分,分配给多台计算机进行处理。这样可以节约整体计算时间,大大提高计算效率
-
MapReduce是一种分布式计算框架
-
MapReduce特点
-
易于编程:MapReduce框架提供了用于二次开发的接口;简单地实现一些接口,就可以完成一个分布式程序,任务计算交给计算框架去处理。
-
良好的扩展性:当计算机资源得不到满足的时候,可以通过增加机器来扩展它的计算能力。
-
高容错性:Hadoop集群式分布式搭建和部署的,任何一个机器节点挂掉了,它可以把上面的计算任务转移到另一个节点上运行,不影响整个作业任务的完成,过程完全是由Hadoop内部完成的。
-
适合海量数据的离线处理:可以处理GB、TB和PB级别的数据量
-
-
MapReduce局限性(不适合的地方)
-
实时计算性能差:MapReduce主要用于离线作业,无法做到秒级或者亚秒级的数据响应
-
不能进行流式计算:流式计算的特点是数据是源源不断的,并且数据是动态的,而MapReduce作为一个离线计算框架,主要是针对静态数据集的,数据不能动态变化
-
-
一个完整的MapReduce程序在分布式运行时有三类
-
MapReduceAppMaster:负责整个MapReduce程序的过程调度及状态协调
-
MapTask:负责map阶段的整个数据处理流程
-
ReduceTask:负责reduce阶段的整个数据处理流程
-
-
阶段组成
-
一个MapReduce编程模型中只能包含一个Map阶段和一个Ruduce阶段,或者只有Map阶段
-
不能有多个map阶段,多个reduce阶段的情景出现
-
如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序串行运行
-
-
-
整个MapReduce程序中,数据都是以kv键值对的形式流转的
MapReduce官方实例
概述
-
一个最终完整版的MapReduce程序需要用户编写的代码和Hadoop自己实现的代码整合在一起才可以
-
其中用户负责map、reduce两个阶段的业务问题,Hadoop负责底层所有的技术问题
-
由于MapReduce计算引擎天生的弊端,企业中很少涉及到MapReduce直接编程
示例说明
-
示例程序路径:/export/server/hadoop-3.3.0/share/hadoop/mapreduce/
-
示例程序:hadoop-mapreduce-examples-3.3.0.jar
-
MapReduce程序提交命令:[hadoop jar|yarn jar] hadoop-mapreduce-examples-3.3.0.jar args…
-
提交到哪里去了?提交到YARN集群上分布式执行
评估圆周率PI的值
-
运行MapReduce程序评估一下圆周率的值,执行中可以去YARN页面上观察程序执行的情况
-
第一个参数:pi表示MapReduce程序执行圆周率计算任务
-
第二个参数:用于指定map阶段运行的任务task次数,并发度这里是10
-
第三个参数:用于指定每个map任务的取样的个数,这里是50.
[root@node1 mapreduce]# pwd
/export/server/hadoop-3.3.0/share/hadoop/mapreduce
[root@node1 mapreduce]# hadoop jar hadoop-mapreduce-examples-3.3.0.jar pi 10 50
wordcount单词词频统计
-
wordcount算是大数据计算领域经典的入门案例,相当于Hello World
-
wordcount编程思路:
-
map阶段的核心:把输入的数据经过切割,全部标为1,因此输出就是<单词,1>
-
shuffle阶段的核心:经过MapReduce程序内部自带默认的排序分组等功能,把key相同的单词会作为一组数据构成新的kv对
-
reduce阶段核心:处理shuffle完的一组数据,该组数据就是该单词所有的键值对。对所有的1进行累加求和,就是单词的总次数
-
-
-
word程序提交
-
上传上传课程资料中的文本文件1.txt到HDFS文件系统的/input目录下,如果没有这个目录,使用shell创建
-
hadoop fs -mkdir /input
-
hadoop fs -put 1.txt /input
-
-
执行官方MapReduce实例
-
第一个参数:wordcount表示执行单词统计任务
-
第二个参数:指定输入文件的路径
-
第三个参数:指定输出结果的路径(该路径不能已存在)
-
-
[root@node1 mapreduce]# pwd
/export/server/hadoop-3.3.0/share/hadoop/mapreduce
[root@node1 mapreduce]# hadoop jar hadoop-mapreduce-examples-3.3.0.jar wordcount
/input /output
-
wordcount执行结果
Map阶段执行流程
-
第一阶段:把输入目录下文件按照一定的标准逐个进行逻辑切片,形成切片规划。默认128M,每一个切片由一个MapTask处理
-
第二阶段:对切片中的数据按照一定的规则读取解析返回<key,value>对。默认是按行读取数据。key是每一行的起始位置偏移量,value是本行的文本内容
-
第三阶段:调用Mapper类中的map方法处理数据。每读取解析出来一个<key,value>,调用一次map方法
-
第四阶段:按照一定的规则对Map输出的键值对进行分区partition。默认不分区,因为只有一个reducetask。分区的数量就是reducetask运行的数量
-
第五阶段:Map输出数据写到内存缓冲区,达到比例溢出到磁盘上。溢出spill的时候根据key进行排序sort。默认根据key字典序排序
-
第六阶段:对所有溢出文件进行最终的merget合并,成为一个文件
Reduce阶段执行流程
-
第一阶段:ReduceTask会主动从MapTask复制拉取属于需要自己处理的数据
-
把拉取来的数据全部进行合并merge,即把分散的数据合并成一个大的数据,再对合并的数据进行排序
-
第三阶段:对排序后的键值对调用reduce方法。键相等的键值对调用一次reduce方法,最后把这些输出的键值对写入到HDFS文件中
shuffle机制
-
shuffle的本意是洗牌、混洗的意思,把一组有规则的数据尽量打乱成无规则的数据
-
在MapReduce中,shuffle更像是洗牌的逆过程,指的是把map端的无规则输出按指定的规则打乱成具有一定规则的数据,以便reduce端接收处理
-
一般把从map产生输出开始到reduce取得数据作为输入之前的过程称作shuffle
-
shuffle机制的弊端:
-
shuffle是MapReduce程序的核心与精髓,是MapReduce的灵魂所在
-
shuffle也是MapReduce被诟病最多的地方所在,MapReduce相较于spark、flink计算引擎慢的原因,跟shuffle机制也有很大的关系
-
shuffle频繁涉及到数据在内存、磁盘之间的多次往复
-
YARN
YARN介绍
-
YARN是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度
-
它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处
-
资源管理系统:集群的硬件资源,和内存运行相关,比如内存、CPU等。
-
调度平台:不仅仅支持MapReduce程序,理论上支持各种计算程序
-
可以把YARN理解为一个分布式的操作系统,而MapReduce等计算程序则相当于操作系统之上的应用程序,YARN为这些程序提供运算所需要的资源(内存、CPU)
-
Hadoop能有今天的地位,YARN功不可没。因为有了YARN,更多计算框架可以接入到HDFS中,而不单单是MapReduce,正是因为YARN的包容,使得其他计算框架能专注于计算性能的提升
-
HDFS可能不是最优秀的大数据存储系统,但却是应用最广泛的大数据存储系统,YARN功不可没。
YARN架构、组件
-
Client
-
Container容器(资源的抽象)
YARN三大组件
-
ResourceManager(RM):YARN集群中的主角色,决定系统中所有应用程序之间资源分配的最终权限,即最终仲裁者
-
NodeManager(NM):YARN中的从角色,一台机器上一个,负责管理本机器上的计算资源。根据RM命令,启动Container容器、监视Container容器的资源使用情况,并且向RM主角色汇报资源使用情况
-
ApplicationMaster(AM):用户提交的每个应用程序均包含一个AM。应用程序内的“老大”,负责程序内部各阶段的资源申请,监督程序的执行情况。
程序提交YARN交互流程
核心交互流程
-
MapReduce作业提交 Client-->RM
-
资源的申请 MapReduceAppMaster-->RM
-
MapReduce作业状态汇报
-
节点的状态汇报 NM-->RM
整体概述
当用户向YARN中提交一个应用程序后,YARN将分两个阶段运行该应用程序。
-
第一个阶段:客户端申请资源启动运行本次程序的AppMaster
-
第二个阶段:AppMaster根据本次程序内部具体情况,为它申请资源,并监控它的整个运行过程,直到运行完成
MapReduce提交YARN交互流程
-
用户通过客户端向YARN中的RM提交应用程序(比如hadoop jar提交MapReduce程序)
-
RM为该应用程序分配第一个Container容器,并与对应的NM通信,要求它在这个Container中启动这个应用程序的AppMaster
-
AppMaster启动成功之后,首先向RM注册并保持通信,这样用户可以直接通过RM查看应用程序的运行状态(处理了百分之几)
-
AM为本次程序内部的各个Task任务向RM申请资源,并监控它的运行状态
-
一旦AppMaster申请到资源后,便与对应的NM通信,要求它启动任务
-
NM为任务设置好运行环境之后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务
-
各个任务通过某个RPC协议向AppMaster汇报自己的状态和进度,以让AppMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可以随时通过RPC向AppMaster查询应用程序的当前运行状态
-
应用程序运行完成后AppMaster向RM注销并关闭自己
YARN资源调度器Scheduler
如何理解资源调度
-
在理想情况下,应用程序提出的请求将立即得到YARN批准。但是实际中,资源是有限的,并且在繁忙的集群上,应用程序通常将需要等待其某些请求得到满足。YARN调度程序的工作是根据一些定义的策略为应用程序分配资源
-
在YARN中,负责给应用分配资源的就是Scheduler,它是RM的核心组件之一。Scheduler完全专用于调度作业,它无法跟踪应用程序的状态
调度器策略
-
三种调度器
-
FIFO Scheduler(先进先出调度器)
-
Capacity Scheduler(容量调度器)
-
Fair Scheduler (公平调度器)
-
-
Apache版本YARN默认使用Capacity Scheduler
-
如果需要使用其他的调度器,可以在yarn-site.xml中的yarn.resourcemanager.scheduler.class进行配置。
FIFO Scheduler
-
优势:无需配置、先到先得、易于执行
-
坏处:任务的优先级不会变高,因此高优先级的任务也需要等待,不适合共享集群
Capacity Scheduler
-
层次化的队列设计:层次化的管理,可以更容易、更合理分配和限制资源的使用
-
容量保证:每个队列都可以设置一个资源的占比,保证每个队列都不会占用整个集群的资源
-
安全:每个队列由严格的访问控制。用户只能向自己的队列力提交任务,而且不能修改或者访问其他队列的任务
-
弹性分配:空闲的资源可以分配给任何队列。当多个队列出现争用的时候,则会按照权重比例进行平衡
Fair Scheduler
-
Fair Scheduler叫做公平调度。
-
如何理解公平共享
-
有两个用户A和B,每个用户都有自己的队列。
-
A启动一个作业,由于没有B的需求,它分配了集群所有可用的资源。
-
然后B在A的作业仍在运行时启动了一个作业,经过一段时间,A,B各自作业都使用了一半的资源。
-
现在,如果B用户在其他作业仍在运行时开始第二个作业,它将与B的另一个作业共享其资源,因此B的每个作业将拥有资源的四分之一,而A的继续将拥有一半的资源。结果是资源在用户之间公平地共享。
-
-
允许资源共享:即当一个应用运行时,如果其它队列没有任务执行,则可以使用其它队列,当其它队列有应用需要资源时再将占用的队列释放出来。所有的应用都从资源队列中分配资源。