yarn RM crash问题一例

今天收到线上的resource manager报警:

报错信息如下:

2014-07-08 13:22:54,118 INFO org.apache.hadoop.yarn.util.AbstractLivelinessMonitor: Expired:xxxx:53356 Timed out after 600 secs
2014-07-08 13:22:54,118 INFO org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNodeImpl: Deactivating Node xxxx:53356 as it is now LOST
2014-07-08 13:22:54,118 INFO org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNodeImpl: xxxx:53356 Node Transitioned from UNHEALTHY to LOST
2014-07-08 13:22:54,118 FATAL org.apache.hadoop.yarn.server.resourcemanager.ResourceManager: Error in handling event type NODE_REMOVED to the scheduler
java.lang.NullPointerException
        at org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler.removeNode(FairScheduler.java:715)
        at org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler.handle(FairScheduler.java:974)
        at org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler.handle(FairScheduler.java:108)
        at org.apache.hadoop.yarn.server.resourcemanager.ResourceManager$SchedulerEventDispatcher$EventProcessor.run(ResourceManager.java:378)
        at java.lang.Thread.run(Thread.java:662)
2014-07-08 13:22:54,118 INFO org.apache.hadoop.yarn.server.resourcemanager.ResourceManager: Exiting, bbye..
2014-07-08 13:22:54,119 INFO org.apache.hadoop.yarn.event.AsyncDispatcher: Size of event-queue is 1000
2014-07-08 13:22:54,119 INFO org.apache.hadoop.yarn.event.AsyncDispatcher: Size of event-queue is 2000

这是一个bug,bug id:https://issues.apache.org/jira/browse/YARN-502

根据bug的描述,是在rm删除标记为UNHEALTHY的nm的时候可能会触发bug(第一次已经删除,后面删除再进行删除操作时就会报错)。

根据堆栈信息来看代码:

org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler:
  protected ResourceScheduler scheduler; 
    private final class EventProcessor implements Runnable { // 开启一个EventProcessor 线程,对event进行处理
      @Override
      public void run() {
        SchedulerEvent event;
        while (!stopped && !Thread.currentThread ().isInterrupted()) {
          try {
            event = eventQueue.take();  // 从event queue里面拿出event
          } catch (InterruptedException e) {
            LOG.error("Returning, interrupted : " + e);
            return; // TODO: Kill RM.
          }
          try {
            scheduler.handle(event); //处理event
          } catch (Throwable t) { // cache event的异常
            // An error occurred, but we are shutting down anyway.
            // If it was an InterruptedException, the very act of
            // shutdown could have caused it and is probably harmless.
            if (stopped ) {
              LOG.warn("Exception during shutdown: " , t);
              break;
            }
            LOG.fatal("Error in handling event type " + event.getType() //根据日志来看,这里获取的event.getType()为 NODE_REMOVED
                + " to the scheduler", t);
            if (shouldExitOnError
                && !ShutdownHookManager.get().isShutdownInProgress()) {
              LOG.info("Exiting, bbye.." );
              System. exit(-1);
            }
          }
        }
      }
    }

这里可以看到可以通过shouldExitOnError可以控制RM线程是否退出。

private boolean shouldExitOnError = false; // 初始设置为false
    @Override
    public synchronized void init(Configuration conf) {  // 在做初始化时,可以通过配置文件获取
      this. shouldExitOnError =
          conf.getBoolean(Dispatcher.DISPATCHER_EXIT_ON_ERROR_KEY,
            Dispatcher.DEFAULT_DISPATCHER_EXIT_ON_ERROR); // 参数在Dispatcher类中定义
      super.init(conf);
    }
org.apache.hadoop.yarn.event.Dispatcher类:
public interface Dispatcher {   
  // Configuration to make sure dispatcher crashes but doesn‘t do system-exit in
  // case of errors. By default, it should be false, so that tests are not
  // affected. For all daemons it should be explicitly set to true so that
  // daemons can crash instead of hanging around.
  public static final String DISPATCHER_EXIT_ON_ERROR_KEY =
      "yarn.dispatcher.exit-on-error"; // 控制参数
  public static final boolean DEFAULT_DISPATCHER_EXIT_ON_ERROR = false; // 默认为false
  EventHandler getEventHandler();
  void register(Class<? extends Enum> eventType, EventHandler handler);
}

