我知道它利用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中搜索了与广播相关的源代码,但没有得到任何线索。
答案 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来广播变量,但我们是 开发更高效的流媒体广播系统。