Apache Spark [1] es un nuevo framework de procesamiento distribuido para big data, escrito en Scala con wrappers para Python, que viene generando mucha atención de la comunidad por su potencia, simplicidad de uso y velocidad de procesamiento. Ya siendo llamado como el remplazo de Apache Hadoop.
Socialmetrix desarrolla soluciones en este framework para generar reportes y dashboards de información a partir de los datos extraídos de redes sociales.
Los participantes de este tutorial van aprender a levantar información de Twitter usando Spark Streaming, Desarrollar algoritmos para calcular hashtags más frecuentes, usuarios más activos en batch processing aplicarlos en realtime a los nuevos tweets que lleguen a través del stream.
Tutorial en Apache Spark - Clasificando tweets en realtime
1. Tutorial en Apache Spark
Clasificando Tweets en Realtime
Gustavo Arjones
gustavo@socialmetrix.com
@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
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
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
8. 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
11. Declarando Función
Crear una 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 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)
14. 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)
15. Usar Reduce
Sumar todos los elementos de la lista
scala> myNumbers.reduce((x, y) => x + y)
res10: Int = 22
scala> myNumbers.reduce(_ + _)
16. 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
17. Creando el
primero pipeline
con Apache
Spark
Código Fuente:
https://github.com/socialmetrix/wisit14
26. 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)
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 resultado no es muy interesante, porque las principales
palabras son stopwords, remueverlas para dar mayor significado
30. 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/
31. 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
32.
33. 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
39. CHALLENGE
Cambiar de Hashtags para TOP Usuarios
TIP:
El usuario es user.screen_name en el JSON
40. 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