在ResourceManager类的init函数中:

 @Override
  public synchronized void init(Configuration conf) {
    this. conf = conf;
    this. conf.setBoolean(Dispatcher.DISPATCHER_EXIT_ON_ERROR_KEY, true);  // 这个值的默认值为true了(覆盖了Dispatcher类中的DEFAULT设置)

即默认在遇到dispather的错误时,会退出。
遇到错误是否退出可以由配置参数yarn.dispatcher.exit-on-error决定。不过这个改动影响比较大,最好还是不要设置,还是打patch来解决吧。

官方的patch也比较简单,即在rmnm时进行一次判断,防止二次删除操作:

--- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmnode/RMNodeImpl.java
+++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmnode/RMNodeImpl.java
@@ -501,8 +501,13 @@ public DeactivateNodeTransition(NodeState finalState) {
     public void transition(RMNodeImpl rmNode, RMNodeEvent event) {
       // Inform the scheduler
       rmNode.nodeUpdateQueue.clear();
-      rmNode.context.getDispatcher().getEventHandler().handle(
-          new NodeRemovedSchedulerEvent(rmNode));
+      // If the current state is NodeState.UNHEALTHY
+      // Then node is already been removed from the
+      // Scheduler
+      if (!rmNode.getState().equals(NodeState.UNHEALTHY)) {
+        rmNode.context.getDispatcher().getEventHandler()
+          .handle( new NodeRemovedSchedulerEvent(rmNode));
+      }
       rmNode.context.getDispatcher().getEventHandler().handle(
           new NodesListManagerEvent(
               NodesListManagerEventType.NODE_UNUSABLE, rmNode));

yarn RM crash问题一例,布布扣,bubuko.com

时间: 2024-08-03 18:52:10

yarn RM crash问题一例的相关文章

yarn空队列crash bug

最近线上的rm crash了一次,查看日志,发现有如下报错: 2015-01-05 18:00:11,523 ERROR org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler: Request for appInfo of unknown attemptappattempt_1418702129929_2281200_000001 2015-01-05 18:00:11,524 ERROR org.a

yarn默认配置

name value description yarn.ipc.client.factory.class   Factory to create client IPC classes. yarn.ipc.serializer.type protocolbuffers Type of serialization to use. yarn.ipc.server.factory.class   Factory to create server IPC classes. yarn.ipc.excepti

linux 命令 —-— rm

命令格式:      rm [选项] 文件或目录 命令功能: 删除一个或多个文件或目录 命令参数: -f  不给出提示,强行删除 -i  删除时会进行提示,交互式操作 -r.-R  删除目录时需要添加此选项,递归删除目录 -v  显示详细信息 常用范例: 例一:删除文件1.txt,要求系统给出提示信息 命令:rm 1.txt   或   rm -i 1.txt 例二:强行删除文件2.txt 命令:rm -f 2.txt 例三:强行删除目录test 命令:rm -rf test 注意:rm是一个危

Linux常用命令汇总--rm

1.功能:删除文件或者文件夹 2.用法:rm [选项] 文件或者文件夹 3.参数: -f, --force 强制删除 -i    删除每个文件之前先确认 -I    在删除多个文件或者递归删除时,提示一次. --interactive[=WHEN]  删除时是否需要确认,有when.once (-I).always(-i)三种选项 -r, -R, --recursive 递归地删除文件以及文件夹 4.例子 例1:在不指定参数的参数的情况下,对于每一个需要删除的文件,都要确认是否删除:默认情况下不

Containers Reserved yarn resourcemanager

yarn rm的管理页面中显示了集群的概况,其中有一个指标叫Containers Reserved . 预留的容器,为什么会预留,集群的资源使用饱合,新的app请求的资源一般会进入pending状态,为什么需要预留, 查阅资料说是,如果app申请的资源不太容易分配,比如新的app是一个计算密集型的,一个task需要6个vcores,其他任务需要一个, 则刚释放的资源如果不预留,就会被其他任务使用,而这样有失公平. 这也是yarn 公平调度器的一个特性,有关公平调度器的更多说明,请阅读: Fair

Spark on Yarn with HA

Spark 可以放到yarn上面去跑,这个毫无疑问.当Yarn做了HA的时候,网上会告诉你基本Spark测不需做太多的关注修改,实际不然. 除了像spark.yarn开头的相关配置外,其中一个很重要的坑是spark-yarn依赖包的Hadoop版本问题.Spark1.6.x的spark-yarn默认的Hadoop是2.2.0,而现在大部分的Hadoop2应该都升到了2.6或2.7,在没做HA的时候,这部分yarn api是兼容的,然而yarn做了HA后,依赖旧版本的yarn api不会去自己找

Linux学习笔记(九)——su_sudo_ssh_pdsh命令

一.   su命令 建议不要使用root账户直接登录系统,主要考虑的是系统安全问题.通常的做法是使用su命令切换到root账户,完成需要的工作.如果su命令没有任何参数,默认登录的就是root账户,输入密码后会启动一个root用户的进程.su可以使一般用户拥有超级用户或其他用户的权限,也可以使超级用户以一般用户的身分执行命令.但一般用户使用该命令时必须输入root用户或其他用户的口令.执行exit命令退出当前用户的登陆. 执行su命令切换到root用户的PATH环境变量值: [[email pr

Flink学习(一)

Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时,提供支持流处理和批处理两种类型应用的功能. 现有的开源计算方案,会把流处理和批处理作为两种不同的应用类型,因为它们所提供的SLA(Service-Level-Aggreement)是完全不相同的:流处理一般需要支持低延迟.Exactly-once保证,而批处理需要支持高吞吐.高效处理. Flink从另一个视角看待流处理和批处理,将二者统一起来:Flink是完全支持流处理,也就是说作为

Flink 更新中

一.介绍 Flink分层组件栈 API支持 对Streaming数据类应用,提供DataStream API 对批处理类应用,提供DataSet API(支持Java/Scala) Libraries支持 支持机器学习(FlinkML) 支持图分析(Gelly) 支持关系数据处理(Table) 支持复杂事件处理(CEP) 整合支持 支持Flink on YARN 支持HDFS 支持来自Kafka的输入数据 支持Apache HBase 支持Hadoop程序 支持Tachyon 支持Elastic