Introducción a Apache Spark a través de un caso de uso cotidiano

24
Procesamiento de datos Procesamiento de datos robusto y escalable con robusto y escalable con Apache Spark Apache Spark Ing. Adrián Fernando Fiore Ingeniero en Sistemas UTN FRBA Docente de Algoritmos y Estructura de Datos Desarrollador Backend en Socialmetrix @AdrianFiore Ing. Pablo Romanelli Ingeniero en Sistemas UTN FRBA Docente de Técnicas Avanzadas de Programación Desarrollador Scala en Socialmetrix @PabloRomanelli2

description

Esta presentación está orientada a introducir Apache Spark a través de un caso de uso cotidiano. Mostraremos cómo diseñar una solución para generar código mantenible y testeable. Esto es crucial en ambientes con grandes volúmenes de datos y tiempos de procesamiento prolongados, donde un error implica un gran esfuerzo en el reproceso. La charla fue realizada en la JavaConf 2014. El source code está disponible acá: https://github.com/socialmetrix/spark-javaconf

Transcript of Introducción a Apache Spark a través de un caso de uso cotidiano

Page 1: Introducción a Apache Spark a través de un caso de uso cotidiano

Procesamiento de datos Procesamiento de datos robusto y escalable con robusto y escalable con

Apache SparkApache Spark

Ing. Adrián Fernando Fiore

Ingeniero en Sistemas UTN FRBADocente de Algoritmos y Estructura de Datos

Desarrollador Backend en Socialmetrix

@AdrianFiore

Ing. Pablo Romanelli

Ingeniero en Sistemas UTN FRBADocente de Técnicas Avanzadas de Programación

Desarrollador Scala en Socialmetrix

@PabloRomanelli2

Page 2: Introducción a Apache Spark a través de un caso de uso cotidiano

Agenda

• Qué hacemos?• Problema a resolver• Evolución de la solución• Spark• Resolución del problema• Ventajas obtenidas

Page 3: Introducción a Apache Spark a través de un caso de uso cotidiano

Medimos la actividad de las compañías y personalidades en las redes sociales para

generar valor a profesionales de Marketing, Investigación de Mercado y Producto.

Software As A Service

Page 4: Introducción a Apache Spark a través de un caso de uso cotidiano
Page 5: Introducción a Apache Spark a través de un caso de uso cotidiano

Problema

Econtrar cuantas veces una cuenta de Twitter es mencionada junto

con un hashtag

Restricciones:•En un intervalo de tiempo•Para un conjunto finito de cuentas y tweets

Page 6: Introducción a Apache Spark a través de un caso de uso cotidiano

Necesitamos una herramienta de procesamiento distribuido para grandes

volúmenes de datos!!!

Page 7: Introducción a Apache Spark a través de un caso de uso cotidiano

Evolución de la soluciónHadoop Map ReduceHadoop Map Reduce

Ventajas• Escalable (voy creciendo a demanda)• Se puede usar Amazon EMR (fácil de administrar)• No hay costo de licencias, solo levantar los servers

Desventajas• Hay que implementar la lógica en términos de map

y reduce• Se necesita mucho código para implementar

acciones simples como join, group, etc.• Es batch, lento (baja a disco por cada etapa de

procesamiento)

Page 8: Introducción a Apache Spark a través de un caso de uso cotidiano

Apache HiveApache Hive

Ventajas• Capa de abstracción sobre Hadoop Map Reduce

(tenemos todas sus ventajas)• La lógica se implementa en SQL (algo ya conocido

que me abstrae del código complejo de map y reduce)

Desventajas• Lenguaje SQL no está orientado a flujo de datos

sino a consultas• No hay un IDE de desarrollo• Difícil de testear, difícil de encontrar bugs• Tiempos de ejecución prolongados y variables

Evolución de la solución

Page 9: Introducción a Apache Spark a través de un caso de uso cotidiano

Apache SparkApache Spark

• Motor de procesamiento distribuido para Big Data• Puede utilizarse sobre Java, Scala o Python

• Por qué lo elegimos?• Qué ventajas nos trae?• Cómo resulvo el problema usando Spark?

Evolución de la solución

Page 10: Introducción a Apache Spark a través de un caso de uso cotidiano

Ejemplos para entender el problema{ "text": "@adrian vamos a la #javaconf", "user": { "screen_name": "pablo", ... }, "entities": { "hashtags": [ { "text": "javaconf", ... } ], "user_mentions": [ { "screen_name": "adrian", ... } ], ... }, ...}

List((adrian, javaconf)

)ResultadoResultado

Page 11: Introducción a Apache Spark a través de un caso de uso cotidiano

Ejemplos para entender el problema

{ "text": "Hola @adrian", "user": { "screen_name": "pablo", ... }, "entities": { "hashtags": [ ], "user_mentions": [ { "screen_name": "adrian", ... } ], ... }, ...} List()ResultadoResultado

Page 12: Introducción a Apache Spark a través de un caso de uso cotidiano

Ejemplos para entender el problema

{ "text": "Codeando en #spark", "user": { "screen_name": "pablo", ... }, "entities": { "hashtags": [ { "text": "spark", ... } ], "user_mentions": [ ], ... }, ...} ResultadoResultado List()

