Apache spark 提交&;从另一个应用程序以编程方式终止Spark应用程序

Apache spark 提交&;从另一个应用程序以编程方式终止Spark应用程序,apache-spark,Apache Spark,我想知道是否可以提交,监控,终止其他服务的spark应用程序 我的要求如下: 我写了一个服务 解析用户命令 将它们转换为可理解的参数到已准备好的Spark SQL应用程序 使用来自ProcessBuilder的Spark submit将应用程序连同参数一起提交到Spark Cluster 并计划在群集模式下运行生成的应用程序驱动程序 其他需要: 查询有关应用程序的状态,例如,百分比保持不变 Kill随机查询 我在suggest kill应用程序中发现了以下内容: ./bin/spark-cl

我想知道是否可以提交监控终止其他服务的spark应用程序

我的要求如下:

我写了一个服务

  • 解析用户命令
  • 将它们转换为可理解的参数到已准备好的Spark SQL应用程序
  • 使用来自ProcessBuilder的Spark submit将应用程序连同参数一起提交到Spark Cluster
  • 并计划在群集模式下运行生成的应用程序驱动程序
  • 其他需要:

    • 查询有关应用程序的状态,例如,百分比保持不变
    • Kill随机查询
    我在suggest 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主日志中,它将显示为“完成”

    老实说,我不喜欢这个解决方案,但到目前为止,这是我知道的杀死应用程序的唯一方法。

    以下是我的做法:

  • 要提交应用程序,请使用(隐藏)Spark REST提交API:

    • 通过这种方式,您可以获得一个DriverID(submissionId下),以后可以使用它终止作业(您不应该终止应用程序,特别是在独立模式下使用“监督”时)
    • 此API还允许您查询驱动程序状态
  • 使用(也隐藏)UI Json API查询应用程序的状态:

    • 此服务以JSON格式公开主UI上的所有可用信息
  • 您还可以使用“公共”RESTAPI查询主应用程序或每个辅助应用程序上的执行程序,但这不会公开驱动程序(至少从Spark 1.6开始不会)


  • 您可以使用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