5.YARN

教程 阿布都的都 ⋅ 于 2023-01-06 18:01:28 ⋅ 1264 阅读

1 yarn 是什么?

​ yarn是下一代MapReduce,即MRv2,是在第一代MapReduce基础上演变而来的,主要是为了解决原始Hadoop扩展性较差,不支持多计算框架而提出的,通俗讲是跑任务的。

其核心思想:将MR1中资源管理和作业调用两个功能分开,分别由ResourceManager和ApplicationMaster进程来实现。

1)ResourceManager:负责整个集群的资源管理和调度;

2)ApplicationMaster:负责应用程序相关事务,比如任务调度、任务监控和容错等。

2 为什么要使用 yarn?

2.1 MR1 架构

file

其中:

1)JobClient

​ 用户编写的 MapReduce 程序通过 JobClient 提交给 JobTracker。

2)JobTracker

​ 主要负责资源调度和作业监控,并且监控所有 TaskTracker 与作业的健康情况,一旦有失败情况发生,就会将相应的任务分配到其他结点上去执行。

3)TaskTracker

​ 会周期性地将本结点的资源使用情况和任务进度汇报给 JobTracker,与此同时会接收 JobTracker 发送过来的命令并执行操作。

4)Task

​ 分为 Map Task 和 Reduce Task 两种,由 TaskTracker 启动,分别执行 Map 和 Reduce 任务。一般来讲,每个结点可以运行多个 Map 和 Reduce 任务。

2.2 MR1 框架不足

1)JobTracker是集群事务的集中处理点,存在单点故障。

2)JobTracker 即要做资源管理,又要做任务调度。导致JobTracker任务多时内存开销大,集群上限4000节点。

3)资源划分不合理,强制划分 MapSlot 和 ReduceSlot, 不能混用,容易操作资源利用不足。

4)不支持其他计算框架。

2.3 YARN优势

1)YARN通过将资源管理和应用程序管理两部分分剥离开,分别由ResouceManager和ApplicationMaster负责。

2)YARN具有向后兼容性,用户在MRv1上运行的作业,无需任何修改即可运行在YARN之上。

3)YARN支持多种计算框架,比如 mapreduce、spark、flink。

4)框架升级更容易,框架不需要部署到集群的各个结点,而是被封装成一个用户程序库(lib)存放在客户端,当需要对计算框架进行升级时,只需升级用户程序库即可。

3 yarn的基本组成结构

yarn 也是 master/ slave 结构。

yarn 主要由ResourceManager、NodeManager、ApplicationMaster、Container、Scheduler 等几个组件构成。

file

ResourceManager(RM)
RM是一个全局的资源管理器,负责整个系统的资源管理和分配。它主要由两个组件构成:调度器(Scheduler)和应用程序管理器(Applications Manager,ASM),通俗讲是用于管理NodeManager节点的资源,包括cup、内存等。
**
Scheduler(调度器)
调度器根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序;在资源紧张的情况下,可以kill掉优先级低的,来运行优先级高的任务。
Applications Manager(应用程序管理器) 负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动ApplicationMaster、监控ApplicationMaster运行状态并在失败时重新启动它等。
ApplicationMaster(AM)
ApplicationMaster 管理在YARN内运行的每个应用程序实例。每个应用程序对应一个ApplicationMaster。ApplicationMaster 负责协调来自 ResourceManager 的资源,并通过 NodeManager 监视容器的执行和资源使用(CPU、内存等的资源分配),通俗讲是管理发起的任务,随着任务创建而创建,任务的完成而结束。
NodeManager(NM)
NM是每个节点上的资源和任务管理器,一方面,它会定时地向RM汇报本节点上的资源使用情况和各个Container的运行状态;另一方面,它接收并处理来自AM的Container启动/停止等各种请求。
Container**
Container是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源时,RM为AM返回的资源便是用Container表示的。YARN会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源。

4 yarn提交任务的过程

file

1)用户向YARN中提交应用程序。
2)ResourceManager为该应用程序分配第一个Container,要求它在这个Container中启动应用程序的ApplicationMaster。
3)ApplicationMaster首先向ResourceManager注册,目的是让用户可以直接通过ResourceManager查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束。
4)ApplicationMaster向ResourceManager 的 scheduler申请和领取资源(通过RPC协议)。

