在应用spark时,经常要获取任务的执行进度,可以参照jobProgressListener的设计来完成该功能。

以下代码仅供参考,欢迎交流。

效果显示:

代码:

package org.apache.spark.zpc.listener

import org.apache.spark.Logging
import org.apache.spark.scheduler._ import scala.collection.mutable /**
* Spark 的 DeveloperApi 提供针对app, job, task的执行监听。
* 通过该监听,可以实现:
* 1.任务执行进度的粗略计算。
* 2.执行异常失败时,获取异常信息。
* 3.获取app启动的appId,从而可以控制杀死任务。
* 4.自定义进度和异常的handle处理(如控制台打印,保存db,或jms传输到web等终端
*
* @param jobNum Application中Job个数。可以通过代码的提交查看spark日志查看到。
*/ abstract class SparkAppListener(jobNum: Int) extends SparkListener with Logging { //Job和Job信息(包括总task数,当前完成task数,当前Job百分比)的映射
private val jobToJobInfo = new mutable.HashMap[Int, (Int, Int, Int)]
//stageId和Job的映射,用户获取task对应的job
private val stageToJob = new mutable.HashMap[Int, Int]
//完成的job数量
private var finishJobNum = 0
private var hasException: Boolean = false override def onApplicationStart(applicationStart: SparkListenerApplicationStart): Unit = synchronized {
val appId = applicationStart.appId
//记录app的Id,用于后续处理:
//如:yarn application -kill appId
//handleAppId(appId)
} //获取job的task数量,初始化job信息
override def onJobStart(jobStart: SparkListenerJobStart) = synchronized {
val jobId = jobStart.jobId
val tasks = jobStart.stageInfos.map(stageInfo => stageInfo.numTasks).sum
jobToJobInfo += (jobId ->(tasks, 0, 0))
jobStart.stageIds.map(stageId => stageToJob(stageId) = jobId)
} //task结束时,粗略估计当前app执行进度。
//估算方法:当前完成task数量/总task数量。总完成task数量按(job总数*当前job的task数。)
override def onTaskEnd(taskEnd: SparkListenerTaskEnd) = synchronized {
val stageId = taskEnd.stageId
val jobId = stageToJob.get(stageId).get
val (totalTaskNum: Int, finishTaskNum: Int, percent: Int) = jobToJobInfo.get(jobId).get
val currentFinishTaskNum = finishTaskNum + 1
val newPercent = currentFinishTaskNum * 100 / (totalTaskNum * jobNum)
jobToJobInfo(jobId) = (totalTaskNum, currentFinishTaskNum, newPercent) if (newPercent > percent) {
//hanlde application progress
val totalPercent = jobToJobInfo.values.map(_._3).sum
if (totalPercent <= 100){
// handleAppProgress(totalPercent)
}
}
} //job 结束,获取job结束的状态,异常结束可以将异常的类型返回处理。
// handle处理自定义,比如返回给web端,显示异常log。
override def onJobEnd(jobEnd: SparkListenerJobEnd) = synchronized {
jobEnd.jobResult match {
case JobSucceeded => finishJobNum += 1
case JobFailed(exception) if !hasException =>
hasException = true // handle application failure
// handleAppFailure(exception)
case _ =>
}
} //app结束时,将程序执行进度标记为 100%。
//缺陷:SparkListenerApplicationEnd没有提供app的Exception的获取。这样,当程序在driver端出错时,
//获取不到出错的具体原因返回给前端,自定义提示。比如(driver对app中的sql解析异常,还没有开始job的运行) /*** driver 端异常可通过主程序代码里 try catch获取到 ***/
override def onApplicationEnd(applicationEnd: SparkListenerApplicationEnd) = synchronized {
val totalJobNum = jobToJobInfo.keySet.size
val totalPercent = jobToJobInfo.values.map(_._3).sum
//handle precision lose
if (!hasException && totalPercent == 99) {
// handleAppProgress(100)
}
val msg = "执行失败"
if(totalJobNum == 0){
handleAppFailure(new Exception(msg))
}
}
}

博客记录是个好习惯,计划一下以后几期的博客。

由浅入深,围绕机器学习的主题,来学习介绍。

模型评估与选择 
 线性模型
 决策树
 神经网络
 支持向量机
 贝叶斯分类器
  贝叶斯决策论 
  极大似然估计 
  朴素贝叶斯分类器 
  半朴素贝叶斯分类器 
  贝叶斯网 
 集成学习
  个体与集成
  Boosting
  Bagging与随机森林
  Bagging
  随机森林 
 聚类 
 降维与度量学习 
 特征选择与稀疏学习
 概率图模型
   隐马尔可夫模型
   马尔可夫随机场
 规则学习
 强化学习
 深度学习系列

