我们有一个运行spark的小集群,用于从面向公共的web应用程序执行作业。在这里使用spark的目的是为web应用程序提供一个有效的延迟,因此当提交作业时,它需要来自集群的尽快响应。
不管它有多空闲。所以当需要的时候,spark需要很快,但是当不需要的时候,我们希望以其他方式使用这些计算资源。
例如,我们要运行一些模拟,使用openmp进行本地线程处理,使用openmpi在集群中分布处理。这些需要一些时间来运行,并且我们只希望在spark不需要集群时使用集群。
是否可以将spark配置为具有非常高的优先级并取消或耗尽其他程序?从spark的配置中,我看到了几个限制内存和内核使用的选项,但与赋予spark更高的优先级关系不大。
我们正在考虑使用torque来控制openmpi模拟的作业队列。我们正在考虑在docker容器中运行它们,以便在开发过程中方便地更新它们。这个想法是发出一个torque命令,它基本上会拉一个docker映像,在每台机器上启动它,并触发openmpi应用程序。这是不是太复杂了?还有其他建议吗?我们可以降低转矩,直接使用spark来控制openmpi作业吗?如果一个spark作业具有更高的优先级,它能中断另一个spark作业吗?
目前一切都在软呢帽上运行。
热释光;博士
这里更大的问题是,我们如何在集群上启动长时间运行的计算密集型分布式作业,同时确保来自同一硬件上共存的spark示例的良好延迟?
**这篇文章可能暴露了我对spark的相对陌生。。
1条答案
按热度按时间6ju8rftf1#
请注意,默认情况下,spark slave会尝试使用其所在节点的所有资源—因此您的问题主要是如何降低节点中其他进程的优先级。
一个自动的解决方案是使用nice linux命令,但是它可能过于简化,这取决于您的集群配置(给spark比您机器上的其他资源更高的优先级)。
另一种方法是实现您的自定义行为,这完全取决于您如何部署spark、使用哪个集群管理器以及集群中其他服务的性质。
例如,如果您将docker swarm与spark单机版一起用作群集管理器,那么有一种简单的方法可以实现这一点:将spark从属服务器与相同节点上的更多服务一起启动并运行(空闲时它们不会使用很多资源)。当一个作业到达spark时,您可以缩小spark从属节点上的所有其他服务。如果您的其他服务可以上下浮动,这将很好地工作。。。
如果您使用mesos作为集群管理器,您可以使用相同的技巧,还可以实现自己的mesos调度器或分配器
顺便说一句-另一个简单的解决方案是只分配独特的资源,以Spark。我想你已经考虑过了,但我劝你再考虑一下:-)。这样,您也可以预测集群中所有其他服务的sla。
希望这有帮助。