5)ApplicationMaster申请到资源后,便与对应的NodeManager通信,要求它启动任务。
6)NodeManager启动任务。
7)各个任务向ApplicationMaster汇报自己的状态和进度(通过RPC协议),以便让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。

8)应用程序运行完成后,ApplicationMaster向ResourceManager注销并关闭自己。

file

file

#先启动zookeeper
./ssh_all_zookeeper.sh /usr/local/zookeeper/bin/zkServer.sh start
#启动hdfs
start-dfs.sh
#在nn1上启动yarn
start-yarn.sh
#查看各节点的进程信息是否有resourceManager和nodemanager
./ssh_all.sh jps

file

http://nn1.hadoop:8088 看到yarn的主页面(这里是真实的集群环境不是虚拟机)

file
7 yarn的HA及HA配置7.1 启动yarnHA

#在nn2上再启动一个yarn
yarn-daemon.sh start resourcemanager

file

file
查看ZK/usr/local/zookeeper/bin/zkCli.sh -server nn1.hadoop:2181,nn2.hadoop:2181,s1.hadoop:2181

file

file

file

file

file

8 在yarn上运行一个应用

#启动HDFS
start-dfs.sh 
#启动yarn
start-yarn.sh

find /usr/local/hadoop/share/ -name "examp" 在/usr/local/hadoop/share/下查找包含examp的文件,找到mapreduce的例子。

file

2)运行hadoop jar 命令 执行MapReduce 任务 hadoop jar命令调用的java类地址

file
运行命令格式:

#hadoop jar 短命令格式
hadoop jar 要执行的jar包 要执行的任务名 输入目录 输出目录
#hadoop jar 长命令格式
hadoop jar 要执行的jar包 要执行的类全名 [要执行的任务名] 输入目录 输出目录

file

file

file
任务目录规划:在hdfs上的输入目录:/user/hadoop/input
输入目录下会有任务运行时需要的文件

运行任务后,输出的目录:/user/hadoop/output
该目录,在任务运行时不能存在,如果存在报该目录已存在错误。
1)准备测试文件

#在HDFS上创建/user/hadoop/input/目录,
hadoop fs -mkdir -p /user/hadoop/input/ 
#生成一个测试文件
#编辑测试文件内容,用于统计
#把测试文件上传到刚才在HDFS上创建的目录

注意:不要创建MapReduce 任务的输出目录,否则会报输出目录已存在的错误。

输入:
f1文件内容one world one dreamone piece
输出类似下面的结果:dream 1one 3piece 1world 1
**
执行Wordcount任务:**hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount /user/hadoop/input /user/hadoop/output

file

file

file

5)查看任务执行日志

#启动yarn日志代理服务
yarn-daemon.sh start proxyserver
#启动 MR 的jobhistory服务
mr-jobhistory-daemon.sh start historyserver 

file
6)如何结束任务

file

7)如何再次运行MapReduce任务删除hdfs上任务的输出目录再上传要执行的输入数据执行MapReduce任务

file

有两个任务,第一个是任务需要大量资源;第二个需要少量资源,但是紧急重要任务,此时第二个需要等待第一个执行完,才能执行第二个。弊端:由于顺序执行任务,如果第一个是大量资源,后续任务需要等待。没有做到资源共享。
2)容量调度策略:

file

属于共享调度策略。将集群资源,给队列分配部分资源,每个队列互不干涉弊端:某个队列突然来个大的任务,那这个大的任务不会占用其他队列资源,执行时间长,效率低。
默认时,不会占用其他队列的资源(不是弹性队列);当配置弹性队列,A队列需要很大的资源运行任务的时候,会占用其他队列的资源,这个是可以配置的。
什么时候可以占用其他队列的资源?当其他队列资源空闲的时候(没有任务运行),就可以占用,运行完成后,就还回。
3)公平调度策略:

file

队列间可以互相共享资源,如果权重高的任务来了,权重低的任务会分给权重高的任务部分资源,必要时,可kill掉权重低的任务。
Steady Fair Share(稳定的公平份额):** 是Yarn根据每个队列的minShare、maxShare和weight的配置计算得到的理论上应该分配给这个队列的最大资源,它与这个队列当前是否有app正在运行无关,只和我们在fair-scheduler.xml中的配置有关。

