【问题标题】:how does pyspark broadcast variables workpyspark 广播变量如何工作
【发布时间】:2014-11-26 09:06:10
【问题描述】:

我知道它利用 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中搜索了广播相关的源代码,但没有得到任何线索。

【问题讨论】:

    标签: python apache-spark


    【解决方案1】:

    我相信您的问题只是 Python 范围问题。如果您尝试以下非 Spark Python 代码,同样会出现“'V' is not defined”的错误:

    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)
    

    【讨论】:

    【解决方案2】:

    来自 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 是否在 本地缓存,如果不是,则从文件系统中读取。 我们最初使用 HDFS 来广播变量,但我们是 开发更高效的流媒体广播系统。

    【讨论】:

    • 谢谢@Shawn,但这并不能回答我关于“语法”的问题。
    猜你喜欢
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 2018-12-24
    相关资源
    最近更新 更多