前段时间在clouderamanager管理集群的时候,需要重启集群,但是重启集群后发现两个ResourceManager都处于备用状态,也就是没有选出主RM
首先想到的是是否zk出问题,查看后并不是zk问题,zk正常,然后查看RM的日志
发现RM在重新调度任务,但是由于其他原因一直未调度成功,一直在重试,(网上其他网友说是yarn.scheduler.maximum-allocation-mb这个配置太小的原因但是我开大了
之后发现不管用)。ResourceManager无法恢复留在RMStateStore中的应用程序。解决办法就是找到yarn中存储应用状态的地方,关联到yarn的以下配置:
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<!--默认值为false,也就是说resourcemanager挂了相应的正在运行的任务在rm恢复后不能重新启动-->
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.store.class</name>
<!--此版本的rmstate信息存放主要有两种,一种是FileSystemRMStateStore,另一种是MemoryRMStateStore,还有一种目前较为主流的是zkstore,正在测试中,2.2版本还未提供-->
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.FileSystemRMStateStore</value>
</property>
<property>
<name>yarn.resourcemanager.fs.state-store.uri</name>
<!--此处配置为hdfs存储状态信息,还可以配置为存放在本地路径,之所以存放在hdfs上是考虑都如果rm节点完全挂掉,还可以在其他节点上启动rm直接读取hdfs信息,如果放在本地文件系统上还需要进行状态信息的同步。-->
<value>hdfs://mycluster/rmstore</value>
</property>
查看我的集群yarn配置后发现我的yarn中应用状态是存储在zk上的,所以解决办法就是删除zk上的应用状态节点,然后重启yarn
1、如果是在hdfs上存储则找到存储路径
查看yarn.resourcemanager.fs.state-store.uri配置或者执行hdfs getconf -confKey yarn.resourcemanager.fs.state-store.uri
找到配置值为:/var/mapr/cluster/yarn/rm/system
删除:hadoop fs -mv /var/mapr/cluster/yarn/rm/system/FSRMStateRoot/RMAppRoot/* /backup_statestore/
重启 ResourceManager
2、如果是在zk上存储
查看yarn.resourcemanager.zk-state-store.parent-path配置或者执行hdfs getconf -confKey yarn.resourcemanager.zk-state-store.parent-path
找到配置值为:/rmstore
然后登陆zk客户端删除:rmr /rmstore/ZKRMStateRoot/RMAppRoot/
重启ResourceManager