是否将全局变量(在RAM中)复制到每个工作者的每个处理器上?

时间:2016-04-11 15:33:20

标签: apache-spark pyspark

我们说我有大rdd,我想应用使用全局的函数。我的问题是:全局被复制多少次。

让我们说我有一个驱动程序节点和2个工作节点,其中每个工作程序有4个处理器。全局变量是否会被复制(在RAM中)8次(对于每个工作节点上的每个处理器)? rdd所拥有的分区数量不相关(只要它不小于8),对吗?

换句话说,如果我的全局/共享数据结构占用100 MB的RAM,如果一个工作人员有4个处理器,它将占用给定工作者400 MB的RAM,对吗?

以下是我所谈论的伪编码示例:

from pyspark import SparkContext

sc = SparkContext(appName="myApp)

my_dict = {"a": 1, "b": 2, "c": 3, "d": 4} # at no point will be modified

def my_func(letter):
    return my_dict[letter]

my_list_rdd = # Make my rdd

result = my_list_rdd.map(lambda x: my_func(x))

# do something with result

我知道我应该在这里使用broadcast,但我试图确保我理解全局变量的情况。

1 个答案:

答案 0 :(得分:3)

根据programming guide

  

Spark会自动广播每个阶段中任务所需的公共数据。以这种方式广播的数据以序列化形式缓存并在运行每个任务之前反序列化。

由于PySpark使用 n 活动工作人员在单独的解释中执行任务,而 m 分区变量必须转移 n 次并反序列化 m 次(每个活动Python进程一次)。因此,PySpark中的最高内存使用量应大致为size-of-serialized-structure + #python-processes * size-of-deserialized-structure