org.apache.spark.deploy.yarn.Client.scala中的monitorApplication方法:

/**

   * Report the state of an application until it has exited, either successfully or

   * due to some failure, then return a pair of the yarn application state (FINISHED, FAILED,

   * KILLED, or RUNNING) and the final application state (UNDEFINED, SUCCEEDED, FAILED,

   * or KILLED).

   *

   * @param appId ID of the application to monitor.

   * @param returnOnRunning Whether to also return the application state when it is RUNNING.

   * @param logApplicationReport Whether to log details of the application report every iteration.

   * @return A pair of the yarn application state and the final application state.

   */

  def monitorApplication(

      appId: ApplicationId,

      returnOnRunning: Boolean = false,

      logApplicationReport: Boolean = true): (YarnApplicationState, FinalApplicationStatus) = {

    val interval = sparkConf.getLong("spark.yarn.report.interval", )

    var lastState: YarnApplicationState = null

    while (true) {

      Thread.sleep(interval)

      val report: ApplicationReport =

        try {

          getApplicationReport(appId)

        } catch {

          case e: ApplicationNotFoundException =>

            logError(s"Application $appId not found.")

            return (YarnApplicationState.KILLED, FinalApplicationStatus.KILLED)

          case NonFatal(e) =>

            logError(s"Failed to contact YARN for application $appId.", e)

            return (YarnApplicationState.FAILED, FinalApplicationStatus.FAILED)

        }

      val state = report.getYarnApplicationState

      if (logApplicationReport) {

        logInfo(s"Application report for $appId (state: $state)")

        // If DEBUG is enabled, log report details every iteration

        // Otherwise, log them every time the application changes state

        if (log.isDebugEnabled) {

          logDebug(formatReportDetails(report))

        } else if (lastState != state) {

          logInfo(formatReportDetails(report))

        }

      }

      if (lastState != state) {

        state match {

          case YarnApplicationState.RUNNING =>

            reportLauncherState(SparkAppHandle.State.RUNNING)

          case YarnApplicationState.FINISHED =>

//            reportLauncherState(SparkAppHandle.State.FINISHED)

            report.getFinalApplicationStatus match {

              case FinalApplicationStatus.FAILED =>

                reportLauncherState(SparkAppHandle.State.FAILED)

              case FinalApplicationStatus.KILLED =>

                reportLauncherState(SparkAppHandle.State.KILLED)

              case _ =>

                reportLauncherState(SparkAppHandle.State.FINISHED)

            }

          case YarnApplicationState.FAILED =>

            reportLauncherState(SparkAppHandle.State.FAILED)

          case YarnApplicationState.KILLED =>

            reportLauncherState(SparkAppHandle.State.KILLED)

          case _ =>

        }

      }

      if (state == YarnApplicationState.FINISHED ||

        state == YarnApplicationState.FAILED ||

        state == YarnApplicationState.KILLED) {

        cleanupStagingDir(appId)

        return (state, report.getFinalApplicationStatus)

      }

      if (returnOnRunning && state == YarnApplicationState.RUNNING) {

        return (state, report.getFinalApplicationStatus)

      }

      lastState = state

    }

    // Never reached, but keeps compiler happy

    throw new SparkException("While loop is depleted! This should never happen...")

  }

其中:

      if (lastState != state) {

        state match {

          case YarnApplicationState.RUNNING =>

            reportLauncherState(SparkAppHandle.State.RUNNING)

          case YarnApplicationState.FINISHED =>

//            reportLauncherState(SparkAppHandle.State.FINISHED)

            report.getFinalApplicationStatus match {

              case FinalApplicationStatus.FAILED =>

                reportLauncherState(SparkAppHandle.State.FAILED)

              case FinalApplicationStatus.KILLED =>

                reportLauncherState(SparkAppHandle.State.KILLED)

              case _ =>

                reportLauncherState(SparkAppHandle.State.FINISHED)

            }

          case YarnApplicationState.FAILED =>

            reportLauncherState(SparkAppHandle.State.FAILED)

          case YarnApplicationState.KILLED =>

            reportLauncherState(SparkAppHandle.State.KILLED)

          case _ =>

        }

      }

yarn state为finished的时候的状态细分不够明确,将原来的 reportLauncherState(SparkAppHandle.State.FAILED)注释掉,改成:

report.getFinalApplicationStatus match {

              case FinalApplicationStatus.FAILED =>

                reportLauncherState(SparkAppHandle.State.FAILED)

              case FinalApplicationStatus.KILLED =>

                reportLauncherState(SparkAppHandle.State.KILLED)

              case _ =>

                reportLauncherState(SparkAppHandle.State.FINISHED)

            }

因为完成状态的final state可能很多种状态,KILLED、FAILED、SUCCESS都可能是final state。
如果只返回一个finished状态给SparkLauncher的SparkAppHandle的话,其实我们在自己的代码中是无法知道这个spark 任务到底是成功了还是失败了,只知道它完成了。
所以要细分一下完成状态,自己用SparkLauncher提交JOB的时候可以监控JOB在失败的时候报警。
此BUG在spark1.6.0中存在对应CDH5.7到CDH5.9的spark都有这个问题,新的版本中已经修复此BUG。
如果在使用CDH版本的spark,那么就自己改一下代码重新编译打包一下,部署一个自己的spark on yarn服务吧。

