定时一个火花过程,如果太慢,就把它杀掉

时间:2017-05-01 15:32:44

标签: multithreading performance scala apache-spark

我正在构建一个使用Scala-Spark / SQL启动用户构建的查询(业务规则)的过程。其中一个要求是,如果SQL执行速度低于预期(每个规则都有预期的性能(以秒为单位的时间)属性),我需要将它们标记为将来的引用,以及终止长时间运行(慢速)进程/作业,

到目前为止,我正在考虑以下方法 -

  1. 开始时间
  2. 在scala future中启动作业 - 主题
  3. 等待工作时间
  4. 如果线程未在预期的时间内完成,则终止该作业并将其报告为缓慢的过程
  5. 我担心我正在摆弄工作的分布式性质。另一个问题是,对于我的“工作”(运行该查询),内部的spark将在节点之间启动未知数量的任务,时序过程将如何工作,哪些实际性能应报告给我的程序! !

    建议请..

1 个答案:

答案 0 :(得分:1)

我建议使用不同的方法:构建streaming / scheduled batch application,在新输入数据到达时将状态更新为DB,然后根据客户端要求的查询范围提供rest api访问该状态。根据我的经验,允许客户推出一系列spark jobs将使您在管理其性能和数量时面临巨大的运营开销 - >集群资源的影响。您可以更轻松地调整和监控并生成查询:partitionscores / executor nos - 最佳群集资源并管理查询休息API。如果这不适合您:通过允许用户为每个查询启动自己的spark - job来构建rest api,例如:spark hidden api 1spark hidden api 1spark job server,然后构建监视spark ui并杀死的应用程序 - >重新启动如果太长,您可以使用该脚本作为示例kill spark job via spark ui。您计划的方法可能很难执行,因为spark本身会启动多个future作业,其中许多是懒惰实现的,并且每个执行阶段的计时很难,也许您可​​以使用future来启动{每spark job {1}}并监控其长度?我希望它有所帮助