了解火花闭合

时间:2018-10-12 10:32:38

标签: apache-spark pyspark

在集群模式下,如何编写一个闭包函数f以使每个工作人员都可以访问变量N的副本。

N=5
lines=sc.parallelize(['early radical', 'french revolution','pejorative way', 'violent means'])
def f1(line):
    return line[:N]
l=lines.map(f1)
l.collect()

我正在尝试找出我的理解是否正确。在我的示例中,f1在本地模式下工作。

我没有任何集群,我真的想知道它是否可以在集群模式下工作?换句话说,worker是否可以访问变量N,该变量在f1外部定义但在驱动程序节点的f1内部使用。

1 个答案:

答案 0 :(得分:4)

  

换句话说,工作者可以访问变量N,该变量N在f1外部定义但在驱动程序节点的f1内部使用。

种类。

  • 节点之间(包括工作程序和驱动程序)没有共享内存。因此,工作者无法访问驱动器上的变量。
  • 但是,当计算这段代码时,Spark会分析f1定义,确定闭包中存在的变量,并将它们与f1一起序列化。

    因此,当实际调用该函数时,作用域中将存在父环境的本地副本。

牢记这两件事,我们可以回答这个问题:

  

我没有任何集群,我真的想知道它是否可以在集群模式下工作?

是的,它将在分布式集群上正常工作。

但是,如果您尝试修改通过闭包传递的对象,则更改将不会传播,并且只会影响本地副本(换句话说,甚至不要尝试)。