我在我的机器v/sa3节点集群(spark2.4.5)上观察到spark和闭包在本地模式下的奇怪行为。
下面是一段代码
object Example {
val num=5
def myfunc={
sc.parallelize(1 to 4).map(_+num).foreach(println)
}
}
我预计这会失败,因为闭包中需要局部变量num,因此示例对象需要序列化,但它不能序列化,因为它不扩展可序列化接口。
当我在同一台本地机器上运行spark shell中的同一段代码时,它会失败,错误原因如下:
当我在一个3节点的emr集群上以yarn模式运行同一段代码时,它失败了,错误与上面的屏幕截图完全相同……给出了上面提到的相同原理。
当我在同一集群(=>主节点)上以本地模式运行同一段代码时,它也会失败。同样的道理仍然成立。
但是,当我从一个sbt项目运行时(不是spark安装或任何东西…只是在我的sbt项目中添加了spark库,并在本地模式下使用conf.master(local[…]),运行良好,并给出了6,7,8,9的o/p:
这意味着除了通过在sbt项目中添加spark依赖项来运行它之外,它在任何地方都可以正常运行。问题是,通过在sbt项目中简单地添加spark库,如何解释运行spark代码时不同的本地模式行为?
暂无答案!
目前还没有任何答案,快来回答吧!