Instantaneous Fair Share(瞬时的公平份额) 指的是实时动态分配的资源,它的值是随着集群资源的变动而实时变动的。
如果集群中有队列从active变为inactive,那么剩余这些队列瓜分到的instaneous fair shared都会随之变大,反之,如果有一个队列从inactive变为active,则剩余每个队列的instaneous fair share会随之变小,即instaneous fair share会变小。

**
9.1.2 配置公平调度策略**启用公平调度策略,配置属性yarn.resourcemanager.scheduler.class

    <property>
        <name>yarn.resourcemanager.scheduler.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
        <description>公平调度器</description>
    </property>

队列配置,需要配置属性yarn.scheduler.fair.allocation.file

    <property>
        <name>yarn.scheduler.fair.allocation.file</name>
        <value>fair-scheduler.xml</value>
        <description>自定义XML配置文件所在位置,该文件主要用于描述各个队列的属性,比如资源量、权重等</description>
    </property>

并在fair-scheduler.xml 文件中配置队列、用户、以及匹配规则等。
9.1.3 抢占 公平调度器支持抢占功能。 所谓抢占,就是允许调度器终止那些占用资源超过了其公平份额的队列的容器,这些容器资源释放后可以分配给资源数量低于应得份额的队列。 注意,抢占会降低整个集群的效率,因为被终止的containers 需要重新执行。

启用抢占,配置yarn-site.xml 的 yarn.scheduler.fair.preemption 属性

    <property>
        <name>yarn.scheduler.fair.preemption</name>
        <value>true</value>
        <description>是否支持抢占</description>
    </property>

两个相关抢占超时设置在fair-scheduler.xml 文件中配置,为所有队列设置默认的超时时间

    <!--  一个队列在该时间内获得的资源仍然低于其共享份额的一半,那么调度器会抢占其他容器,以秒计算 -->
    <fairSharePreemptionTimeout>60</fairSharePreemptionTimeout>
    <!--  一个队列在该时间内未获得被承诺的最小共享资源,那么调度器会抢占其他容器,以秒计算 -->
    <defaultMinSharePreemptionTimeout>60</defaultMinSharePreemptionTimeout>

9.2 yarn调度器的修改修改配置的时候,在active状态的resourcemanager机器上修改fair-scheduler.xml 才生效。tail -f yarn-hadoop-resourcemanager-nn1.hadoop.log 检测日志

file
vim fair-scheduler.xml 修改配置,支持热加载模式,在服务运行的情况下,修改配置文件并使修改的配置生效。

file

检测日志查看自动加载过程tail -f yarn-hadoop-resourcemanager-nn1.hadoop.log

file

file

10 启动一个完整的集群所有都是Hadoop用户启动启动完整集群的步骤

#启动完整集群的步骤
#第一步:启动zookeeper
./ssh_all_zookeeper.sh /usr/local/zookeeper/bin/zkServer.sh start
#第二步:在nn1上启动所有
start-all.sh
#第三步:在nn1上启动yarn日志代理服务
yarn-daemon.sh start proxyserver
#第四步:在nn1上启动MR的jobhistory服务
mr-jobhistory-daemon.sh start historyserver 
#第五步:在nn2上启动resourcemanager,用于启动yarn的HA
yarn-daemon.sh start resourcemanager

file

停止集群的步骤:

#第一步:在nn1上,停止所有
stop-all.sh
#第二步:在nn1上,停止MR的jobhistory服务
mr-jobhistory-daemon.sh stop historyserver 
#第三步:在nn2上,停止resourcemanager,用于停止yarn的HA
yarn-daemon.sh stop resourcemanager
#第四步:停止zookeeper
./ssh_all_zookeeper.sh /usr/local/zookeeper/bin/zkServer.sh stop

注意:在执行stop-all.sh 时,不会停止yarn的HA、historyserver、zookeeper。historyserver不会停止因为它是mapreducer程序使用的,所以hadoop全部停止时不会去操作。

版权声明:原创作品,允许转载,转载时务必以超链接的形式表明出处和作者信息。否则将追究法律责任。来自海汼部落-阿布都的都,http://hainiubl.com/topics/76042
成为第一个点赞的人吧 :bowtie:
回复数量: 0
    暂无评论~~
    • 请注意单词拼写,以及中英文排版,参考此页
    • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
    • 支持表情,可用Emoji的自动补全, 在输入的时候只需要 ":" 就可以自动提示了 :metal: :point_right: 表情列表 :star: :sparkles:
    • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif,教程
    • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
    Ctrl+Enter