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 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
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
Nativo
Ptr 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 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)
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:
Twitter
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
aggreg
ation
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
BIG DATA
CHILD`S PLAY
Gracias!!
Stratio busca Talento
Contacto:
jcgarcia@stratio.com
es.linkedin.com/in/gserranojc

Meetup Spark 2.0

  • 1.
  • 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íaSerrano 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
  • 4.
  • 5.
    SPARK 2.0 El Softwaresiempre es mejorable y Spark no es menos ….
  • 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
  • 7.
  • 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
  • 10.
    SPARK 2.0 SPARK 1.4PROJECT TUNGSTEN TUNGSTEN 2.0 2. OPTIMIZACIÓN > MEMORIA • Memory Management • Cache - Aware • Whole-stage code generation • Vectorization
  • 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
  • 12.
    SPARK 2.0 2. OPTIMIZACIÓN> MEMORIA Librería de bajo nivel provista por Java sun.misc.Unsafe
  • 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
  • 15.
  • 16.
    SPARK 2.0 Antes Ahora == PhysicalPlan == *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]
  • 17.
  • 18.
  • 19.
  • 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!!
  • 21.
  • 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
  • 23.
    SPARK 2.0 ApproxCountDistinct enfunción del margen elegido
  • 24.
  • 25.
    SPARK 2.0 3. SPARKCORE > 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. SPARKCORE > 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
  • 27.
  • 28.
    SPARK 2.0 4. SPARKSQL 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. SPARKSQL > 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. SPARKSQL > 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
  • 31.
  • 32.
    SPARK 2.0 5. SPARKSTREAMING Principales funcionalidades • Sql sobre streaming estructurado: Triggers Agregaciones continuas • Eliminados los módulos: Twitter ZeroMQ MQTT Akka
  • 33.
    SPARK 2.0 5. SPARKSTREAMING > 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
  • 34.
  • 35.
    SPARK 2.0 5. SPARKSTREAMING > 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 aggreg ation
  • 36.
    SPARK 2.0 5. SPARKSTREAMING > 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"))
  • 37.
    SPARK 2.0 5. SPARKSTREAMING > 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()
  • 38.
  • 39.
    SPARK 2.0 6. SPARKMLlib > PERSISTENCIA PIPELINES 6.1 Persistencia Pipelines • Salvar y cargar Pipelines completos • Salvar y cargar modelos individuales Veamos dos ejemplos ....
  • 40.
    SPARK 2.0 6. SPARKMLlib > 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. SPARKMLlib > 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 paraotro meetup ….. Re Architecting Spark for Mobile Platforms??? ;) https://databricks.com/blog/2015/04/01/spark-2-rearchitecting-spark-for-mobile.html
  • 43.
    BIG DATA CHILD`S PLAY Gracias!! Stratiobusca Talento Contacto: jcgarcia@stratio.com es.linkedin.com/in/gserranojc