Page 13: Introducción a Apache Spark a través de un caso de uso cotidiano

Ejemplos para entender el problema{ "text": "@adrian aca en #javaconf usando #spark", "user": { "screen_name": "pablo", ... }, "entities": { "hashtags": [ { "text": "javaconf", ... }, { "text": "spark", ... } ], "user_mentions": [ { "screen_name": "adrian", ... } ], ... }, ...}

List((adrian, javaconf),(adrian, spark)

)

ResultadoResultado

Page 14: Introducción a Apache Spark a través de un caso de uso cotidiano

"text": "@adrian aca en #javaconf usando #spark", "user": { "screen_name": "pablo", ... }, "entities": { "hashtags": [ { "text": "javaconf", ... }, { "text": "spark", ... } ], "user_mentions": [ { "screen_name": "adrian", ... } ], ...

Ejemplos para entender el problema{ "text": "RT @pablo: @adrian aca en #javaconf usando ...", "user": { "screen_name": "pedro", ... }, "entities": { "hashtags": [ { "text": "javaconf", ... } ], "user_mentions": [ { "screen_name": "adrian", ... }, { "screen_name": "pablo", ... } ], ... },

"retweeted_status": {…},...

}

List((adrian, javaconf),(adrian, spark),(pablo, javaconf),(pablo, spark)

)

Res

ult

ado

Res

ult

ado

Page 15: Introducción a Apache Spark a través de un caso de uso cotidiano

Ejemplos para entender el problema

List(List(

(adrian, javaconf)),List(),List(),List(

(adrian, javaconf), (adrian, spark)),List(

(adrian, javaconf), (adrian, spark),(pablo, javaconf), (pablo, spark)

))

List((

(adrian, javaconf),3

),(

(adrian,spark),2

),(

(pablo,javaconf),1

),(

(pablo,spark),1

))

Page 16: Introducción a Apache Spark a través de un caso de uso cotidiano

Algunos ejemplos en Spark Shell

Page 17: Introducción a Apache Spark a través de un caso de uso cotidiano

Ejemplos para entender el problema

List(List(

(adrian, javaconf)),List(),List(),List(

(adrian, javaconf), (adrian, spark)),List(

(adrian, javaconf), (adrian, spark),(pablo, javaconf), (pablo, spark)

))

Tweets en Json

Page 18: Introducción a Apache Spark a través de un caso de uso cotidiano

Ejemplos para entender el problema

List((adrian, javaconf),(adrian, javaconf),(adrian, spark),(adrian, javaconf),(adrian, spark),(pablo, javaconf),(pablo, spark)

)

List(List(

(adrian, javaconf)),List(),List(),List(

(adrian, javaconf), (adrian, spark)),List(

(adrian, javaconf), (adrian, spark),(pablo, javaconf), (pablo, spark)

))

flatMapflatMap

Page 19: Introducción a Apache Spark a través de un caso de uso cotidiano

Ejemplos para entender el problema

List(( (adrian, javaconf), 1 ),( (adrian, javaconf), 1 ),( (adrian, spark), 1 ),( (adrian, javaconf), 1 ),( (adrian, spark), 1 ),( (pablo, javaconf), 1 ),( (pablo, spark), 1)

)

List((adrian, javaconf),(adrian, javaconf),(adrian, spark),(adrian, javaconf),(adrian, spark),(pablo, javaconf),(pablo, spark)

)

mapmap

Page 20: Introducción a Apache Spark a través de un caso de uso cotidiano

Ejemplos para entender el problema

List(( (adrian, javaconf), 3 ),( (adrian, spark), 2 ),( (pablo, javaconf), 1 ),( (pablo, spark), 1 )

)

List(( (adrian, javaconf), 1 ),( (adrian, javaconf), 1 ),( (adrian, spark), 1 ),( (adrian, javaconf), 1 ),( (adrian, spark), 1 ),( (pablo, javaconf), 1 ),( (pablo, spark), 1)

)

reduceByKeyreduceByKey

Page 21: Introducción a Apache Spark a través de un caso de uso cotidiano

https://github.com/socialmetrix/spark-javaconf

Código FuenteCon la resolución paso a paso

Page 22: Introducción a Apache Spark a través de un caso de uso cotidiano

Ventajas que nos da Spark

•Es open source, comunidad activa, suben material online

•Consola interactiva para hacer pruebas

•Lenguaje de programación (Scala, Java, Python):• Programo en un lenguaje que conozco• Puedo usar mis abstracciones (mis tipos de datos)• Tengo un IDE que me ayuda a codear, a hacer refactors, etc.• Las funciones del RDD se comportan igual que las de las listas (me abstrae que

luego corre distribuido)

•Testeable y Mantenible:• Código corto y claro• Me genera confianza en mi proceso• Si hay un bug, puedo hacer un nuevo test y reproducirlo

•Consola de monitoreo simple y útil

Page 23: Introducción a Apache Spark a través de un caso de uso cotidiano

Pablo y Adrián

[email protected]

MUCHAS GRACIAS!

Page 24: Introducción a Apache Spark a través de un caso de uso cotidiano

Consultas