bro
в двух случаях совершенно иная. В первом случае это поле для экземпляра одноэлементного класса (TryBroadcast
). Во втором он является локальной переменной.
I локальная переменная захватывается, сериализуется и отправляется исполнителям. В первом случае ссылка на поле, поэтому синглтон будет захвачен и отправлен. Я не знаю, как построен синглтон Scala и как он захватывается. По-видимому, в этом случае он заканчивается неинициализированным при доступе к исполнителю.
Вы можете сделать bro
локальную переменную следующим образом:
object TryBroadcast extends App {
val conf = new SparkConf().setAppName("o_o")
val sc = new SparkContext(conf)
val sample = sc.parallelize(1 to 1024)
val broSample = {
val bro = sc.broadcast(6666)
sample.map(x => x.toString + bro.value)
}
broSample.collect().foreach(println)
}