前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >hadoop之yarn调度

hadoop之yarn调度

作者头像
SRE运维实践
发布2021-03-04 10:24:04
6710
发布2021-03-04 10:24:04
举报
文章被收录于专栏:SRE运维实践

序言

在大数据的生态中,hdfs解决了海量数据的存储问题,mapreduce解决了海量数据的计算问题,而在任务的执行和资源统一管理层面,则是使用yarn进行统一调度。

yarn:yet another resouce negotiator,另外一种资源调度器。

yarn

1 为什么会有yarn

hadoop经历了两个大的架构,在1.X版本中,核心只有hdfs和MapReduce,这个里面MapReduce既承担了海量数据的计算问题,而且需要负责相关的任务调度,资源分配,监控恢复任务,成为一个性能瓶颈,在2.X架构中,将MapReduce进行了一个分拆,MapReduce仅仅负责计算问题,而抽取出来的yarn,则作为资源的分配,调度,任务的生命周期管理。

2 yarn架构图(官方文档截取)

Resource Manager:简称RM,资源管理器,负责管理应用程序application的全局计算资源的分配,接收来自客户端的请求,和Node Manager进行通信,检查节点的健康状态,启动调度Application Master。

Application Master:简称AM,管理应用程序的调度和协调,每个应用程序一个,也可以叫做MRAppMaster。

Application:一个MapReduce作业或者是DAG的多个jobs。

NodeManager:运行在每个节点中,简称为NM,节点管理器,主要和RM进行通信,并和ApplicationMaster一起执行和监控任务,监控container容器的资源使用情况。

Container:表示分配的一组包括CPU,内存,网络,磁盘资源的容器。

在RM中,包含两个主要的组件,一个是schedule调度组件,一个是applicationsmanager应用程序管理组件。

3 高可用架构

搭建集群的时候,总是需要高可用架构的,对于RM来说,主要是HA的形式,一个状态是Active,一个状态是Standby,对于NM来说,主要分布式节点,一般的部署方式是对于HDFS的数据节点DataNode,那么就可以部署为Node Manager节点。

在查看RM状态的时候,可以使用如下的命令:

代码语言:javascript
复制
//查看RM的状态,是主还是备
[root@KEL2 logs]# yarn rmadmin -getServiceState rm1
active
[root@KEL2 logs]# yarn rmadmin -getServiceState rm2
standby
//查看Node Manager的节点
[root@KEL2 logs]# yarn node -list
Total Nodes:3
         Node-Id       Node-State  Node-Http-Address  Number-of-Running-Containers
      KEL2:40768          RUNNING          KEL2:8042                             0
      KEL1:36635          RUNNING          KEL1:8042                             0
       KEL:33262          RUNNING           KEL:8042                             0
//查看当前正在运行的应用程序
[root@KEL2 logs]# yarn application -list
Total number of applications (application-types: [] and states: [SUBMITTED, ACCEPTED, RUNNING]):0
                Application-Id      Application-Name      Application-Type        User       Queue               State         Final-State         Progress                         Tracking-URL
//查看当前尝试运行的应用程序
[root@KEL2 logs]# yarn applicationattempt -list
Missing argument for options
usage: applicationattempt
 -help                              Displays help for all commands.
 -list <Application ID>             List application attempts for
                                    aplication.
 -status <Application Attempt ID>   Prints the status of the application
                                    attempt.
//查看某个尝试运行的应用程序的容器列表
[root@KEL2 logs]# yarn container -list
Missing argument for options
usage: container
 -help                            Displays help for all commands.
 -list <Application Attempt ID>   List containers for application attempt.
 -status <Container ID>           Prints the status of the container.

分别查看RM和NodeManager的监听端口:

