pyspark广播变量如何工作

时间:2014-11-26 09:06:10

标签: python apache-spark

我知道它利用pickle并跨节点运送东西并保存在内存中等等。令我困惑的是为什么在pyspark中使用它的语法工作。

def main():
    sc = SparkContext()
    someValue = rand()
    V = sc.broadcast(someValue)
    A = sc.parallelize().map(worker)

def worker(element):
    element *= V.value

为什么上面的代码没有得到“V”未定义的投诉?我在pyspark中搜索了与广播相关的源代码,但没有得到任何线索。

2 个答案:

答案 0 :(得分:3)

我相信你的问题只是一个Python范围问题。如果您尝试以下非Spark Python代码,它同样会出现错误,“'V'未定义”:

def runner(func):
    func()

def main():
    V = 22
    A = runner(worker)

def worker():
    print V

if __name__ == '__main__':
    main()

一种解决方法是,您可以将worker()移到main()内(或者,将V设为全局变量):

def main():
    sc = SparkContext()
    someValue = rand()
    V = sc.broadcast(someValue)
    def worker(element):
        element *= V.value
    A = sc.parallelize().map(worker)

答案 1 :(得分:1)

来自Spark研究论文 Spark: Cluster Computing with Working Sets Matei Zaharia,Mosharaf Chowdhury,Michael J. Franklin,Scott Shenker,Ion Stoica。 HotCloud 2010. 2010年6月。

  

共享变量:中的两种共享变量   实现了Spark,广播变量和累加器   使用具有自定义序列化格式的类。   当一个人创建一个值为v的广播变量b时,   v保存到共享文件系统中的文件中。序列化   b的形式是此文件的路径。当查询b的值时   在工作节点上,Spark首先检查v是否在a中   本地缓存,如果不是,则从文件系统中读取。   我们最初使用HDFS来广播变量,但我们是   开发更高效的流媒体广播系统。