Meetup Real Time Aggregations Spark Streaming + Spark Sql

download Meetup Real Time Aggregations  Spark Streaming + Spark Sql

of 34

Embed Size (px)

Transcript of Meetup Real Time Aggregations Spark Streaming + Spark Sql

22 Marzo 2016

REAL TIME AGGREGATION ENGINE: SPARK STREAMING + SPARK SQL

Quienes somos

Conoce a algunos de ellos en gitHub https://github.com/Stratio/Sparta/graphs/contributorsREAL TIME AGGREGATION ENGINE: SPARK STREAMING + SPARK SQL

Jos Carlos Garca Serrano

Arquitecto Big Data en Stratio.

Amante de las nuevas tecnologas y de las arquitecturas basadas en Big Data.

FanBoy de Scala, Spark, Akka, MongoDB y Cassandra.

Y como no de Stratio Sparta y Stratio Crossdata.El equipo de SPARTA:

Jos Carlos Garca SerranoArquitecto Big Datajcgarcia@stratio.comCONTACTONDICEINTRODUCCIN SPARTA

ArquitecturaTecnologas

1

2

3INPUTS

Receiver WebSocketReceiver RabbitMqReceiver avanzadosSpark Streaming HA

STREAMING - JVM

Problemas y RecomendacionesStratio JobServerCluster Managers

OUTPUTS

TransformacionesDataFramesAPI DataSourcesVs Tu CdigoTriggers

4

5

6OPERACIONES AVANZADAS DE STREAMING

StatefulOptimizando Rendimiento

DEMO TIME

STRATIO SPARTA

1INTRODUCCIN

REAL TIME AGGREGATION ENGINE: SPARK STREAMING + SPARK SQL

1. INTRODUCCIN SPARTA > ARQUITECTURA

Buscar reloj para reemplazar la O.

#

REAL TIME AGGREGATION ENGINE: SPARK STREAMING + SPARK SQL

1. INTRODUCCIN SPARTA > TECNOLOGAS

Buscar reloj para reemplazar la O.

#

REAL TIME AGGREGATION ENGINE: SPARK STREAMING + SPARK SQL

1. INTRODUCCIN SPARTA > TECNOLOGASSCALA - AKKA - SPARK TODOS BAILAN JUNTOS

Buscar reloj para reemplazar la O.

#

INPUTSREAL TIMEAGGREGATION ENGINE: SPARK STREAMING + SPARK SQL2

REAL TIME AGGREGATION ENGINE: SPARK STREAMING + SPARK SQL

2.1 Receiver WebSocket

Spark nos deja abierta una API para poder desarrollar receptores de datos para nuestros procesos de Streaming.En Sparta hemos desarrollado uno bsico para poder conectarnos a webSockets. Implementando nuestra abstract class Input del SDK lo tenemos incorporado en nuestro Engine!!Tenemos dos opciones para poder guardar datos en un batch de streaming:Implementando una clase abstracta ReceiverExtendiendo dentro de un Actor el trait ActorHelper2 INPUTS AS DE FCIL PODEMOS EXTENDER LA FUNCIONALIDAD QUE SPARK NOS OFRECE

REAL TIME AGGREGATION ENGINE: SPARK STREAMING + SPARK SQL

