Spark 2.0 estará entre nosotros en los próximos meses, nuestro amado Framework de procesamiento en paralelo va a sufrir un gran cambio y debemos estar preparados para afrontarlo.
Durante meses la comunidad y Databricks han estado trabajando en Spark para atender a todas las peticiones de usuarios, se han esforzado en desarrollar potentes utilidades y en continuar haciendo de Spark la herramienta numero uno de Big Data.
2. Quién soy
SPARK 2.0
José Carlos García Serrano
Arquitecto Big Data en Stratio.
Granadino e ingeniero por la ETSII, master de Big Data en la
UTad, certificado en Spark y AWS
Amante de las nuevas tecnologías y de las arquitecturas
basadas en Big Data
FanBoy de cosas como:
● Scala
● Spark
● Akka
● MongoDB
● Cassandra
Pero todos tenemos un pasado:
● Delphi
● C++
● BBDD SQL
● Hadoop
3. José Carlos García Serrano
Arquitecto Big Data
jcgarcia@stratio.com
CONTACTO
DICE
INTRODUCCIÓN1 2 3OPTIMIZACIÓN
• Memoria
• Funciones
SPARK CORE
• Acumuladores
• Block Manager
SPARK SQL
• Spark Session
• DataSet API
4 5 6SPARK STREAMING
• Streaming Sql API
SPARK MLlib
• Persistencia
6. SPARK 2.0
DE VERDAD ?? ESTA GENTE SABE
....
1. INTRODUCCIÓN
Spark 2.0
• Disponible en Databricks Platform
• Disponible descarga de Snapshot
• Lanzamiento inminente
• Presentado en Spark Summit
• Más rápido, más fácil y más inteligente
• Mejoradas todas las APIs de Spark:
Streaming, Sql, Mllib, Graphx
8. SPARK 2.0
2. OPTIMIZACIÓN > MEMORIA
Problema
La mayoría de los ciclos de CPU se gastan en cosas inútiles como esperas al leer y escribir datos de
caché de CPU o de memoria
9. SPARK 2.0
2. OPTIMIZACIÓN > MEMORIA
Objetivos
• Gestionar la memoria de ejecución (shuffle, joins) y memoria de
almacenamiento (memoria usada para cachear datos que son
reusados)
• Gestionar la memoria entre tareas que corren en paralelo
• Gestionar la memoria entre operadores de una misma tarea
11. SPARK 2.0
2. OPTIMIZACIÓN > MEMORIA
2.1.1 Memory Management
• Los objetos de Java consumen más memoria de la que deberían
“abcd” 4 bytes en Nativo UTF-8 y 48 bytes en Java
• El GC de Java tiende a sobre trabajar y no tiene suficiente info.
Spark ha implementado un gestor de memoria Explícito para objetos java, C-style
13. SPARK 2.0
2. OPTIMIZACIÓN > MEMORIA
2.1.2 Cache - Aware
• Reduce el tiempo de espera de datos de memoria de CPU y aumenta el tiempo útil
• Guarda en el Array de punteros la clave (64 bit -> 128 bit)
Ptr ValueKey
Nativo
Ptr ValueKey
Cache-Aware
Ordenación con menos accesos random a memoria
aggregations-sorting-joins
14. SPARK 2.0
2. OPTIMIZACIÓN > MEMORIA
2.1.3 Whole-stage code generation
• Generación de bytecode en tiempo de ejecución
• Se empezó en Spark 1.4 con ciertas funciones sql (Catalyst)
• Genera código simple para funciones complejas y genera menos
registros en caché de CPU
• Las CPU actuales están optimizadas para bucles simples
• Incrementa el rendimiento en la serialización por lo que optimiza
la fase de shuffle
20. SPARK 2.0
2. OPTIMIZACIÓN > MEMORIA
2.1.4 Vectorization
• Operaciones complejas no pueden ser abstraídas a una función
• Hay que integrar librerías externas (csv, parquet)
Opera sobre varias rows, pasa a un formato columnar!!
recordemos > CPUs optimizadas para bucles simples!!
22. SPARK 2.0
2. OPTIMIZACIÓN > FUNCIONES
2.2 Funciones
• Integración de algoritmos aproximados en DataFrames y Datasets.
HyperLogLog - CountMinSketch - BloomFilters
• ApproxCountDistinct
Estimación del número de elementos distintos que hay en una colección
• ApproxQuantile
Devuelve una aproximación a los percentiles
Ejm. approx_count = users.agg(approxCountDistinct(users['user'], rsd = rsd))
Jugamos con el margen de error, más margen => más rápido
25. SPARK 2.0
3. SPARK CORE > ACUMULADORES
3.1 Acumuladores
• Nueva API de acumuladores con un performance mejorado
• AccumulatorContext para acceder y crear
• API para implementar nuestros acumuladores propios
• Implementado el Long - Double con cosas como sum, count, and averages
val acc = new LongAccumulator
acc.setValue(100L)
acc.metadata = AccumulatorMetadata(1L, Some("longAccumulator"), false)
AccumulatorContext.register(acc)
val accAvg = acc.avg
val accSum = acc.sum
val accCount = acc.count
val longAccumulator = AccumulatorContext.get(acc.id)
26. SPARK 2.0
3. SPARK CORE > Block Manager
3.2 External Block Manager Genérico
• Se han eliminado las clases que hacían uso de Tachyon
• Se han eliminado en ciertos casos movimiento de datos por Http
28. SPARK 2.0
4. SPARK SQL
Principales funcionalidades
• Olvidar SqlContext y pensar en SparkSession
• Unificar API DataFrames/Datasets en Scala/Java en DataSets
• Lenguaje SQL extendido para un soporte del 99% TPC-DS queries
• Ejecutar SQL directamente sobre ficheros
hadoop - text - csv - parquet
29. SPARK 2.0
4. SPARK SQL > SPARK SESSION
4.1 SparkSession
• Deprecamos SQLContext
• Varias sesiones simultáneas independientes con sus propios catálogos
• Crea un SparkContext si no ha sido creado previamente
• Asignacion de parametros en caliente
sparkSession.conf.set("spark.some.config", "abcd")
• Funciones para listar, buscar y modificar el catálogo de tablas
• Opciones de configuración como variables de sustitución en SQL
sparkSession.sql("select '${spark.some.config}'")
Veámos un poco de código en Intellij ...
30. SPARK 2.0
4. SPARK SQL > API DataSet
4.2 API Dataset
• Unificada la API de DataFrames y Dataset
• type DataFrame = DataSet[Row]
• No disponible en R ni Python
• DataSet tipados y no tipados:
Operaciones sobre tipados y no tipados (map, select, etc...)
Agregaciones
32. SPARK 2.0
5. SPARK STREAMING
Principales funcionalidades
• Sql sobre streaming estructurado:
Triggers
Agregaciones continuas
• Eliminados los módulos:
Twitter
ZeroMQ
MQTT
Akka
33. SPARK 2.0
5. SPARK STREAMING > SQL STREAMING API
5.1 SQL Streaming API
• Implementado dentro del módulo de SQL
• API batch y streaming unificada
• Static DataFrame -> Infinite DataFrame
• Independiente de DStreams API
Cambiar queries en tiempo real, aplicar a ML y sink por JDBC
39. SPARK 2.0
6. SPARK MLlib > PERSISTENCIA PIPELINES
6.1 Persistencia Pipelines
• Salvar y cargar Pipelines completos
• Salvar y cargar modelos individuales
Veamos dos ejemplos ....
40. SPARK 2.0
6. SPARK MLlib > PERSISTENCIA PIPELINES
K-Means clustering model
val kmeans = new KMeans().setK(10).setSeed(12345)
val model = kmeans.fit(training)
model.save(basePath + "/model")
val sameModel = KMeansModel.load(basePath + "/model")
from pyspark.ml.clustering import KMeansModel
pyModel = KMeansModel.load(basePath + "/model")
41. SPARK 2.0
6. SPARK MLlib > PERSISTENCIA PIPELINES
Pipeline
val scaler = new StandardScaler().setInputCol("features").setOutputCol("scaledFeatures")
kmeans.setFeaturesCol("scaledFeatures")
val pipeline = new Pipeline().setStages(Array(scaler, kmeans))
pipeline.save(basePath + "/pipeline")
val samePipeline = Pipeline.load(basePath + "/pipeline")
42. SPARK 2.0
Y para otro meetup …..
Re Architecting Spark for
Mobile Platforms??? ;)
https://databricks.com/blog/2015/04/01/spark-2-rearchitecting-spark-for-mobile.html