Потому что, если вы просто используете локальную переменную, т.е. val data = list(1, 4, 5)
, Spark упакует это и отправит вместе с вашим кодом для каждой задачи!
В случае трансляции val broadcastData = sc.broadcast(data)
будет скопирован на каждого исполнителя и, следовательно, доступен локально.
В некоторых случаях у вас могут быть данные большого размера, и вы хотите избежать сериализации этих данных для каждой задачи, вместо этого вы можете отправить их каждому исполнителю с помощью broadcast
, тогда эти задачи могут быть доступны локально для этих задач.
UPDATE:
Как упомянул @Fish, кажется, что Spark внутренне использует широковещание для распространения данных задач, это можно увидеть в методе submitMissingTasks
здесь:
https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/scheduler/DAGScheduler.scala
Хотя сериализованный размер задачи не должен превышать 1 МБ, как определено TaskSetManager.TASK_SIZE_TO_WARN_KIB
.