我正在构建一个使用Scala-Spark / SQL启动用户构建的查询(业务规则)的过程。其中一个要求是,如果SQL执行速度低于预期(每个规则都有预期的性能(以秒为单位的时间)属性),我需要将它们标记为将来的引用,以及终止长时间运行(慢速)进程/作业,
到目前为止,我正在考虑以下方法 -
我担心我正在摆弄工作的分布式性质。另一个问题是,对于我的“工作”(运行该查询),内部的spark将在节点之间启动未知数量的任务,时序过程将如何工作,哪些实际性能应报告给我的程序! !
建议请..
答案 0 :(得分:1)
我建议使用不同的方法:构建streaming / scheduled batch application
,在新输入数据到达时将状态更新为DB
,然后根据客户端要求的查询范围提供rest api
访问该状态。根据我的经验,允许客户推出一系列spark jobs
将使您在管理其性能和数量时面临巨大的运营开销 - >集群资源的影响。您可以更轻松地调整和监控并生成查询:partitions
,cores / executor nos
- 最佳群集资源并管理查询休息API。如果这不适合您:通过允许用户为每个查询启动自己的spark - job
来构建rest api,例如:spark hidden api 1,spark hidden api 1,spark job server,然后构建监视spark ui
并杀死的应用程序 - >重新启动如果太长,您可以使用该脚本作为示例kill spark job via spark ui。您计划的方法可能很难执行,因为spark本身会启动多个future
作业,其中许多是懒惰实现的,并且每个执行阶段的计时很难,也许您可以使用future
来启动{每spark job
{1}}并监控其长度?我希望它有所帮助