我有一个类,其中有一些静态变量来保存代码的配置。我在主程序中初始化变量并希望在执行程序中访问它们。我看到的是,当我在执行器中使用它们时,它们没有初始化。想知道如何初始化执行器中的变量。
class EnvVariables:
attributes = {}
allTags = ["UNK"]
similarityDicts = []
mergeThreshold = 0.5
def readAttrConfig(cpath):
EnvVariables.attributes.update(BLAH)
EnvVariables.allTags.append(BLAH)
当我在主程序中打印变量时,我看到它们具有正确的值,但在执行程序中它们未初始化。
最佳答案
这是预期的行为。 Python 类在每个执行器上独立导入,因此您对驱动程序应用的任何更改在执行器线程中都不会可见。由于 Python 类不可序列化,因此在技术上不可能传播这些更改。
这里最简单的解决方案可能是使用在驱动程序上初始化的对象传递所需的配置,可以序列化并传递给执行器。
或者,您可以使用 SparkFiles
分发配置文件,并在导入包含 EnvVariables
的模块时读取这些文件:
envvariables.py
from pyspark import SparkFiles class EnvVariables: attributes = {} allTags = ["UNK"] similarityDicts = [] mergeThreshold = 0.5 with open(SparkFiles.get("config")) as fr: EnvVariables.attributes.update({"a": 1}) EnvVariables.allTags.append("b")
主要脚本:
from pyspark import SparkContext, SparkFiles sc = SparkContext() sc.addFile("config") from envvariables import EnvVariables
关于Python Spark,从执行器访问类静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35328214/