理解火花中的闭包

Gar*_*vey 1 apache-spark pyspark

在集群模式下,如何编写一个闭包函数f让每个 worker 访问变量的副本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()
Run Code Online (Sandbox Code Playgroud)

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

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

小智 5

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

的种类。

  • 节点之间没有共享内存,包括工人和驱动程序。因此 worker 无法访问驱动器上的变量。
  • 然而,当这段代码被计算时,Spark 将分析f1定义,确定闭包中存在的变量,并将它们与f1.

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

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

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

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

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