3

我想知道当启用 cgroup 时,在 Mesos 上细粒度模式下 Spark 的行为会是什么。

一个问题如下:当我在没有 cgroups 的情况下使用 Mesos+spark 时,它已经表明实际的 spark 执行器进程使用的内存至少比它向 Mesos 承诺的要多使用 10%。启用 cgroups 时,它会杀死 Spark-executors 吗?

其次,文件缓存是如何处理的?Spark 严重依赖文件缓存。文件缓存是否计入 Mesos 中的内存量?可能不会,但我们能影响这个吗?例如,理想情况下,我希望 Spark 总共使用 8GB,其中 5GB 应该用于 java 进程——假设 spark 运行良好并且不会增长超过 5GB——并且应该使用 3GB 作为文件缓存(最大)。

我希望有人有这方面的经验,因为为了自己测试这些东西,我必须通过集群系统管理员的大量支持请求,因为 cgroups 在某一时刻依赖于 root 凭据——我讨厌这样没有问过别人是徒劳的。

4

1 回答 1

0

要回答您的第一个问题,您似乎对 cgroups 的工作方式有些混淆。执行程序根本不会(而且确实如此,正如我可以确认的那样)能够分配比 cgroups 允许的更多的内存。因此,Mesos 实际上不会充当进程杀手或任何东西*。但是,某些类型的程序确实会因为无法分配更多内存而中断,这取决于程序是否退出,或者能够正常运行,但可能内存和/或性能更少。

对于您的第二个问题,似乎没有任何配置设置来影响实际的 cgroup 内存量。执行程序内存设置与 Spark 从 Mesos 获得的内容之间似乎存在一对一的映射。但是,我确实认为有一个隐藏的因素,因为我可以看到 Spark 要求大约 5.8GB,但实际上我将执行程序内存设置为 5GB。(一旦我在源代码中找到这个可能 15% 的隐藏因素,我就会更新票证。)

更新,你想要的设置是spark.mesos.executor.memoryOverhead. 您可以给出一个以兆字节为单位的数字,该数字将作为将用作 Mesos 资源的总内存添加到执行程序内存中,从而作为 cgroup 内存限制。

*=Update2,实际上 cgroups 默认会杀死超出控制组限制的进程。我可以确认memory.oom_controlin/cgroups/memory/x/设置为“0”(这违反直觉是启用的)。然而,在 Spark 的情况下,正是上述 10-15% 的开销为不遇到 OOM 提供了足够的余地。

于 2016-06-12T13:00:31.627 回答