Apache spark 提交&;从另一个应用程序以编程方式终止Spark应用程序
我想知道是否可以提交,监控,终止其他服务的spark应用程序 我的要求如下: 我写了一个服务Apache spark 提交&;从另一个应用程序以编程方式终止Spark应用程序,apache-spark,Apache Spark,我想知道是否可以提交,监控,终止其他服务的spark应用程序 我的要求如下: 我写了一个服务 解析用户命令 将它们转换为可理解的参数到已准备好的Spark SQL应用程序 使用来自ProcessBuilder的Spark submit将应用程序连同参数一起提交到Spark Cluster 并计划在群集模式下运行生成的应用程序驱动程序 其他需要: 查询有关应用程序的状态,例如,百分比保持不变 Kill随机查询 我在suggest kill应用程序中发现了以下内容: ./bin/spark-cl
- 查询有关应用程序的状态,例如,百分比保持不变
- Kill随机查询
./bin/spark-class org.apache.spark.deploy.Client kill <master url> <driver ID>
/bin/spark class org.apache.spark.deploy.Client kill
并且应该通过http://:8080上的独立主web UI找到驱动程序ID。
那么,我该怎么办
相关SO问题:您可以从processbuilder中启动Thread命令,列出应用程序,然后根据可用的应用程序名称进行筛选,提取appId,然后使用Thread命令轮询状态/终止等。终止spark应用程序的“肮脏”诀窍是终止名为SparkSubmit的JP。主要的问题是,应用程序将被“杀死”,但在spark主日志中,它将显示为“完成” 老实说,我不喜欢这个解决方案,但到目前为止,这是我知道的杀死应用程序的唯一方法。以下是我的做法:
- 通过这种方式,您可以获得一个DriverID(submissionId下),以后可以使用它终止作业(您不应该终止应用程序,特别是在独立模式下使用“监督”时)
- 此API还允许您查询驱动程序状态
- 此服务以JSON格式公开主UI上的所有可用信息
您可以使用shell脚本来执行此操作 部署脚本:
#!/bin/bash
spark-submit --class "xx.xx.xx" \
--deploy-mode cluster \
--supervise \
--executor-memory 6G hdfs:///spark-stat.jar > output 2>&1
cat output
您将得到如下输出:
16/06/23 08:37:21 INFO rest.RestSubmissionClient: Submitting a request to launch an application in spark://node-1:6066.
16/06/23 08:37:22 INFO rest.RestSubmissionClient: Submission successfully created as driver-20160623083722-0026. Polling submission state...
16/06/23 08:37:22 INFO rest.RestSubmissionClient: Submitting a request for the status of submission driver-20160623083722-0026 in spark://node-1:6066.
16/06/23 08:37:22 INFO rest.RestSubmissionClient: State of driver driver-20160623083722-0026 is now RUNNING.
16/06/23 08:37:22 INFO rest.RestSubmissionClient: Driver is running on worker worker-20160621162532-192.168.1.200-7078 at 192.168.1.200:7078.
16/06/23 08:37:22 INFO rest.RestSubmissionClient: Server responded with CreateSubmissionResponse:
{
"action" : "CreateSubmissionResponse",
"message" : "Driver successfully submitted as driver-20160623083722-0026",
"serverSparkVersion" : "1.6.0",
"submissionId" : "driver-20160623083722-0026",
"success" : true
}
基于此,创建kill驱动程序脚本
#!/bin/bash
driverid=`cat output | grep submissionId | grep -Po 'driver-\d+-\d+'`
spark-submit --master spark://node-1:6066 --kill $driverid
通过使用
chmod+x
确保给予脚本执行权限,您可以在[spark]/work/中找到驱动程序id。id是目录名。通过spark submit终止作业。我也有同样的问题,我需要映射我的应用程序id和驱动程序id,并在独立模式下为其他应用程序可用性添加csv
kill -9 $(jps | grep SparkSubmit | grep -Eo '[0-9]{1,7}')
通过使用命令sparkContext.applicationId,我可以轻松地获取应用程序id
为了获取驱动程序id,我考虑在程序运行时使用shell命令pwd,驱动程序日志被写入名为driver id的目录中,因此我提取了文件夹名以获取驱动程序id
import scala.sys.process._
val pwdCmd= "pwd"
val getDriverId=pwdCmd.!!
val driverId = get_driver_id.split("/").last.mkString
如果我使用的是独立集群呢?有等效的方法吗?这帮了我大忙!谢谢
import scala.sys.process._
val pwdCmd= "pwd"
val getDriverId=pwdCmd.!!
val driverId = get_driver_id.split("/").last.mkString