我正在使用spark 1.5.1,我想通过REST API检索所有作业状态。
我使用/api/v1/applications/{appId}
获得了正确的结果。但在访问作业时/api/v1/applications/{appId}/jobs
获取“没有此类应用:{appID}”响应。
我应该如何在此处传递应用ID以使用spark REST API检索应用的作业状态?
答案 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