Apache spark 全局变量是否会(在RAM中)复制到每个工作进程上的每个处理器?

Apache spark 全局变量是否会(在RAM中)复制到每个工作进程上的每个处理器?,apache-spark,pyspark,Apache Spark,Pyspark,假设我有一个大的rdd,我想应用一个使用全局变量的函数。我的问题是:全局文件被复制了多少次 假设我有一个驱动节点和两个工作节点,每个工作节点有4个处理器。全局变量是否会被复制(在RAM中)8次(对于每个工作节点上的每个处理器)?rdd拥有的分区数量是不相关的(只要不少于8个),对吗 换句话说,如果我的全局/共享数据结构占用100Mbs的RAM,那么如果一个工人有4个处理器,那么在给定的工人上它将占用400Mbs的RAM,对吗 下面是我所说的一个伪溺爱的例子: from pyspark impor

假设我有一个大的
rdd
,我想应用一个使用全局变量的函数。我的问题是:全局文件被复制了多少次

假设我有一个驱动节点和两个工作节点,每个工作节点有4个处理器。全局变量是否会被复制(在RAM中)8次(对于每个工作节点上的每个处理器)?rdd拥有的分区数量是不相关的(只要不少于8个),对吗

换句话说,如果我的全局/共享数据结构占用100Mbs的RAM,那么如果一个工人有4个处理器,那么在给定的工人上它将占用400Mbs的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
我知道我可能应该在这里使用
广播
,但我试图确保我了解在发生全局事件时会发生什么。

根据

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


由于PySpark使用n个活动工作线程和m个分区在单独的解释器中执行任务,因此必须将变量传输n次,并反序列化m次(每个活动Python进程一次)。因此PySpark中的最高内存使用量应该大致为序列化结构的
大小
+
#python进程
*
反序列化结构的大小

谢谢你的回答,但我还是不完全明白。如果工作节点有4个核心,则将在该工作节点上运行4个任务。对象被反序列化后,将在RAM中对其进行排序,对于每个任务,这将在工作进程上发生4次。那么共享变量将在工作机上的RAM中存储4次?这是我的理解,错了吗?这很有道理。非常感谢。