限制apache火花作业运行持续时间

时间:2017-02-06 08:59:53

标签: apache-spark

我想在具有超时参数的集群环境中提交作业,如果它执行允许的持续时间,有没有办法让spark杀死正在运行的作业?

2 个答案:

答案 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
}
}   

希望这有帮助。

拉​​维