Tutorial en Apache Spark 
Clasificando Tweets en Realtime 
Gustavo Arjones 
gustavo@socialmetrix.com 
@arjones
AGENDA 
• Qué es Apache Spark? 
• Introducción a Scala 
• Crear un pipeline con Apache Spark (Word Count) 
• Cargar JSON de Tweets (Statuses) 
• Crear un programa que consume del stream (simulado) 
• Obtener los lenguajes de programación más hablados 
• Por usuario, por url, por localización
Qué es 
Apache Spark?
Qué es Spark? 
Apache Spark™ is a fast and general engine for large-scale data 
processing. 
• Procesamiento In-memory (preferentemente) 
• Framework de Procesamiento Unificado 
• Para Ingenieros & Data Scientists
Principales Pilares 
Task Scheduler 
• Prepara los jobs a través de DAG (Directed acyclic graph) 
• Concatena funciones para ejecutar los stages 
• Cache-aware; considera utilización & localización de datos 
(data locality) 
• Partitioning-aware para reducir shuffles por la red 
RDD (Resilient Distributed Datasets) 
• 
Estructura de datos Inmutable (In-memory) 
• Tolerante a fallas (Se rearma en caso de falla) 
• Estructura de datos que puede ser operada en paralelo 
• Rica interfaz de Transformations & Actions
Plataforma Unificada
Hands On!
DISCLAIMER 
Para que los ejercicios sean realizados dentro del tiempo 
establecido para el laboratorio los datasets son chicos. 
Las soluciones que desarrollamos acá pueden escalar 
para cientos de servidores y Terabytes de datos 
Las técnicas se aplican a mayor Volumen y Velocidad: 
Internet Of Things (IoT), Logs, games, mobile, etc
Introducción a 
#Scala
Declarando Variables 
val 
à 
declara 
variables 
inmutables 
(final 
en 
Java)
Declarando Función 
Crear una función que calcule el valor al cubo 
def 
à 
declara 
función 
scala> cube(10) 
res0: Int = 1000
Usar MAP 
NOTA: Es una función, no la estructura de datos! 
Aplicar la función cube() a la lista de números myNumbers 
scala> myNumbers.map(cube(_)) 
scala> myNumbers.map(cube)
Usar Map and Tuples 
Tuples son estructura auxiliares que permiten llevar multiplos 
valores sin necesidad de crear clases (VO) 
scala> myNumbers.map(n => (n, cube(n))) 
res1: List[(Int, Int)] = List((1,1), (2,8), (5,125), (4,64), (7,343), (3,27)) 
scala> myNumbers.map(n => (n, cube(n))).foreach(println) 
(1,1) 
(2,8) 
(5,125) 
(4,64) 
(7,343) 
(3,27)
Usar Filter 
Aplicar Filter a la lista myNumbers dejando solo impares 
scala> myNumbers.filter(n => (n % 2) == 1) 
res6: List[Int] = List(1, 5, 7, 3) 
scala> myNumbers.filter(_ % 2 == 1) 
res6: List[Int] = List(1, 5, 7, 3)
Usar Reduce 
Sumar todos los elementos de la lista 
scala> myNumbers.reduce((x, y) => x + y) 
res10: Int = 22 
scala> myNumbers.reduce(_ + _)
CHALLENGE 
Sumar todos los números pares en el rango de 0-99 
TIP: 
scala> val numbers = Range(0, 100) 
numbers: scala.collection.immutable.Range = Range(0, 1, ..) 
scala> numbers.filter(_ % 2 == 0).reduce(_ + _) 
res2: Int = 2450
Creando el 
primero pipeline 
con Apache 
Spark 
Código Fuente: 
https://github.com/socialmetrix/wisit14
Contar Palabras
data/don-­‐quijote.txt.gz
data/don-­‐quijote.txt.gz
data/don-­‐quijote.txt.gz
data/don-­‐quijote.txt.gz
data/don-­‐quijote.txt.gz
data/don-­‐quijote.txt.gz
data/don-­‐quijote.txt.gz
Apache Spark es Lazy! 
Viste que no pasó nada hasta la última 
linea? 
Nada es procesado entre 
Transformaciones. 
Solo se ejecuta cuando se realiza una 
Acción (top)
API muy expresiva, mucho más operaciones! 
Ver: https://spark.apache.org/docs/latest/api/scala/#org.apache.spark.rdd.RDD
CHALLENGE 
El resultado no es muy interesante, porque las principales 
palabras son stopwords, remueverlas para dar mayor significado
Manipulando 
Tweets
Propuesta 
Crear un listado de los lenguajes más tweetados, similar al listado de 
lenguajes que crea Github 
http://adambard.com/blog/top-github-languages-2014/
Consideraciones 
• Dataset contiene un JSON por linea (one-liner) 
• Hay que interpretar JSON 
• Pueden haber erroes en los JSON 
– Lineas vacias 
– Lineas malformadas / Diferentes schemas
Obtener las TOP HASHTAGS (batch mode) 
Ver archivo 
./src/main/scala/smx/sql/TopHashtags.scala 
Compilar y Ejecutar 
./sbt/sbt assembly 
spark-submit  
--class smx.sql.TopHashtags  
target/scala-2.10/wisit2014-spark-assembly-0.0.1.jar  
data/tweets-20141126-sample.json
Procesando 
tweets en 
Real-time
Stream es una secuencia de RDD
Streaming 
Ver archivos 
./src/main/scala/smx/utils/SocketServer.scala 
Iniciar SocketServer (simula Twitter Streaming) 
java  
-cp target/scala-2.10/wisit2014-spark-assembly-0.0.1.jar  
smx.utils.SocketServer  
data/tweets-20141126-sample.json
Streaming (cont.) 
Ver archivo 
./src/main/scala/smx/stream/StreamProcessor.scala 
Iniciar Streaming Processor 
spark-submit  
--class smx.stream.StreamProcessor  
target/scala-2.10/wisit2014-spark-assembly-0.0.1.jar
h)p://localhost:4040/
CHALLENGE 
Cambiar de Hashtags para TOP Usuarios 
TIP: 
El usuario es user.screen_name en el JSON
Usando SparkStreaming con Twitter 
(necesita conexión de internet) 
Training Oficial 2014 
Stream Processing with Spark Streaming 
https://databricks-training.s3.amazonaws.com/realtime-processing-with- 
spark-streaming.html
Donde aprender 
más?
Mucha documentación disponible 
https://spark.apache.org/documentation.html 
http://spark-summit.org/2014/training 
http://arjon.es/tag/spark/ 
http://www.slideshare.net/frodriguezolivera/apache-spark- 
41601032 
First Steps to Scala 
http://www.artima.com/scalazine/articles/steps.html 
http://shop.oreilly.com/ 
product/0636920028512.do
Gracias & Obrigado! 
Gustavo Arjones 
gustavo@socialmetrix.com 
@arjones 
jobs@socialmetrix.com