代码语言:javascript
复制
[root@KEL2 logs]# jps
2292 QuorumPeerMain
2660 NodeManager
8676 ResourceManager
8807 Jps
2425 JournalNode
2348 DataNode
//查看ResourceManager的监听端口
[root@KEL2 logs]# netstat -tnlp|grep 8676
tcp6       0      0 192.168.1.199:8088      :::*                    LISTEN      8676/java           
tcp6       0      0 192.168.1.199:8033      :::*                    LISTEN      8676/java           
//查看NodeManager的监听端口
[root@KEL2 logs]# netstat -tnlp|grep 2660
tcp6       0      0 :::8040                 :::*                    LISTEN      2660/java           
tcp6       0      0 :::8042                 :::*                    LISTEN      2660/java           
tcp6       0      0 :::13562                :::*                    LISTEN      2660/java           
tcp6       0      0 :::40768                :::*                    LISTEN      2660/java           
//主机状态为备
[root@KEL2 logs]# yarn rmadmin -getServiceState rm1
standby
-----查看主机-----
[root@KEL1 hadoop]# jps
8192 Jps
2292 QuorumPeerMain
2455 DataNode
2535 JournalNode
2648 DFSZKFailoverController
6648 NameNode
2783 NodeManager
7759 ResourceManager
[root@KEL1 hadoop]# netstat -ntlp|grep 7759
tcp6       0      0 192.168.1.99:8088       :::*                    LISTEN      7759/java           
tcp6       0      0 192.168.1.99:8030       :::*                    LISTEN      7759/java           
tcp6       0      0 192.168.1.99:8031       :::*                    LISTEN      7759/java           
tcp6       0      0 192.168.1.99:8032       :::*                    LISTEN      7759/java           
tcp6       0      0 192.168.1.99:8033       :::*                    LISTEN      7759/java           
[root@KEL1 hadoop]# netstat -tnlp|grep 2783
tcp6       0      0 :::8040                 :::*                    LISTEN      2783/java           
tcp6       0      0 :::8042                 :::*                    LISTEN      2783/java           
tcp6       0      0 :::13562                :::*                    LISTEN      2783/java           
tcp6       0      0 :::36635                :::*                    LISTEN      2783/java           
[root@KEL1 hadoop]# yarn rmadmin -getServiceState rm2
active
//可以看到standby的resourcemanager节点上的监听端口很少。

HA高可用架构如下所示:

RM的自动切换和HDFS中的自动切换不同,HDFS的NM需要依赖于ZKFC守护进程来进行切换,而在RM中则内嵌了一个基于zookeeper的ActiveStandbyElector,可以自动确定哪个RM是Active,在这个过程发生的时候,RM都是无日志显示的,只有zk的检测的日志:

代码语言:javascript
复制
2021-02-14 05:17:05,122 [myid:1] - WARN  [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:3001:NIOServerCnxn@376] - Unable to read additional data from client sessionid 0x1000002802a0002, likely client has closed socket
2021-02-14 05:17:05,123 [myid:1] - INFO  [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:3001:NIOServerCnxn@1040] - Closed socket connection for client /192.168.1.99:44263 which had sessionid 0x1000002802a0002

当RM挂了之后,客户端的任务都会不断的轮询所有的RM节点,直到有RM节点活跃,那么会再次执行所有的job。

当所有RM挂了之后,重新启动RM,这个时候RM会加载内部状态,从上一个活动状态中断的地方继续运行,对于先前提交的应用程序,则会进行新的尝试,在HA集群中使用ZKMSstore来进行持久化存储,这个可以解决潜在的脑裂情况。

3 任务重试测试

手动启动一个应用程序,也就是启动一个mapreduce job:

手动杀掉启动的mapreduce application master:

会看到重新启动一个进行重试任务,从而9569进程启动。

在nodemanager节点上,也会看到YarnChild,其实也就是所说的container资源,这个里面会运行相关的map task和reduce task。

这些信息也可以在web界面看到:

从应用程序找到应用程序ID

进入可以看到进行了两次任务,一次是失败的,一次是成功的,失败就是kill mrmaster的那次。

进入可以看到使用的容器数量。

在运行的过程中,也可以看到相关的资源及分配情况。

界面上也能看到相关node的信息:

注意:

在启动yarn集群的时候,必须在resourcemanager上启动,否则resource manager无法启动。standby节点的resource manager需要单独启动。

代码语言:javascript
复制
//ha模式下的yarn-site.xml配置文件
<configuration>

<property>
  <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce_shuffle</value>
</property>

<property>
  <name>yarn.log-aggregation-enable</name>
  <value>true</value>
</property>
<property>
  <name>yarn.log-aggregation.retain-seconds</name>
  <value>604800</value>
</property>
<property>
  <name>yarn.resourcemanager.ha.rm-ids</name>
  <value>rm1,rm2</value>
</property>
<property>
  <name>yarn.resourcemanager.hostname.rm1</name>
  <value>KEL2</value>
</property>
<property>
  <name>yarn.resourcemanager.hostname.rm2</name>
  <value>KEL1</value>
</property>
<property>
  <name>yarn.resourcemanager.webapp.address.rm1</name>
  <value>KEL2:8088</value>
</property>
<property>
  <name>yarn.resourcemanager.webapp.address.rm2</name>
  <value>KEL1:8088</value>
</property>
<property>
  <name>yarn.resourcemanager.ha.enabled</name>
  <value>true</value>
</property>
<property>
  <name>yarn.resourcemanager.cluster-id</name>
  <value>yrc</value>
</property>
<!-- Site specific YARN configuration properties -->
<property>
  <name>yarn.resourcemanager.zk-address</name>
  <value>KEL:3001,KEL:4001,KEL2:5001</value>
</property>

</configuration>
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SRE运维实践 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档