¿Se puede enviar activamente la transmisión de variables de transmisión de Spark a cada nodo antes de la ejecución de la tarea?
Normalmente, cuando una función se pasa a una operación de Spark (por ejemplo, mapear, reducir), se ejecutará en un nodo del clúster remoto, que utilizará una copia de todas las variables en la función. Estas variables se copian en todas las máquinas y las variables que no se actualizan en las máquinas remotas se devuelven al controlador. El uso de variables universales de lectura y escritura entre tareas es ineficiente. No obstante, Spark proporciona dos tipos limitados de variables compartidas, variables de transmisión y acumuladores.
Variables de transmisión
Las variables de transmisión permiten a los programadores almacenar en caché variables de solo lectura en cada máquina sin pasar variables entre tareas. Spark también intenta utilizar un algoritmo de transmisión para distribuir variables de manera eficiente, reduciendo así la sobrecarga de comunicación.
Las operaciones de Spark se realizan como una serie de pasos separados por una operación aleatoria distribuida. Spark transmite automáticamente los datos comunes requeridos por cada tarea en cada paso. Estos datos de transmisión se almacenan en caché en serie y se deserializan antes de ejecutar la tarea. Esto significa que la creación explícita de variables de transmisión es útil cuando necesitamos usar los mismos datos entre tareas en múltiples etapas o cuando necesitamos almacenar en caché datos en un formato deserializado.
Las variables de transmisión se pueden crear llamando a SparkContext.broadcast(v) en la variable v. Ejemplo:
scalagt; val broadcastVar = sc.broadcast(Array(1, 2, 3))
broadcastVar: org.apache.spark.broadcast.Broadcast[Array[Int] ] = Broadcast(0)
scalagt; broadcastVar.value
res0: Array[Int] = Array(1, 2, 3)
Crear variable de transmisión Después de eso, esta variable debe usarse en todas las funciones del clúster en lugar de usar v. Además, para garantizar que todos los nodos obtengan las mismas variables, el objeto v no debe modificarse después de la transmisión.