Meetup Spark 2.0
-
Author
jose-carlos-garcia-serrano -
Category
Engineering
-
view
258 -
download
2
Embed Size (px)
Transcript of Meetup Spark 2.0

2 Junio 2016
SPARK 2.0

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

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

1 INTRODUCCIÓN

SPARK 2.0
El Software siempre es mejorable y Spark no es menos ….

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

2 OPTIMIZACIÓN

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

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

SPARK 2.0
SPARK 1.4 PROJECT TUNGSTEN TUNGSTEN 2.0
2. OPTIMIZACIÓN > MEMORIA
• Memory Management
• Cache - Aware
• Whole-stage code generation
• Vectorization

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

SPARK 2.0
2. OPTIMIZACIÓN > MEMORIA
Librería de bajo nivel provista por Java sun.misc.Unsafe

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

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

SPARK 2.0
Pasado
(Vulcano)
Presente
(college freshman)

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]

SPARK 2.0

SQL ??
SPARK 2.0

SPARK 2.0

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!!

SPARK 2.0

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

SPARK 2.0
ApproxCountDistinct en función del margen elegido

3 SPARK CORE

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)

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

4 SPARK SQL

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

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 ...

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

5 SPARK Streaming

SPARK 2.0
5. SPARK STREAMING
Principales funcionalidades
• Sql sobre streaming estructurado:
Triggers
Agregaciones continuas
• Eliminados los módulos:
ZeroMQ
MQTT
Akka

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

SPARK 2.0

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

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"))

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()

6 SPARK MLlib

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 ....

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")

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")

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