如何配置Spark和OpenMPI集群共存的优先级?

How to configure priorities for Spark and OpenMPI to coexist on a cluster?

我们有一个小型集群 运行ning Spark 来从面向 public 的 Web 应用程序执行作业。这里使用 Spark 的目的是为 Web 应用程序提供高效的延迟,因此当提交作业时,它需要集群尽快响应。

但是大部分时间它都是空闲的。所以当需要的时候,Spark 需要快,但是当不需要的时候,我们想用其他方式使用这些计算资源。

例如,我们对 运行 进行了一些模拟,这些模拟将 OpenMP 用于本地线程,将 OpenMPI 用于跨集群分布处理。这些需要一些时间 运行,我们希望仅在 Spark 不需要时才使用集群。

是否可以将 Spark 配置为具有非常高的优先级并淘汰或饿死其他程序?从 Spark 的 configuration 我看到了几个关于限制内存和内核使用的选项,但与给予 Spark 更高的优先级没有太大关系。

我们正在考虑使用 Torque 来控制 OpenMPI 模拟的作业队列。我们正在考虑 运行 将它们放在 Docker 容器中,以便在开发过程中轻松更新它们。这个想法是发出一个 Torque 命令,它基本上会拉出一个 Docker 图像,在每台机器上启动它,然后触发 OpenMPI 应用程序。这也太绕了吧?还有其他建议吗?我们可以放弃 Torque 并直接使用 Spark 来控制 OpenMPI 作业吗?如果一个 Spark 作业具有更高的优先级,它可以中断另一个作业吗?

目前一切都在 运行Fedora 上。

tl;dr

这里更大的问题是,我们如何才能在集群上启动长期 运行 计算密集型分布式作业,同时仍然确保共存于同一硬件上的 Spark 实例具有良好的延迟?

** 这个 post 可能暴露了我对 Spark 相对不熟悉..

请注意,默认情况下,spark slave 会尝试使用它所在节点的所有资源 - 因此您的问题主要是关于如何降低节点中其他进程的优先级。

自动解决方案是使用漂亮的 Linux 命令 - 但它可能过于简单,具体取决于您的集群配置(让 spark 的优先级高于机器上的其他资源)。

另一种方法是实现您的自定义行为,这完全取决于您部署 spark 的方式、您使用的集群管理器以及集群中其他服务的性质。

例如 - 如果您使用 docker swarm 作为您的集群管理器并单独使用 spark,一种简单的方法可以实现此目的: 启动 spark slaves 和 运行(它们在空闲时不使用很多资源)以及相同节点上的更多服务。 当一个工作到达 spark 时——你可以缩小 spark 从属节点上的所有其他服务。如果您的其他服务可以关闭和启动,这将工作正常...

如果您使用 Mesos 作为您的集群管理器——您可以使用相同的技巧,您也可以实现您自己的 Mesos 调度器或分配器

顺便说一句 - 另一个简单的解决方案是只分配独特的资源来激发火花。我猜你已经考虑过了,但我敦促你再考虑一下 :-)。这样您就可以预测集群中所有其他服务的 SLA。

希望对您有所帮助。