Python Spark,从Executor访问类静态变量

时间:2016-02-10 23:45:41

标签: python python-3.x apache-spark pyspark

我有一个类,它有一些静态变量来保存我的代码配置。我初始化master中的变量,并希望在执行程序中访问它们。我看到的是,当我在执行程序中使用它们时,它们没有被初始化。想知道我如何初始化执行程序中的变量。

class EnvVariables:
    attributes = {}
    allTags = ["UNK"]
    similarityDicts = []
    mergeThreshold = 0.5

def readAttrConfig(cpath):
    EnvVariables.attributes.update(BLAH)
    EnvVariables.allTags.append(BLAH)

当我在master中打印变量时,我发现它们具有正确的值,但在执行程序中它们没有被初始化。

2 个答案:

答案 0 :(得分:1)

这是预期的行为。 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
    

答案 1 :(得分:0)

'未初始化'是什么意思?班上所有工人的价值观仍将反映 -

attributes = {}
allTags = ["UNK"]
similarityDicts = []
mergeThreshold = 0.5

他们将保留所有工人的这些价值观。它们当然不会更新每个工人(当更新其中一个工人时),因为它们存在于不同的机器上。

广播变量在你希望变量之间保持一致性的地方派上用场。

对于这些变量是只读的或者您希望它们为每个工作者(如kafka生产者)单独存在的情况,云端数据库的描述方式正常。

我认为“未初始化”这一短语应更新为“未更新”。