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

Post on 05-Jul-2015

384 views 1 download

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

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

Agenda

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

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

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

Necesitamos una herramienta de procesamiento distribuido para grandes

volúmenes de datos!!!

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)

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

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

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

Ejemplos para entender el problema

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

Ejemplos para entender el problema

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

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

"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

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

))

Algunos ejemplos en Spark Shell

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

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

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

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

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

Código FuenteCon la resolución paso a paso

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

Pablo y Adrián

jobs@socialmetrix.com

MUCHAS GRACIAS!

Consultas