Contacta con nosotros.

+34 941 123 251

comunicacion@bosonit.com

Bosonit Agile Center

Portales 71, 2º Of. 7,8,9 y 10. LOGROÑO

Isabel la Católica, 6. (Edificio Hiberus). ZARAGOZA

Salvador Granes, 3. MADRID

San Esteban de Etxebarri, 8. BILBAO

Contacta con nosotros.
Back to top

Bosonit

  /  Big Data   /  In a Nutshell: Spark como evaluador perezoso

En este pequeño artículo vamos a explicar un concepto básico en computación distribuida: Spark como evaluador perezoso. Hay algunos conceptos básicos (RDD, Dataframe, HDFS …) que no se van a explicar en orden de conseguir una mayor concisión en el presente artículo.

Es importante conocer primero que el lema de HDFS es “Write once, read many”, pues no se espera que un fichero almacenado en HDFS cambie; es por esto que todas las transformaciones que realizamos sobre un RDD o Dataframe se realizarán en memoria RAM (sin persistir en físico salvo que especifiquemos lo contrario) y que estos tipos de datos no están pensados para el borrado simple de elementos.

La funcionalidad de Spark se divide en dos tipos de operaciones: acciones y transformaciones; las acciones devuelven cualquier tipo de dato excepto un RDD, mientras que las transformaciones devuelven exclusivamente un RDD.

Esto tiene algunas consecuencias, como que Spark sea un “evaluador perezoso”: Spark sólo ejecutará las transformaciones indicadas por el usuario cuando detecte una acción. Es decir, el usuario puede incluir en su código multitud de transformaciones que se añaden a una lista, pero dichas transformaciones solo se ejecutarán cuando se detecte una acción.

Este tipo de ejecución es consecuencia directa de que Spark sea un framework para el procesado masivo de datos, pues evita cargar siempre todos los datos en memoria y solo cargará los datos necesarios, ya que solo conocemos los datos en los que el usuario está interesado cuando se ejecuta una acción.

Un ejemplo muy sencillo de las ventajas de que Spark sea un “lazy evaluator”:

Suponemos que tenemos un archivo “palabras.txt” que contiene las siguientes líneas:

 

 

 

 

 

Ahora, aplicamos las siguientes operaciones:
val lines = sc.textFile(“palabras.txt”) //Cargamos el fichero en un RDD
val filtered = lines.filter(line => line.contains(“palabra1”))
//Filtramos las líneas que contienen una determinada palabra
filtered.first() //Mostramos la primera línea del nuevo RDD filtrado.
//res0: String = Linea1 palabra1

Si Spark evaluase cada línea inmediatamente, primero leería el fichero entero, luego aplicaría una transformación de filtrado (filter) y mostraría la primera línea del resultado filtrado. Esto significaría mucho más trabajo extra y una utilización de memoria innecesaria. Para un archivo tan pequeño la diferencia es nimia, pero para un archivo del orden de varios gigabytes, la diferencia en eficiencia comienza a ser considerable.

De otra forma, en el modo de “evaluación perezosa”, Spark primero crea la matriz de operaciones (contiene las operaciones a realizar para obtener el resultado esperado de la acción de la forma más eficiente posible), y luego, aplicando técnicas de optimización entiende que leer todo el fichero no es necesario, ya que, en este caso, el mismo resultado puede ser obtenido simplemente leyendo la primera línea del fichero.

Autor: Iván Gómez, Consultor en tecnología Big Data.


¿Quieres más información?