Spark contiene dos tipos diferentes de variables compartidas, una de ellas variables de transmisión y el segundo acumuladores…
Variables de difusión – se utiliza para la distribución eficiente de valores grandes.
BaterÃas – se utiliza para agregar información de una colección especÃfica.
Las variables de difusión permiten al programador almacenar una variable de solo lectura en un caché en cada máquina, en lugar de enviar una copia junto con las tareas. Se pueden usar, por ejemplo, para proporcionar de manera eficiente a cada nodo una copia de un gran conjunto de datos de entrada. Spark también intenta asignar variables de transmisión utilizando algoritmos de transmisión eficientes para mantener bajos los costos de comunicación.
Las acciones de Spark se realizan a través de un conjunto de etapas separadas por operaciones distribuidas «aleatoriamente». Spark comunica automáticamente los datos compartidos necesarios para las tareas en cada etapa.
Los datos que se pasan de esta manera se almacenan en caché en forma serializada y se deserializan antes de ejecutar cada tarea. Esto significa que la creación explÃcita de variables de difusión solo es útil cuando las tareas de varios pasos requieren los mismos datos o cuando es importante almacenar en caché los datos en forma deserializada.
Las variables de difusión se crean a partir de una variable v vocación SparkContext.broadcast (v)… La variable de traducción es un envoltorio vy su valor se puede obtener llamando agradecer método. El siguiente código muestra esto:
scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))
Salida –
broadcastVar: org.apache.spark.broadcast.Broadcast[Array[Int]] = Broadcast(0)
Después de crear una variable de transmisión, debe usarse en lugar del valor v en cualquier función que se ejecute en el clúster, por lo que v no se entrega a los nodos más de una vez. Además, el objeto v no debe cambiarse después de su transmisión para garantizar que todos los nodos reciban el mismo valor de variable de transmisión.
Los acumuladores son variables que se les «agregan» solo a través de una operación asociativa y, por lo tanto, pueden mantenerse efectivamente en paralelo. Se pueden usar para implementar contadores (como en MapReduce) o sumas. Spark admite de forma nativa acumuladores de tipos numéricos, y los programadores pueden agregar soporte para nuevos tipos. Si las baterÃas se crean con un nombre, aparecerán en Interfaz de usuario de Spark… Esto puede resultar útil para comprender el progreso de los pasos (NOTA: aún no es compatible con Python).
El acumulador se crea a partir del valor inicial. v vocación SparkContext.accumulator (v)… Luego, las tareas que se ejecutan en el clúster se pueden agregar usando añadir o el operador & plus; = (en Scala y Python). Sin embargo, no pueden leer su significado. Solo el software del controlador puede leer el valor de la baterÃa usándolo agradecer método.
El siguiente código muestra el acumulador utilizado para sumar los elementos de la matriz:
scala> val accum = sc.accumulator(0) scala> sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum += x)
Si desea ver la salida del código anterior, use el siguiente comando:
scala> accum.value
res2: Int = 10
Spark le permite realizar varias operaciones en datos numéricos utilizando uno de los métodos API predefinidos. Las operaciones numéricas de Spark se implementan mediante un algoritmo de transmisión que crea el modelo un elemento a la vez.
Estas operaciones se evalúan y devuelven como Contador de estado objeto llamando estado() método.
A continuación se muestra una lista de los métodos numéricos disponibles en Contador de estado…
S. No | Métodos y significado |
---|---|
uno |
pensar() El número de elementos en el SDR. |
2 |
Tenga en cuenta() Valor medio de elementos en DEG. |
3 |
Suma () El costo total de los elementos en DEG. |
cuatro |
Máximo() El valor máximo entre todos los elementos del SDR. |
cinco |
Min () El valor mÃnimo entre todos los elementos del DEG. |
6 |
Dispersión () Dispersión de elementos. |
7 |
Stdev () Desviación Estándar. |
Si solo desea utilizar uno de estos métodos, puede llamar al método correspondiente directamente en el RDD.
🚫