Fun[ctional] spark with scala

download Fun[ctional] spark with scala

of 53

Embed Size (px)

Transcript of Fun[ctional] spark with scala

  • 13 Junio 2016

    Fun[ctional] Sparkwith Scala

  • Quienes somos

    Fun[ctional] Spark with Scala

    Jos Carlos Garca 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 tecnologas 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

    https://es.linkedin.com/in/josecarlosgarciaserranohttps://es.linkedin.com/in/josecarlosgarciaserrano

  • Quienes somos

    Fun[ctional] Spark with Scala

    David Vallejo Navarro Desarrollador Scala en Stratio.

    Trabajando con Scala desde 2012 (si...cuando nadie saba qu era eso de Scala)

    Actualmente cursando un mster en Investigacin informtica.

    He trabajado en:

    DSLs para la creacin de aplicaciones sociales

    Sistemas distribuidos

    Aplicaciones WEB

    Migracin de antiguas arquitecturas a Scala

    Y ahora, Big Data!

    Ah! Y tengo un blog de Scala: www.scalera.es

    https://es.linkedin.com/in/davidvallejonavarrohttps://es.linkedin.com/in/davidvallejonavarrohttp://www.scalera.es

  • Jos Carlos Garca SerranoArquitecto Big Data

    jcgarcia@stratio.com

    CONTACTO

    NDICE

    INTRODUCCIN1

    2

    3

    VENTAJAS DE SCALA EN SPARK

    DESVENTAJAS DE SCALA EN SPARK4

    David Vallejo NavarroDesarrollador Big Data

    dvallejo@stratio.com

    SCALA AVANZADO CON SPARK

    https://es.linkedin.com/in/josecarlosgarciaserranohttps://es.linkedin.com/in/josecarlosgarciaserranohttps://es.linkedin.com/in/davidvallejonavarrohttps://es.linkedin.com/in/davidvallejonavarro

  • 1 INTRODUCCIN

  • Fun[ctional] Spark with Scala

    Qu es Scala?

    2003 - Martin Odersky, estando borracho, ve un anuncio de mantequilla de cacahuete Reese sobre

    el chocolate y tiene una idea. Crea Scala, un lenguaje que unifica las construcciones de los

    lenguajes funcionales y los orientados a objetos. Consigue cabrear a los partidarios de ambos tipos

    de lenguaje que declaran al unsono la jihad.

    Incomplete, and Mostly Wrong History of Programming Languages por James Iry

    http://james-iry.blogspot.com/2009/05/brief-incomplete-and-mostly-wrong.htmlhttp://james-iry.blogspot.com/2009/05/brief-incomplete-and-mostly-wrong.html

  • Fun[ctional] Spark with Scala

    Qu es Scala?

    CARACTERSTICAS PRINCIPALES

    CORRE EN LA JVM1

    2

    3

    MULTIPARADIGMA

    TIPADO ESTTICO

    INFERENCIA DE TIPOS4

    5 HERENCIA MLTIPLE

  • Fun[ctional] Spark with Scala

    Scala en Noviembre de 2014

    72.992 miembros319 meetups

  • 72.992 miembros319 meetups

    Fun[ctional] Spark with Scala

    Scala en Junio de 2016 (1 ao y 7 meses despus)

    233.375 miembros570 meetups

  • Fun[ctional] Spark with Scala

    Algunas empresas que usan Scala

  • Fun[ctional] Spark with Scala

    Spark Scala

    + =

  • 2 VENTAJAS DESCALA ENSPARK

  • Fun[ctional] Spark with Scala

    2. VENTAJAS

    2.1 Ventajas de usar Scala

    Uso de JVM

    -> Libreras - Polimorfismo - Gestin

    Estticamente tipado

    -> Optimizacin del uso de memoria y de los algoritmos aplicados

    Modularidad

    -> Grandes proyectos entendibles por humanos

    Sintaxis simple y rpido desarrollo

    -> Programacin funcional, poco cdigo y simplicidad

    Multi-threading y concurrencia

    -> Akka y la programacin funcional son nuestros amigos

  • Fun[ctional] Spark with Scala

    Los inicios como padawan scalero son duros y no puros ...

  • Fun[ctional] Spark with Scala

    2. VENTAJAS

    Java??

    Ventajas

    trait JavaNoMola {

    val advantages : Seq[String] = ???

    }

    Desventajas

    No data-centric language

    Lneas de cdigo infinitas

    Difcil uso de colecciones

    Var = efectos de lado

    Concurrencia descontrolada

    Python??

    Ventajas

    Data-centric language

    Fcil uso de colecciones

    Desventajas

    Tipado dinmico

    Compilado mejor que interpretado

    Performance - Errores

    No es modular

    Mala integracin con Hadoop

    Api limitada de Streaming

    Y por qu no en C ...

  • Fun[ctional] Spark with Scala

    2. VENTAJAS

  • Fun[ctional] Spark with Scala

    2. VENTAJAS

    Probablemente en un futuro veremos a Spark como la coleccin de elementos distribuidos de Scala

  • Fun[ctional] Spark with Scala

    2. VENTAJAS

    2.2 Ventajas de usar Scala en Spark

    Escrito en Scala

    RDD es una coleccin distribuida, funciones conocidas map, flatMap, groupBy, foreach, etc

    Lambda va de serie

    RDD tipados -> Datasets tipados y no tipados

    Poco cdigo para realizar ETLs y apps sencillas

    Datos inmutables

    Efectos de lado minimizados (Closure)

    Evaluacin perezosa (Lazy)

  • Fun[ctional] Spark with Scala

    2. VENTAJAS

    Funciones conocidas por cualquier escalero ...

    def flatMap[U: ClassTag](f: T => TraversableOnce[U]): RDD[U] = withScope { val cleanF = sc.clean(f) new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.flatMap(cleanF))}

    private[spark] class MapPartitionsRDD[U: ClassTag, T: ClassTag]( var prev: RDD[T], f: (TaskContext, Int, Iterator[T]) => Iterator[U], // (TaskContext, partition index, iterator) preservesPartitioning: Boolean = false) extends RDD[U](prev) {

    override def compute(split: Partition, context: TaskContext): Iterator[U] = f(context, split.index, firstParent[T].iterator(split, context))

  • Fun[ctional] Spark with Scala

  • Fun[ctional] Spark with Scala

    2. VENTAJAS

    val textFile = sc.textFile("hdfs://...")

    val counts = textFile.flatMap(line => line.split(" "))

    .map(word => (word, 1))

    .reduceByKey(_ + _)

    JavaRDD textFile = sc.textFile("hdfs://...");

    JavaRDD words = textFile.flatMap(new FlatMapFunction() {

    public Iterable call(String s) { return Arrays.asList(s.split(" ")); }

    });

    JavaPairRDD pairs = words.mapToPair(new PairFunction() {

    public Tuple2 call(String s) { return new Tuple2(s, 1); }

    });

    JavaPairRDD counts = pairs.reduceByKey(new Function2() {

    public Integer call(Integer a, Integer b) { return a + b; }

    });

    Java

    Tpico word count, pero refleja la realidad Scala vs Java vs Python

    Scala Pythontext_file = sc.textFile("hdfs://...")

    counts = text_file.flatMap(lambda line: line.split(" ")) \

    .map(lambda word: (word, 1)) \

    .reduceByKey(lambda a, b: a + b)

  • Fun[ctional] Spark with Scala

  • Fun[ctional] Spark with Scala

    2. VENTAJAS

    Nuestra querida inmutabilidad ...

    Mutabilidad y concurrencia no mola -> Efectos de lado

    Al ser inmutable un RDD puede ser recreado en cualquier momento

    Difcil mantenimiento de datos que mutan -> update de memoria y disco -> Psimo performance

    Queremos programacin funcional y transformaciones que son funciones

  • Fun[ctional] Spark with Scala

    2. VENTAJAS

    Lazy?? mismo concepto de una variable lazy de scala pero en RDD

    Todas las transformaciones se van aadiendo al DAG de operaciones

    Solo son ejecutadas cuando realizamos una accin

    Se computan las transformaciones de las que depende la accin

    Las que no dependan de la accin no son computadas

    Odersky querra este concepto para sus colecciones ;)

  • Fun[ctional] Spark with Scala

    def collect(): Array[T] = withScope { val results = sc.runJob(this, (iter: Iterator[T]) => iter.toArray) Array.concat(results: _*)}

    def map[U: ClassTag](f: T => U): RDD[U] = withScope { val cleanF = sc.clean(f) new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.map(cleanF))}

    def runJob[T, U: ClassTag]( rdd: RDD[T], func: (TaskContext, Iterator[T]) => U, partitions: Seq[Int], resultHandler: (Int, U) => Unit): Unit = { if (stopped.get()) { throw new IllegalStateException("SparkContext has been shutdown") } val callSite = getCallSite val cleanedFunc = clean(func) logInfo("Starting job: " + callSite.shortForm) if (conf.getBoolean("spark.logLineage", false)) { logInfo("RDD's recursive dependencies:\n" + rdd.toDebugString) } dagScheduler.runJob(rdd, cleanedFunc, partitions, callSite, resultHandler, localProperties.get) progressBar.foreach(_.finishAll()) rdd.doCheckpoint()

  • Fun[ctional] Spark with Scala

    2. VENTAJAS

    2.3 Optimizaciones en Scala

    Tungsten

    Serializacin

    DataSets

    DataFrames

    UDFs ms eficientes que en Python

    MLlib

    Coste adicional de convertir Python objects a Scala objects

    Recordemos el meetup de Fun[ctional] Spark with Scala ...

  • Fun[ctional] Spark with Scala

    2. VENTAJAS

    Y antes de spark 1.6 ...

  • Fun[ctional] Spark with Scala

    2. VENTAJAS

    desde Spark 1.4 tungsten ya optimizaba algunas funciones de DataFrames de Scala

  • 3 SCALA AVANZADOCON SPARK

  • Fun[ctional] Spark with Scala

    3. Scala avanzado

  • Fun[ctional] Spark with Scala

    3.1 Implcitos

    def mean(xs: RDD[Int]): Double = xs.sum / xs.count

    mean(rdd)

    Queremos calcular la media de un RDD:

  • Fun[ctional] Spark with Scala

    3.1 Implcitos

    Implcitos: partes de cdigo que se ejecutan sin ser llamados

  • Fun[ctional] Spark with Scala

    3.1 Implcitos

    implicit val