Apache spark 如何在不知道作业id的情况下获取Apache Spark作业进度?

Apache spark 如何在不知道作业id的情况下获取Apache Spark作业进度?,apache-spark,Apache Spark,我有以下例子: val sc: SparkContext // An existing SparkContext. val sqlContext = new org.apache.spark.sql.SQLContext(sc) val df = sqlContext.read.json("examples/src/main/resources/people.json") df.count 我知道我可以使用spark上下文使用SparkListener监控作业;但是,这会给我所有作业的事件

我有以下例子:

val sc: SparkContext // An existing SparkContext.
val sqlContext = new org.apache.spark.sql.SQLContext(sc)

val df = sqlContext.read.json("examples/src/main/resources/people.json")

df.count
我知道我可以使用spark上下文使用SparkListener监控作业;但是,这会给我所有作业的事件(我不能使用,因为我不知道作业id)


如何仅获取“计数”操作的进度?

如评论中所述,可以使用收集所需的数字

主要问题是确定你感兴趣的阶段。从代码到阶段没有1:1的映射。例如,单个计数将触发两个阶段(一个阶段用于对数据帧的每个分区中的元素进行计数,另一个阶段用于对第一阶段的结果进行汇总)。阶段通常会获取触发其执行的操作的名称,尽管这可能是错误的

可以创建一个方法,查询RESTAPI中具有特定名称的所有阶段,然后将这些阶段的所有任务数以及已完成任务数相加。假设所有任务的执行时间大致相同(如果数据集具有倾斜分区,则此假设为假),则可以使用已完成任务的份额作为作业进度的度量

def countTasks(sparkUiUrl:String,stageName:String):(Int,Int)={
导入scala.util.parsing.json_
导入scala.collection.mutable.ListBuffer
def get(url:String)=scala.io.Source.fromURL(url.mkString)
//获取所有正在运行的应用程序的ID,并将其收集到ListBuffer中
val applications=JSON.parseFull(get(sparkUiUrl+“/api/v1/applications?staus=running”))
val应用程序:ListBuffer[String]=新scala.collection.mutable.ListBuffer[String]
应用程序匹配{
案例部分(l:List[Map[String,String]])=>l.foreach(apps+=\uid)
case other=>println(“读取应用程序时未知的数据结构:“+other”)
}
var countTasks:Int=0;
var countCompletedTasks:Int=0;
//获取每个应用程序的阶段,并使用请求的名称汇总每个阶段的任务数
apps.foreach(app=>{
val stages=JSON.parseFull(get(sparkUiUrl+“/api/v1/applications/“+app+“/stages”))
阶段赛{
case-Some(l:List[Map[String,Any]])=>l.foreach(m=>{
如果(m(“名称”)==stageName){
countTasks+=m(“numTasks”).asInstanceOf[Double].toInt
countCompletedTasks+=m(“numCompletedTasks”)。asInstanceOf[Double]。toInt
}
})
case other=>println(“读取阶段时未知数据结构:“+other”)
}
})
//println(countCompletedTasks+“of”+countTasks+“tasks completed”)
(countTasks,countCompletedTasks)
}
为给定的计数示例调用此函数

println(countTasks(“http://localhost:4040“,”在CountExample.scala:16“)中显示)
将打印两个数字:第一个是所有任务的数量,第二个是已完成任务的数量


我已经用Spark 2.3.0测试了这段代码。在生产环境中使用它之前,它肯定需要一些额外的修饰,特别是一些更复杂的错误检查。统计数据不仅可以通过计算已完成的任务,还可以通过计算失败的任务来改进。

您需要以编程方式对其进行监控吗?是的。正如我将这些度量传递给其他应用程序一样。您考虑过解析web UI吗?在“说明”下,您可以查找
df.count
,行条目中的其他字段应该为您提供持续时间、阶段:succeed/Total和任务:succeed/Total我认为web UI是一个不错的选择。它可以通过描述性链接轻松划分为作业和阶段。看见