Tutorial en Apache Spark - Clasificando tweets en realtime

  • 1.
    Tutorial en ApacheSpark Clasificando Tweets en Realtime Gustavo Arjones [email protected] @arjones
  • 2.
    AGENDA • Quées Apache Spark? • Introducción a Scala • Crear un pipeline con Apache Spark (Word Count) • Cargar JSON de Tweets (Statuses) • Crear un programa que consume del stream (simulado) • Obtener los lenguajes de programación más hablados • Por usuario, por url, por localización
  • 3.
  • 4.
    Qué es Spark? Apache Spark™ is a fast and general engine for large-scale data processing. • Procesamiento In-memory (preferentemente) • Framework de Procesamiento Unificado • Para Ingenieros & Data Scientists
  • 5.
    Principales Pilares TaskScheduler • Prepara los jobs a través de DAG (Directed acyclic graph) • Concatena funciones para ejecutar los stages • Cache-aware; considera utilización & localización de datos (data locality) • Partitioning-aware para reducir shuffles por la red RDD (Resilient Distributed Datasets) • Estructura de datos Inmutable (In-memory) • Tolerante a fallas (Se rearma en caso de falla) • Estructura de datos que puede ser operada en paralelo • Rica interfaz de Transformations & Actions
  • 6.
  • 7.
  • 8.
    DISCLAIMER Para quelos ejercicios sean realizados dentro del tiempo establecido para el laboratorio los datasets son chicos. Las soluciones que desarrollamos acá pueden escalar para cientos de servidores y Terabytes de datos Las técnicas se aplican a mayor Volumen y Velocidad: Internet Of Things (IoT), Logs, games, mobile, etc
  • 9.
  • 10.
    Declarando Variables val à declara variables inmutables (final en Java)
  • 11.
    Declarando Función Crearuna función que calcule el valor al cubo def à declara función scala> cube(10) res0: Int = 1000
  • 12.
    Usar MAP NOTA:Es una función, no la estructura de datos! Aplicar la función cube() a la lista de números myNumbers scala> myNumbers.map(cube(_)) scala> myNumbers.map(cube)
  • 13.
    Usar Map andTuples Tuples son estructura auxiliares que permiten llevar multiplos valores sin necesidad de crear clases (VO) scala> myNumbers.map(n => (n, cube(n))) res1: List[(Int, Int)] = List((1,1), (2,8), (5,125), (4,64), (7,343), (3,27)) scala> myNumbers.map(n => (n, cube(n))).foreach(println) (1,1) (2,8) (5,125) (4,64) (7,343) (3,27)
  • 14.
    Usar Filter AplicarFilter a la lista myNumbers dejando solo impares scala> myNumbers.filter(n => (n % 2) == 1) res6: List[Int] = List(1, 5, 7, 3) scala> myNumbers.filter(_ % 2 == 1) res6: List[Int] = List(1, 5, 7, 3)
  • 15.
    Usar Reduce Sumartodos los elementos de la lista scala> myNumbers.reduce((x, y) => x + y) res10: Int = 22 scala> myNumbers.reduce(_ + _)
  • 16.
    CHALLENGE Sumar todoslos números pares en el rango de 0-99 TIP: scala> val numbers = Range(0, 100) numbers: scala.collection.immutable.Range = Range(0, 1, ..) scala> numbers.filter(_ % 2 == 0).reduce(_ + _) res2: Int = 2450
  • 17.
    Creando el primeropipeline con Apache Spark Código Fuente: https://github.com/socialmetrix/wisit14
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
    Apache Spark esLazy! Viste que no pasó nada hasta la última linea? Nada es procesado entre Transformaciones. Solo se ejecuta cuando se realiza una Acción (top)
  • 27.
    API muy expresiva,mucho más operaciones! Ver: https://spark.apache.org/docs/latest/api/scala/#org.apache.spark.rdd.RDD
  • 28.
    CHALLENGE El resultadono es muy interesante, porque las principales palabras son stopwords, remueverlas para dar mayor significado
  • 29.
  • 30.
    Propuesta Crear unlistado de los lenguajes más tweetados, similar al listado de lenguajes que crea Github http://adambard.com/blog/top-github-languages-2014/
  • 31.
    Consideraciones • Datasetcontiene un JSON por linea (one-liner) • Hay que interpretar JSON • Pueden haber erroes en los JSON – Lineas vacias – Lineas malformadas / Diferentes schemas
  • 33.
    Obtener las TOPHASHTAGS (batch mode) Ver archivo ./src/main/scala/smx/sql/TopHashtags.scala Compilar y Ejecutar ./sbt/sbt assembly spark-submit --class smx.sql.TopHashtags target/scala-2.10/wisit2014-spark-assembly-0.0.1.jar data/tweets-20141126-sample.json
  • 34.
  • 35.
    Stream es unasecuencia de RDD
  • 36.
    Streaming Ver archivos ./src/main/scala/smx/utils/SocketServer.scala Iniciar SocketServer (simula Twitter Streaming) java -cp target/scala-2.10/wisit2014-spark-assembly-0.0.1.jar smx.utils.SocketServer data/tweets-20141126-sample.json
  • 37.
    Streaming (cont.) Verarchivo ./src/main/scala/smx/stream/StreamProcessor.scala Iniciar Streaming Processor spark-submit --class smx.stream.StreamProcessor target/scala-2.10/wisit2014-spark-assembly-0.0.1.jar
  • 38.
  • 39.
    CHALLENGE Cambiar deHashtags para TOP Usuarios TIP: El usuario es user.screen_name en el JSON
  • 40.
    Usando SparkStreaming conTwitter (necesita conexión de internet) Training Oficial 2014 Stream Processing with Spark Streaming https://databricks-training.s3.amazonaws.com/realtime-processing-with- spark-streaming.html
  • 41.
  • 42.
    Mucha documentación disponible https://spark.apache.org/documentation.html http://spark-summit.org/2014/training http://arjon.es/tag/spark/ http://www.slideshare.net/frodriguezolivera/apache-spark- 41601032 First Steps to Scala http://www.artima.com/scalazine/articles/steps.html http://shop.oreilly.com/ product/0636920028512.do
  • 43.