通过DeveloperApi获取spark程序执行进度及异常的更多相关文章

  1. Yii2获取当前程序执行的sql语句

    1.Yii2获取当前程序执行的sql语句: $query = model::find();         $dataProvider = new ActiveDataProvider([       ...

  2. Spark记录(二):Spark程序的生命周期

    本文以Spark执行模式中最常见的集群模式为例,详细的描述一下Spark程序的生命周期(YARN作为集群管理器). 1.集群节点初始化 集群刚初始化的时候,或者之前的Spark任务完成之后,此时集群中 ...

  3. 大数据技术之_19_Spark学习_01_Spark 基础解析 + Spark 概述 + Spark 集群安装 + 执行 Spark 程序

    第1章 Spark 概述1.1 什么是 Spark1.2 Spark 特点1.3 Spark 的用户和用途第2章 Spark 集群安装2.1 集群角色2.2 机器准备2.3 下载 Spark 安装包2 ...

  4. 【原创】大叔经验分享(19)spark on yarn提交任务之后执行进度总是10%

    spark 2.1.1 系统中希望监控spark on yarn任务的执行进度,但是监控过程发现提交任务之后执行进度总是10%,直到执行成功或者失败,进度会突然变为100%,很神奇, 下面看spark ...

  5. 使用Jacoco获取 Java 程序的代码执行覆盖率

    Jacoco是Java Code Coverage的缩写,顾名思义,它是获取Java代码执行覆盖率的一个工具,通常用它来获取单元测试覆盖率.它通过分析Java字节码来得到代码执行覆盖率,因此它还可以分 ...

  6. 通过DT10获取程序执行过程中的实时覆盖率

    DT10是新一代的动态测试工具,可以长时间跟踪记录目标程序执行情况,获取目标程序动态执行数据,帮助进行难于重现的Bug错误分析,覆盖率检测,性能测试,变量跟踪等等功能. 系统测试覆盖率,通常是用于判断 ...

  7. 如何在mysql命令窗口获取到程序正在执行的sql语句

    步骤: 1.进入mysql的命令窗口: 2.运行use information_schema; 3.运行select * from PROCESSLIST where info is not null ...

  8. Spark认识&环境搭建&运行第一个Spark程序

    摘要:Spark作为新一代大数据计算引擎,因为内存计算的特性,具有比hadoop更快的计算速度.这里总结下对Spark的认识.虚拟机Spark安装.Spark开发环境搭建及编写第一个scala程序.运 ...

  9. 关于 使用python向qq好友发送消息(对爬虫的作用----当程序执行完毕或者报错无限给自己qq发送消息,直到关闭)

    以前看到网上一些小程序,在处理完事物后会自动发送qq消息,但是一直搞不懂是说明原理.也在网上找过一些python登陆qq发送消息的文字,但是都太复杂了.今天偶然看到一篇文章,是用python调用win ...

随机推荐

  1. 使用WebClient上传文件并同时Post表单数据字段到服务端

    之前遇到一个问题,就是使用WebClient上传文件的同时,还要Post表单数据字段,一开始以为WebClient可以直接做到,结果发现如果先 Post表单字段,就只能获取到字段及其值,如果先上传文件 ...

  2. cocos2d-x学习笔记------动画人物跑起来吧!

    学习总结: 1.sprintf用来格式化字符串 2.CCSpriteFrame:: frameWithTexture通过图片名创建的时候需要的参数Texture2D创建使用CCTextureCache ...

  3. eclipse中配置maven的web项目

    提高效率,一般都会使用IED如eclipse来帮助开发.eclipse中单独建立一个web项目或者是maven项目是可以通过插件很容易完成的,但是如果要结合2者,就需要先建立一个,然后再转换或使原型. ...

  4. Linux下GPIO驱动(四) ----gpio_request();gpio_free();

    //gpio_request申请gpio口 int gpio_request(unsigned gpio, const char *label) { struct gpio_desc *desc; s ...

  5. Mysql zip压缩包安装

    解压mysql.zip 配置环境变量(略) 配置my-default.ini 配置文件 安装mysql:mysqld -install 初始化mysql:mysqld --initialize 启动服 ...

  6. c语言的一些基础知识

    c语言作为经典语言,这里不再多说了.咱从基础一起探讨吧! 一. 定义一个整型,如果作为局部变量,没有初始化的情况下,它是一个随机的值的,一般情况下输出会是0,但这个0是作为垃圾值的;而如果作为全局变量 ...

  7. Grails的redirect无法跳转时的一个可能原因

    由于controller的命名一般首字母大写,如Login 此时如 class LoginController { def index = { redirect(action:Login, param ...

  8. android apk 反编译

    Apk文件结构 apk文件实际是一个zip压缩包,可以通过解压缩工具解开.以下是我们用zip解开helloworld.apk文件后看到的内容.可以看到其结构跟新建立的工程结构有些类似. java代码: ...

  9. uva 165 Stamps

    题意: 现有k种邮票面额, 一封信上最多贴h张邮票. 求能贴出的最大连续区间,即[1, max_value]这个区间内的所有面额都能贴出来. 并输出k种面额, h + k <= 9. 思路: 这 ...

  10. matlab高斯模板生成,K是归一化系数,上面是一个半径200的高斯模板用来做MSR

    R3=; F=zeros(*R3+,*R3+); sigma=R3/; r=; :*R3+     :*R3+         r=(x-R3)*(x-R3)+(y-R3)*(y-R3);       ...