在集群模式下,如何编写一个闭包函数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
内部使用。
答案 0 :(得分:4)
换句话说,工作者可以访问变量N,该变量N在f1外部定义但在驱动程序节点的f1内部使用。
种类。
但是,当计算这段代码时,Spark会分析f1
定义,确定闭包中存在的变量,并将它们与f1
一起序列化。
因此,当实际调用该函数时,作用域中将存在父环境的本地副本。
牢记这两件事,我们可以回答这个问题:
我没有任何集群,我真的想知道它是否可以在集群模式下工作?
是的,它将在分布式集群上正常工作。
但是,如果您尝试修改通过闭包传递的对象,则更改将不会传播,并且只会影响本地副本(换句话说,甚至不要尝试)。