yarn client中的一个BUG的修复的更多相关文章

  1. 记录一个使用HttpClient过程中的一个bug

    最近用HttpClient进行链接请求,开了多线程之后发现经常有线程hang住,查看线程dump java.lang.Thread.State: RUNNABLE at java.net.Socket ...

  2. 微软BI 之SSIS 系列 - MVP 们也不解的 Scrip Task 脚本任务中的一个 Bug

    开篇介绍 前些天自己在整理 SSIS 2012 资料的时候发现了一个功能设计上的疑似Bug,在 Script Task 中是可以给只读列表中的变量赋值.我记得以前在 2008 的版本中为了弄明白这个配 ...

  3. 趣图:快下班了,剩一个bug,修复一下再走

      趣图:当我给老板展示我修复了那个 bug 时 趣图:当我以为这是最后一个Bug时……

  4. SpriteKit游戏Delve随机生成地牢地图一个Bug的修复

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) Delve是一个很有意思的地牢探险类型的游戏,其中每一关的地图 ...

  5. 印象最深的一个bug——排查修复问题事件BEX引发的谷歌浏览器闪退崩溃异常

    前言 最近,我们部门负责项目运维的小王频频接到甲方的反馈,运行的项目使用谷歌浏览器登录后,每次点击处理2秒后,浏览器自动闪退崩溃.小王同学折腾了一个星期,还没找到问题的原因.甲方客户都把问题反馈给项目 ...

  6. K&R《C语言》书中的一个Bug

    最近在重温K&R的C语言圣经,第二章中的练习题2-2引起了我的注意. 原题是: Write a loop equivalent to the for loop above without us ...

  7. 关于ligerUI中ligerTree代码中的一个bug,造成该控件无法通过url的POST方式加载数据

    该bug造成ligerTree参数中的method无论你怎么设置都只能用get方式提交 由于本人水平有限,只是找到原因,但无法修正 ligerUI v1.1.9 版本中的ligerui.all.js文 ...

  8. python日志轮转RotatingFileHandler在django中的一个bug

    简介 大量过时的日志会占用硬盘空间,甚至长时间运行不注意会占满硬盘导致宕机,那么就可以使用内建logging模块根据文件大小(logging.handlers.RotatingFileHandler) ...

  9. tensorflow代码中的一个bug

    tensorflow-gpu版本号 pip show tensorflow-gpu Name: tensorflow-gpu Version: 1.11.0 Summary: TensorFlow i ...

随机推荐

  1. 【netcore基础】MVC API全局异常捕捉中间件ExceptionHandlerMiddleWare

    项目中想通过统一的接口格式返回异常信息,而不是404 500等HTTP协议层的异常响应 例如 { , , "message":"用户名或密码不正确", &quo ...

  2. 一个表中的id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数

    一个表中的id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数 select id ,Count(*) from table_name group by id having count( ...

  3. java 中的闭包

    原文地址:https://sylvanassun.github.io/2017/07/30/2017-07-30-JavaClosure/ 1.自由变量: function Add(y) { retu ...

  4. eclipse安装Hadoop-0.20.2插件

    因为在使用Hadoop-0.20.2这个古董,需要使用它自带的eclipse插件,而我最初安装的是现代的eclipse4.10.0. 在经历两天,以及以下种种尝试之后,均以失败告终: 1.网上找适合的 ...

  5. ubuntu下hadoop0.20.2报错/dfs/name is in an inconsistent state

    Hadoop0.20.2在关机重启后,namenode启动报错: 用bin/hadoop namenode -format重新格式化一下就好了.这个问题已经出现了两次.每次都格式化,显然不是一个专业的 ...

  6. [No000011F]Python教程2/9-安装Python 及其解释器介绍

    因为Python是跨平台的,它可以运行在Windows.Mac和各种Linux/Unix系统上.在Windows上写Python程序,放到Linux上也是能够运行的. 要开始学习Python编程,首先 ...

  7. 添加字体与字符集locale支持(基于busybox文件系统)

    添加字体与字符集(基于busybox文件系统) 2011-10-11 14:07:32 分类: LINUX 1.添加字体 下面以文泉驿为例 $ mkdir  -p  rootfs/usr/share/ ...

  8. php之函数

    scope(空间) unpack (解压) Traversable (穿越) performance(性能) experiment (检验) properties (属性) trailing (尾随) ...

  9. [bigdata] palantir

    Palantir的无缝数据融合技术关键在于本体数据模型的灵活性,动态性,而且要能反映人.事.物和环境的关联关系及因果联系,这是大数据技术面临的核心挑战.

  10. SQL中Between查询日期时需要注意的地方

    SQL中Between查询日期时需要注意的地方   某个表某个字段是Datetime型 以"YYYY-MM-DD 00:00:00" 存放 (1).例如数据 2009-01-22 ...