Tutorial en Apache Spark - Clasificando tweets en realtime

Preview:

DESCRIPTION

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.

Citation preview

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!

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

DISCLAIMER

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

scala> numbers.filter(_ % 2 == 0).reduce(_ + _) res2: Int = 2450

TIP: scala> val numbers = Range(0, 100) numbers: scala.collection.immutable.Range = Range(0, 1, ..)

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