如何通过spark REST API获取所有作业状态?

时间:2015-11-03 09:33:16

标签: rest apache-spark

我正在使用spark 1.5.1,我想通过REST API检索所有作业状态。

我使用/api/v1/applications/{appId}获得了正确的结果。但在访问作业时/api/v1/applications/{appId}/jobs获取“没有此类应用:{appID}”响应。

我应该如何在此处传递应用ID以使用spark REST API检索应用的作业状态?

5 个答案:

答案 0 :(得分:7)

Spark提供了4个隐藏的RESTFUL API

1)提交作业 - curl -X POST http://SPARK_MASTER_IP:6066/v1/submissions/create

2)要杀死这份工作 - 卷曲-X POST http://SPARK_MASTER_IP:6066/v1/submissions/kill/driver-id

3)检查作业的状态 - 卷曲http://SPARK_MASTER_IP:6066/v1/submissions/status/driver-id

4)Spark群集的状态 - http://SPARK_MASTER_IP:8080/json/

如果您想使用其他API,可以尝试Livy,lucidworks 网址 - https://doc.lucidworks.com/fusion/3.0/Spark_ML/Spark-Getting-Started.html

答案 1 :(得分:6)

这应该在访问实时驱动程序的API端点时起作用,但由于您使用的是Spark 1.5.x,我认为您已经遇到SPARK-10531,这是一个错误Spark Driver UI错误地混合了应用程序名称和应用程序ID。因此,您必须在REST API URL中使用应用程序名称,例如

sendMessage(data, (function(a,b){
    return function(){
        renderLobbyImages(a,b);
    }
})(this.stage, this.scheduleItemService));

根据JIRA票证,这仅影响Spark Driver UI;应用程序ID应与Spark History Server的API端点一起按预期工作。

这在Spark 1.6.0中已修复,应尽快发布。但是,如果您想要一个适用于所有Spark版本的解决方法,那么以下方法应该可行:

http://localhost:4040/api/v1/applications/Spark%20shell/jobs 端点错误地将作业名称误报为作业ID,因此您应该能够命中该端点,提取api/v1/applications字段(实际上是应用程序名称),然后使用它来构建当前应用程序的作业列表的URL(请注意,id端点只会在Spark Driver UI中返回单个作业,这就是为什么这种方法应该是安全的;由于这个属性,我们不知道#39; t不得不担心应用程序名称的非唯一性。例如,在Spark 1.5.2中,/applications端点可以返回包含类似

的记录的响应
/applications

如果您使用此{ id: "Spark shell", name: "Spark shell", attempts: [ { startTime: "2015-09-10T06:38:21.528GMT", endTime: "1969-12-31T23:59:59.999GMT", sparkUser: "", completed: false }] } 字段的内容构建id网址,那么您的代码应该面向未来,以防升级到Spark 1.6.0,因为applications/<id>/jobs字段将开始在Spark 1.6.0 +中报告正确的ID。

答案 2 :(得分:2)

如果您想使用REST API来控制Spark,您可能最好将Spark Jobserver添加到您的安装中,然后为您提供比您当前查询的私有REST API更全面的REST API

我已经设法通过运行

来获取单个应用程序的作业状态
  

curl http://127.0.0.1:4040/api/v1/applications/Spark%20shell/jobs/

返回

[ {
  "jobId" : 0,
  "name" : "parquet at <console>:19",
  "submissionTime" : "2015-12-21T10:46:02.682GMT",
  "stageIds" : [ 0 ],
  "status" : "RUNNING",
  "numTasks" : 2,
  "numActiveTasks" : 2,
  "numCompletedTasks" : 0,
  "numSkippedTasks" : 0,
  "numFailedTasks" : 0,
  "numActiveStages" : 1,
  "numCompletedStages" : 0,
  "numSkippedStages" : 0,
  "numFailedStages" : 0 }]

答案 3 :(得分:2)

对于那些遇到此问题且正在YARN上运行的人:

根据the docs

  

在YARN群集模式下运行时,[app-id]实际上是[base-app-id] / [attempt-id],其中[base-app-id]是YARN应用程序ID

因此,如果您对https://HOST:PORT/api/v1/applications/application_12345678_0123的调用返回类似

的内容
{
  "id" : "application_12345678_0123",
  "name" : "some_name",
  "attempts" : [ {
    "attemptId" : "1",
    <...snip...>
  } ]
}
你可以得到例如。通过致电

来完成工作
https://HOST:PORT/api/v1/applications/application_12345678_0123/1/jobs

(请注意&#34; 1&#34;之前&#34; / jobs&#34;)。

答案 4 :(得分:0)

Spark有一些隐藏的RESTFUL API,您可以尝试。 请注意,我还没有尝试过,但我会。

例如:要获取提交申请的状态,您可以执行以下操作: 卷曲http://spark-cluster-ip:6066/v1/submissions/status/driver-20151008145126-0000

注意:&#34; driver-20151008145126-0000&#34;是submitsionId。

您可以深入了解此链接:http://arturmkrtchyan.com/apache-spark-hidden-rest-api