Meetup Spark 2.0
-
Upload
jose-carlos-garcia-serrano -
Category
Engineering
-
view
259 -
download
2
Transcript of Meetup Spark 2.0
![Page 1: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/1.jpg)
2 Junio 2016
SPARK 2.0
![Page 2: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/2.jpg)
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
![Page 3: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/3.jpg)
José Carlos García SerranoArquitecto Big [email protected]
CONTACTO
ÍNDICE
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
![Page 4: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/4.jpg)
1 INTRODUCCIÓN
![Page 5: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/5.jpg)
SPARK 2.0
El Software siempre es mejorable y Spark no es menos ….
![Page 6: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/6.jpg)
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
![Page 7: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/7.jpg)
2 OPTIMIZACIÓN
![Page 8: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/8.jpg)
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
![Page 9: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/9.jpg)
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
![Page 10: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/10.jpg)
SPARK 2.0
SPARK 1.4 PROJECT TUNGSTEN TUNGSTEN 2.0
2. OPTIMIZACIÓN > MEMORIA
• Memory Management
• Cache - Aware
• Whole-stage code generation
• Vectorization
![Page 11: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/11.jpg)
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
![Page 12: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/12.jpg)
SPARK 2.0
2. OPTIMIZACIÓN > MEMORIA
Librería de bajo nivel provista por Java sun.misc.Unsafe
![Page 13: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/13.jpg)
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
NativoPtr ValueKey
Cache-Aware
Ordenación con menos accesos random a memoria
aggregations-sorting-joins
![Page 14: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/14.jpg)
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
![Page 15: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/15.jpg)
SPARK 2.0
Pasado
(Vulcano)
Presente
(college freshman)
![Page 16: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/16.jpg)
SPARK 2.0
Antes
Ahora
== Physical Plan ==*Aggregate(functions=[sum(id#201L)])
+- Exchange SinglePartition, None+- *Aggregate(functions=[sum(id#201L)])
+- *Filter (id#201L > 100)+-
*Range 0, 1, 3, 1000, [id#201L]
== Physical Plan ==*TungstenAggregate(key=[],functions=[(sum(id#201L),mode=Final,isDistinct=false)], output=[sum(id)#212L])+- Exchange SinglePartition, None
+- *TungstenAggregate(key=[], functions=[(sum(id#201L),mode=Partial,isDistinct=false)], output=[sum#214L])+- *Filter (id#201L > 100)
+- *Range 0, 1, 3, 1000, [id#201L]
![Page 17: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/17.jpg)
SPARK 2.0
![Page 18: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/18.jpg)
SQL ??
SPARK 2.0
![Page 19: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/19.jpg)
SPARK 2.0
![Page 20: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/20.jpg)
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!!
![Page 21: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/21.jpg)
SPARK 2.0
![Page 22: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/22.jpg)
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
![Page 23: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/23.jpg)
SPARK 2.0
ApproxCountDistinct en función del margen elegido
![Page 24: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/24.jpg)
3 SPARK CORE
![Page 25: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/25.jpg)
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 LongAccumulatoracc.setValue(100L)acc.metadata = AccumulatorMetadata(1L, Some("longAccumulator"), false)AccumulatorContext.register(acc)val accAvg = acc.avgval accSum = acc.sumval accCount = acc.countval longAccumulator = AccumulatorContext.get(acc.id)
![Page 26: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/26.jpg)
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
![Page 27: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/27.jpg)
4 SPARK SQL
![Page 28: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/28.jpg)
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
![Page 29: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/29.jpg)
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 ...
![Page 30: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/30.jpg)
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
![Page 31: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/31.jpg)
5 SPARK Streaming
![Page 32: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/32.jpg)
SPARK 2.0
5. SPARK STREAMING
Principales funcionalidades
• Sql sobre streaming estructurado:
Triggers
Agregaciones continuas
• Eliminados los módulos:
ZeroMQ
MQTT
Akka
![Page 33: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/33.jpg)
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
![Page 34: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/34.jpg)
SPARK 2.0
![Page 35: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/35.jpg)
SPARK 2.0
5. SPARK STREAMING > SQL STREAMING API
Continuous aggregations
val peopleAgg = sparkSession.read.json("/home/jcgarcia/meetupSql.json")peopleAgg.groupBy("id").agg(sum("age")) .write .mode(SaveMode.Overwrite) .parquet("/home/jcgarcia/parquetAgg1.parquet")
val peopleAgg2 = sparkSession.read.format("json").stream("/home/jcgarcia/streamingexample")peopleAgg2.groupBy("id").agg(sum("age")) .write .option("queryName", "queryStreaming") .mode(SaveMode.Overwrite) .parquet("/home/jcgarcia/parquetAgg2.parquet")
Batch aggregation
Continuous aggregation
![Page 36: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/36.jpg)
SPARK 2.0
5. SPARK STREAMING > SQL STREAMING API
Triggers
val peopleAgg2 = sparkSession.read.format("json").stream("/home/jcgarcia/streamingexample")peopleAgg2.groupBy("id").agg(sum("age")) .write
.option("queryName", "queryStreaming")
.trigger(ProcessingTime("10 seconds"))
![Page 37: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/37.jpg)
SPARK 2.0
5. SPARK STREAMING > SQL STREAMING API
Ejecución
val peopleAgg2 = sparkSession.read.format("json").stream("/home/jcgarcia/streamingexample")peopleAgg2.groupBy("id").agg(sum("age")) .write
.option("queryName", "queryStreaming") .trigger(ProcessingTime("10 seconds")) .startStream() .awaitTermination()
![Page 38: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/38.jpg)
6 SPARK MLlib
![Page 39: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/39.jpg)
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 ....
![Page 40: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/40.jpg)
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")
![Page 41: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/41.jpg)
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")
![Page 42: Meetup Spark 2.0](https://reader036.fdocuments.in/reader036/viewer/2022062412/587014c01a28ab7f428b5225/html5/thumbnails/42.jpg)
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