我想在具有超时参数的集群环境中提交作业,如果它执行允许的持续时间,有没有办法让spark杀死正在运行的作业?
答案 0 :(得分:0)
在Spark 2.1.0中,没有内置解决方案(这是一个非常好的功能!)。
您可以使用speculation
功能重新启动长任务,spark.task.maxFailures
可以杀死太多重新启动的任务。
但这绝对不干净,Spark缺少一个真正的“断路器”来阻止长任务(例如noob SELECT * FROM DB
)
另一方面,您可以使用Spark Web UI Web API:
1)获得正在运行的工作:GET http://SPARK_CLUSTER_PROD/api/v1/applications/application_1502112083252_1942/jobs?status=running
(这将为您提供一个包含submissionTime
字段的数组,您可以使用该字段查找长期工作)
2)为每个工作阶段杀死工作:POST http://SPARK_CLUSTER_PROD/stages/stage/kill/?id=23881&terminate=true
。
我相信Spark也有隐藏的API,您可以尝试使用。
答案 1 :(得分:0)
您可以使用YARN REST api终止服务中的spark应用程序。我使用以下代码来停止长时间运行的spark应用程序。以下代码使用httpclient库。
def killApplication(applicationId: String) : Boolean = {
val appKillPut = new HttpPut(s"http://xx.xx.xx.xx:8088//ws/v1/cluster/apps/$applicationId/state")
val json = new JSONObject(Map("state"-> "KILLED"))
val params = new StringEntity(json.toString(),"UTF-8")
params.setContentType("application/json")
appKillPut.addHeader("Content-Type", "application/json")
appKillPut.addHeader("Accept", "*/*")
appKillPut.setEntity(params)
println(s"Request payload ${json.toString}")
val client: CloseableHttpClient = HttpClientBuilder.create().build()
val response: CloseableHttpResponse = client.execute(appKillPut)
val responseBody = EntityUtils.toString(response.getEntity)
println(s"Response payload ${responseBody}")
val statusCode: Int = response.getStatusLine.getStatusCode
if(statusCode == 200 || statusCode == 201 || statusCode == 202) {
println(s"Successfully stopped the application : ${applicationId}")
true
} else {
false
}
}
希望这有帮助。
拉维