2 INPUTS > WEBSOCKET RECEIVER class MyReceiver(storageLevel: StorageLevel) extends Receiver[String](storageLevel) { def onStart() { //Store() } def onStop() { } } ssc.receiverStream(new MyReceiver(storageLevel(sparkStorageLevel))) class MyActor extends Actor with ActorHelper{ def receive { case anything: String => store(anything) } } ssc.actorStream[String](Props(new MyActor),"MyActorReceiver")

SPARK SDK

REAL TIME AGGREGATION ENGINE: SPARK STREAMING + SPARK SQL

2 INPUTS > WEBSOCKET RECEIVER abstract class Input(properties: Map[String, Any]) extends Parameterizable(properties) {

def setUp(ssc: StreamingContext, storageLevel: String): DStream[Row]

}SPARTA INPUT SDKFCIL VERDAD?? VEAMOS EL WEBSOCKET RECEIVER

REAL TIME AGGREGATION ENGINE: SPARK STREAMING + SPARK SQL

2.2 Receiver RabbitMQ

Spark Packages es un repositorio de proyectos que extienden el SDK de Spark para ofrecernos ms funcionalidad.En Sparta hemos contribuido desarrollando el receiver de RabbitMQEn un principio era una clase ms de nuestro Input de RabbitMQ, ahora es un repositorio externo en GitHub y por supuesto Open Source.

2 INPUTS VEMOS UN RECEIVER UN POCO MS AVANZADO RABBITMQ

REAL TIME AGGREGATION ENGINE: SPARK STREAMING + SPARK SQL

2.3 Receivers Avanzados

Spark Streaming crea un Receiver en un executor de Spark, este recibe los datos y luego son distribuidos por el cluster.El Receiver de KafkaDirect de Spark es Distribuido y capaz de hacer que cada Executor reciba una porcin de datos, cada uno de ellos mantiene un offset de donde va leyendo en Kafka.El clsico receiver de Kafka y el resto de receivers de Spark No son Distribuidos, si queremos paralelizar hay que hacer DStream.union(otherDStream).Hay que intentar hacer los Receiver Fault Tolerance, debemos llamar a la funcin store(mltiples eventos) pasandole un iterador, despus deberamos esperar un Ack segn el StorageLevel seleccionado. Debemos controlar las polticas de reconexin en nuestro Custom Receiver.Performance WriteAheadLogs!! ms de un receiver y no controlar el StorageLevel!!

2 INPUTS

REAL TIME AGGREGATION ENGINE: SPARK STREAMING + SPARK SQL

2.4 Spark Streaming HA

2 INPUTS

Post recomendado!

STREAMING - JVMREAL TIMEAGGREGATION ENGINE: SPARK STREAMING + SPARK SQL3

REAL TIME AGGREGATION ENGINE: SPARK STREAMING + SPARK SQL

3.1 Problemas y Recomendaciones I

Solamente podemos tener un SparkContext y un StreamingContext corriendo en una JVM. Mnimo dos cores!!Si no creamos correctamente el Spark Streaming Context siguiendo la recomendacin de Spark, no podemos tener nuestro sistema Fault Tolerance.Si hacemos nuestro streaming Fault Tolerance o usamos transformaciones stateful debemos activar el checkpointing.Debemos crear los contextos correctamente: SparkContext.getOrCreate()SparkSQLContext.getOrCreate()SparkStreamingContext.getOrCreate({func}, checkpointPath) Fault Tolerance, necesita checkpoint

3 STREAMING - JVM

REAL TIME AGGREGATION ENGINE: SPARK STREAMING + SPARK SQL

3.1 Problemas y Recomendaciones II

Es recomendable parar el StreamingContext mediante el mtodo stop utilizando el parmetro gracefully.Cuando un SparkContext es cerrado, tendremos problemas al volver a crear uno.Los Tests de integracin que comparten la JVM, pueden tener problemas con los contextos de Spark.Cuidado con los Closures y los problemas de Serializacin. Los object de Scala son nuestros amigos, pero con mesura!

3 STREAMING - JVM

REAL TIME AGGREGATION ENGINE: SPARK STREAMING + SPARK SQL

3 STREAMING - JVM > STRATIO JOBSERVER SPARTA COMO UN SERVIDOR DE JOBS DE STREAMING SPARTA DRIVERCLUSTER MANAGERSPARK DRIVERSPARK DRIVERSPARK DRIVER

ReceiverExecutor

ReceiverExecutor

ReceiverExecutor

Job 1Job 2Job NSubmit Job 1Submit Job 2Submit Job NTasksTasksTasks

Actores de Akka coordinan la ejecucin de Jobs que contienen contextos de Spark.

Sparta en modo cluster genera un Spark-Submit al cluster manager que tengamos seleccionado.

Cada Spark Driver se ejecuta en un Worker y tiene su propia JVM.

REAL TIME AGGREGATION ENGINE: SPARK STREAMING + SPARK SQL

3 STREAMING - JVM > CLUSTER MANAGERS SPARTA EJECUTA EN YARN, MESOS Y STANDALONECLUSTER MANAGERSPARK DRIVER

Receiver

Submit JobJobsYarn, Mesos y StandAlone tienen propiedades especficas para realizar el Submit.Nmero de cores y memoria que tendr el driver y los Executors.

Sparta por defecto lanza los trabajos de Spark en modo cluster sobre Yarn y Mesos.

El sistema de ejecucin de Fine-Grained de Mesos y Dynamic Resource Allocation de Yarn no est recomendado para procesos de Streaming. Usar Coarse Grained.

WorkerExecutors

TasksPara poder tener comunicacin con los jobs que se ejecutan en el cluster de Spark, Sparta usa Zookeeper.

Nos aislamos de las APIs de cada cluster manager, gracias a Listeners de Curator dentro de Actores de Akka.

La comunicacin es bidireccional, por lo que podemos mandar desde el driver de Sparta mensajes a los Jobs del Cluster.Cuando un Receiver se cae, Spark levanta otro, si tenemos el Checkpoint activado es Fault Tolerance

Cualquier Jar que necesitemos debemos subirlo a HDFS o pasar la ruta local y pasarlo como parmetro a Spark-Submit.

Si la ejecucin es sobre Mesos, no funcionan correctamente las rutas locales y las de HDFS, debemos bajarlo en el Driver de Spark y aadirlo al Classpath y al SparkContext.

OUTPUTSREAL TIMEAGGREGATION ENGINE: SPARK STREAMING + SPARK SQL4

REAL TIME AGGREGATION ENGINE: SPARK STREAMING + SPARK SQL

4.1 Transformaciones

Cuando trabajamos con DStream[T] podemos aplicar transformaciones como .map o .flatMap para modificar el contenido del DStream y pasar del tipo T a una Clase de Scala.

Imaginad que nuestro String es un JSON, podemos hacer cosas como esta:

Todo esto es aplicable tambin a los RDD[T] de Spark.4 OUTPUTS val parsedDStream: DStream[Row] = originalDStream.map(data => Row(JSON.parseFull(data).get.asInstanceOf[Map[String, Any]].values))val originalDStream: DStream[String]val parsedDStream: DStream[Int] = originalDStream.map(data => Row(data))

REAL TIME AGGREGATION ENGINE: SPARK STREAMING + SPARK SQL

4.2 DataFrames

En Sparta hemos decidido generar un tipo de dato genrico para todas las entradas y salidas de cada uno de los componentes del SDK.Nuestro tipo genrico es la clase Row de Spark, de esta forma podemos generar DataFrames aplicando un Schema en cualquier momento. Un DataFrame puede ser guardado por cualquiera de nuestros outputs con la funcin upsert.

4 OUTPUTS val schema: StructTypeval output: Outputval parsedDStream: DStream[Row]parsedDStream.foreachRDD(rdd =>val parsedDataFrame = SQLContext.getOrCreate(rdd.context).createDataFrame(rdd, schema)output.upsert(parsedDataFrame, dataFrameOptions))

REAL TIME AGGREGATION ENGINE: SPARK STREAMING + SPARK SQL

4 OUTPUTS > DATAFRAMES abstract class Output(keyName: String,version: Option[Int],properties: Map[String, JSerializable], schemas: Seq[TableSchema]) extends Parameterizable(properties) with Logging { def setup(options: Map[String, String] = Map.empty[String, Strin