我正在尝试确定在使用spark_apply
时应将哪些内存分配给Spark执行程序/驱动程序。
问题可以归结为应该为驱动程序和执行程序分配多少内存,以及如何在spark app /用户内存块/其他任何地方分配内存?
示例
作为一个例子,假设有一个输入spark数据帧,其中包含10亿个整数的向量,这些整数被划分为10个相等大小的块,然后传递给spark_apply
的函数将获取每个分区并输出4个输入的副本(端到端连接)。另外,假设执行程序有1个核心,驱动程序在生成的火花数据帧上执行collect
。我还将暂时忽略系统/ JVM / R开销。
执行者
每个输入分区为4个字节* 1e9 / 10 = 0.4GB。每个输出分区为0.4GB * 4 = 1.6GB。
有一种想法是,我需要至少0.4gb的内存用于输入spark对象,0.4gb用于R中该对象的副本,1.6gb用于R数据帧结果,以及1.6gb用于该对象被复制到生成的火花数据帧(即4gb)。但是,如果Spark输入或输出都没有被缓存,那么如果Spark数据以小比特流式传输到R(或者主内存使用只是输入和输出R数据帧),我可能只需要2gb。
我还假设R进程从“用户”内存块中获取内存(参见here)。如果是这样,在上面的4gb情况下,内存应该以50:50分割,在0.8gb的情况下,应该将几乎所有内容分配给用户内存块。
驱动程序
对于执行程序,根据处理spark数据帧的方式,我可能需要16GB(如果生成的spark数据帧没有缓存,数据流入R对象)或32GB(如果是spark)数据框在被复制到R对象之前完全具体化。对火花和用户内存块之间的分割也有类似的考虑。