我想知道当启用cgroup时,Spark在细粒度模式下对Mesos的行为是什么。
一个值得关注的问题是,当我使用没有cgroups的Mesos + spark时,它已经表明实际的spark执行器进程使用的内存至少比它承诺给Mesos使用的内存多10%。启用cgroup时,是否会终止Spark-executors?
其次,如何处理文件缓存? Spark很大程度上依赖于文件缓存。文件缓存是否计入Mesos中的内存量?可能不是,但我们可以影响这个吗?所以例如,理想情况下我希望Spark总共使用8GB,其中5GB应该用于java进程 - 假设spark运行良好并且不会超过5GB - 并且3GB应该用作文件缓存(max )。
我希望有人有这方面的经验,因为为了自己测试这些东西,我必须经历我们的集群系统管理员的大量支持请求,因为cgroups一度依赖root凭据 - 我讨厌没有问别人,这是徒劳的。
答案 0 :(得分:0)
要回答你的第一个问题,你似乎对cgroups的运作方式感到困惑。执行程序根本不会(我确实可以确实)能够分配比cgroup允许的内存更多的内存。因此,Mesos实际上不会充当过程杀手或任何东西*。但是,某些类型的程序确实会因无法分配更多内存而中断,如果它随后退出,或者能够正常运行,但可能具有更少的内存和/或性能,则取决于程序。
对于第二个问题,似乎没有任何配置设置来影响实际的cgroup内存量。执行程序内存设置与Spark从Mesos获取的内容之间似乎存在一对一映射。但是,我确实认为有一个隐藏的因素,因为我可以看到Spark大约要求5.8GB,但实际上我将执行程序内存设置为5GB。 (一旦我在源代码中找到这个隐藏因子大概15%,我就会更新票证。)
更新,您需要的设置为spark.mesos.executor.memoryOverhead
。您可以将MegaBytes中的数字添加到执行程序内存中作为将用作Mesos资源的总内存,从而作为cgroup内存限制。
* = Update2,实际上cgroups默认会杀死超出控制组限制的进程。我可以确认memory.oom_control
中的/cgroups/memory/x/
设置为'0'(反直觉地启用)。但是在Spark的情况下,它是前提的10-15%的开销,它给予了足够的余地,不会遇到OOM。