Download - Meetup Spark 2.0

Transcript
Page 1: Meetup Spark 2.0

2 Junio 2016

SPARK 2.0

Page 2: Meetup 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

Page 3: Meetup Spark 2.0

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

1 INTRODUCCIÓN

Page 5: Meetup Spark 2.0

SPARK 2.0

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

Page 6: Meetup Spark 2.0

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

2 OPTIMIZACIÓN

Page 8: Meetup Spark 2.0

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

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

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

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

SPARK 2.0

2. OPTIMIZACIÓN > MEMORIA

Librería de bajo nivel provista por Java sun.misc.Unsafe

Page 13: Meetup Spark 2.0

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

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

SPARK 2.0

Pasado

(Vulcano)

Presente

(college freshman)

Page 16: Meetup Spark 2.0

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

SPARK 2.0

Page 18: Meetup Spark 2.0

SQL ??

SPARK 2.0

Page 19: Meetup Spark 2.0

SPARK 2.0

Page 20: Meetup 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!!

Page 21: Meetup Spark 2.0

SPARK 2.0

Page 22: Meetup 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

Page 23: Meetup Spark 2.0

SPARK 2.0

ApproxCountDistinct en función del margen elegido

Page 24: Meetup Spark 2.0

3 SPARK CORE

Page 25: Meetup Spark 2.0

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

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

4 SPARK SQL

Page 28: Meetup Spark 2.0

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

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

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

5 SPARK Streaming

Page 32: Meetup Spark 2.0

SPARK 2.0

5. SPARK STREAMING

Principales funcionalidades

• Sql sobre streaming estructurado:

Triggers

Agregaciones continuas

• Eliminados los módulos:

Twitter

ZeroMQ

MQTT

Akka

Page 33: Meetup Spark 2.0

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

SPARK 2.0

Page 35: Meetup 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

Page 36: Meetup Spark 2.0

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

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

6 SPARK MLlib

Page 39: Meetup Spark 2.0

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

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

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

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

Page 43: Meetup Spark 2.0

BIG DATACHILD`S PLAY

Gracias!!

Stratio busca Talento

Contacto:[email protected]/in/gserranojc