Articles

Introducción a Apache Spark con Ejemplos y Casos de uso

Oí hablar de Spark por primera vez a finales de 2013, cuando me interesé en Scala, el lenguaje en el que está escrito Spark. Algún tiempo después, hice un divertido proyecto de ciencia de datos tratando de predecir la supervivencia en el Titanic. Esto resultó ser una gran manera de obtener una mayor introducción a los conceptos y la programación de Spark. Lo recomiendo encarecidamente a cualquier aspirante a desarrollador de Spark que busque un lugar para comenzar.

Hoy en día, Spark está siendo adoptado por jugadores importantes como Amazon, eBay y Yahoo! Muchas organizaciones ejecutan Spark en clústeres con miles de nodos. Según las preguntas frecuentes de Spark, el clúster más grande conocido tiene más de 8000 nodos. De hecho, Spark es una tecnología de la que vale la pena tomar nota y aprender.

Este artículo proporciona una introducción a Spark que incluye casos de uso y ejemplos. Contiene información del sitio web de Apache Spark, así como el libro Learning Spark: Análisis de Big Data a la velocidad de la luz.

¿Qué es Apache Spark? Una introducción

Spark es un proyecto de Apache anunciado como»computación en clúster a la velocidad del rayo». Tiene una próspera comunidad de código abierto y es el proyecto Apache más activo en este momento.

Spark proporciona una plataforma de procesamiento de datos más rápida y general. Spark le permite ejecutar programas hasta 100 veces más rápido en memoria o 10 veces más rápido en disco que Hadoop. El año pasado, Spark se hizo cargo de Hadoop completando el concurso Daytona GraySort de 100 TB 3 veces más rápido en una décima parte del número de máquinas y también se convirtió en el motor de código abierto más rápido para clasificar un petabyte.

Spark también permite escribir código más rápidamente, ya que tiene a su disposición más de 80 operadores de alto nivel. Para demostrarlo, echemos un vistazo a » Hello World!»of BigData: the Word Count example. Escrito en Java para MapReduce, tiene alrededor de 50 líneas de código, mientras que en Spark (y Scala) puede hacerlo de la siguiente manera:

sparkContext.textFile("hdfs://...") .flatMap(line => line.split(" ")) .map(word => (word, 1)).reduceByKey(_ + _) .saveAsTextFile("hdfs://...")

Otro aspecto importante al aprender a usar Apache Spark es el shell interactivo (REPL) que proporciona listo para usar. Usando REPL, se puede probar el resultado de cada línea de código sin necesidad de codificar y ejecutar el trabajo completo. Por lo tanto, la ruta hacia el código de trabajo es mucho más corta y el análisis de datos ad hoc es posible.

Características clave adicionales de Spark incluyen:

  • Actualmente proporciona API en Scala, Java y Python, con soporte para otros lenguajes (como R) en el camino
  • Se integra bien con el ecosistema de Hadoop y las fuentes de datos (HDFS, Amazon S3, Hive, HBase, Cassandra, etc.)
  • Puede ejecutarse en clústeres administrados por Hadoop YARN o Apache Mesos, y también puede ejecutarse de forma independiente

El núcleo de Spark se complementa con un conjunto de potentes bibliotecas de nivel superior que se pueden usar sin problemas en la misma aplicación. Estas bibliotecas incluyen actualmente SparkSQL, Spark Streaming, MLlib (para aprendizaje automático) y GraphX, cada una de las cuales se detalla en este artículo. Actualmente, también se están desarrollando bibliotecas y extensiones adicionales de Spark.

chispa bibliotecas y extensiones

Spark Core

Spark Core es el motor de base a gran escala, paralelo y distribuido de procesamiento de datos. Es responsable de:

  • gestión de memoria y recuperación de fallos
  • programar, distribuir y supervisar trabajos en un clúster
  • interactuar con sistemas de almacenamiento

Spark introduce el concepto de RDD (Conjunto de datos distribuido resiliente), una colección de objetos distribuidos inmutables tolerantes a fallos que se pueden operar en paralelo. Un RDD puede contener cualquier tipo de objeto y se crea cargando un conjunto de datos externo o distribuyendo una colección desde el programa de controladores.

Los RDD admiten dos tipos de operaciones:Las transformaciones

  • son operaciones (como map, filter, join, union, etc.) que se realizan en un RDD y que producen un nuevo RDD que contiene el resultado.Las acciones
  • son operaciones (como reducir, contar, primero, etc.) que devuelven un valor después de ejecutar un cálculo en un RDD.

Las transformaciones en Spark son «perezosas», lo que significa que no calculan sus resultados de inmediato. En su lugar, simplemente «recuerdan» la operación que se va a realizar y el conjunto de datos (por ejemplo, el archivo) al que se va a realizar la operación. Las transformaciones solo se calculan realmente cuando se llama a una acción y el resultado se devuelve al programa del controlador. Este diseño permite que Spark funcione de manera más eficiente. Por ejemplo, si un archivo grande se transformó de varias maneras y se pasó a la primera acción, Spark solo procesaría y devolvería el resultado de la primera línea, en lugar de hacer el trabajo para todo el archivo.

De forma predeterminada, cada RDD transformado se puede volver a calcular cada vez que ejecute una acción en él. Sin embargo, también puede mantener un RDD en memoria mediante el método persist o cache, en cuyo caso Spark mantendrá los elementos en el clúster para un acceso mucho más rápido la próxima vez que lo consulte.

SparkSQL

SparkSQL es un componente de Spark que admite consultas de datos a través de SQL o a través del lenguaje de consultas de Hive. Se originó como el puerto de Apache Hive para ejecutarse sobre Spark (en lugar de MapReduce) y ahora está integrado con la pila de Spark. Además de proporcionar soporte para varias fuentes de datos, permite tejer consultas SQL con transformaciones de código, lo que resulta en una herramienta muy poderosa. A continuación se muestra un ejemplo de consulta compatible con Hive:

// sc is an existing SparkContext.val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)sqlContext.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING)")sqlContext.sql("LOAD DATA LOCAL INPATH 'examples/src/main/resources/kv1.txt' INTO TABLE src")// Queries are expressed in HiveQLsqlContext.sql("FROM src SELECT key, value").collect().foreach(println)

Spark Streaming

Spark Streaming admite el procesamiento en tiempo real de datos de transmisión, como archivos de registro de servidor web de producción (por ejemplo, Apache Flume y HDFS/S3), redes sociales como Twitter y varias colas de mensajería como Kafka. Debajo del capó, Spark Streaming recibe los flujos de datos de entrada y divide los datos en lotes. A continuación, son procesados por el motor Spark y generan el flujo final de resultados en lotes, como se muestra a continuación.

spark streaming

La API de transmisión de Spark coincide estrechamente con la del núcleo de Spark, lo que facilita a los programadores trabajar en los mundos de datos por lotes y de transmisión.

MLlib

MLlib es una biblioteca de aprendizaje automático que proporciona varios algoritmos diseñados para escalar en un clúster para clasificación, regresión, agrupación en clústeres, filtrado colaborativo, etc. (consulte el artículo de Toptal sobre aprendizaje automático para obtener más información sobre ese tema). Algunos de estos algoritmos también funcionan con datos de transmisión, como la regresión lineal utilizando mínimos cuadrados ordinarios o la agrupación de k-means (y más en camino). Apache Mahout (una biblioteca de aprendizaje automático para Hadoop) ya se ha alejado de MapReduce y ha unido fuerzas en Spark MLlib.

GraphX

graphx

GraphX es una biblioteca para manipular gráficos y realizar operaciones paralelas de gráficos. Proporciona una herramienta uniforme para ETL, análisis exploratorio y cálculos de gráficos iterativos. Además de las operaciones integradas para la manipulación de gráficos, proporciona una biblioteca de algoritmos de gráficos comunes, como PageRank.

Cómo usar Apache Spark: Caso de uso de Detección de eventos

Ahora que hemos respondido a la pregunta «¿Qué es Apache Spark?», pensemos en qué tipo de problemas o desafíos se podría utilizar de la manera más efectiva.

Me encontré con un artículo recientemente sobre un experimento para detectar un terremoto mediante el análisis de una transmisión de Twitter. Curiosamente, se demostró que esta técnica era probable que informara de un terremoto en Japón más rápido que la Agencia Meteorológica de Japón. A pesar de que usaron diferentes tecnologías en su artículo, creo que es un gran ejemplo para ver cómo podríamos usar Spark con fragmentos de código simplificados y sin el código de pegamento.

Primero, tendríamos que filtrar tweets que parezcan relevantes como «terremoto»o » temblor». Podríamos usar fácilmente la transmisión de Spark para ese propósito de la siguiente manera:

TwitterUtils.createStream(...) .filter(_.getText.contains("earthquake") || _.getText.contains("shaking"))

Luego, tendríamos que ejecutar un análisis semántico en los tweets para determinar si parecen estar haciendo referencia a una ocurrencia de terremoto actual. Tweets como «Terremoto!»o» Ahora está temblando», por ejemplo, consideraría coincidencias positivas, mientras que tweets como» Asistir a una Conferencia sobre un terremoto «o» El terremoto de ayer fue aterrador » no lo harían. Los autores del trabajo utilizaron una máquina vectorial de soporte (SVM) para este propósito. Haremos lo mismo aquí, pero también podemos probar una versión de transmisión. Un ejemplo de código resultante de MLlib se vería como el siguiente:

// We would prepare some earthquake tweet data and load it in LIBSVM format.val data = MLUtils.loadLibSVMFile(sc, "sample_earthquate_tweets.txt")// Split data into training (60%) and test (40%).val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)val training = splits(0).cache()val test = splits(1)// Run training algorithm to build the modelval numIterations = 100val model = SVMWithSGD.train(training, numIterations)// Clear the default threshold.model.clearThreshold()// Compute raw scores on the test set. val scoreAndLabels = test.map { point => val score = model.predict(point.features) (score, point.label)}// Get evaluation metrics.val metrics = new BinaryClassificationMetrics(scoreAndLabels)val auROC = metrics.areaUnderROC()println("Area under ROC = " + auROC)

Si estamos contentos con la tasa de predicción del modelo, podríamos pasar a la siguiente etapa y reaccionar cada vez que descubrimos un terremoto. Para detectar uno necesitamos un cierto número (es decir, densidad) de tweets positivos en una ventana de tiempo definida (como se describe en el artículo). Ten en cuenta que, para los tweets con los servicios de ubicación de Twitter habilitados, también extraeríamos la ubicación del terremoto. Con este conocimiento, podríamos usar SparkSQL y consultar una tabla Hive existente (que almacena a los usuarios interesados en recibir notificaciones de terremotos) para recuperar sus direcciones de correo electrónico y enviarles un correo electrónico de advertencia personalizado, de la siguiente manera:

// sc is an existing SparkContext.val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)// sendEmail is a custom functionsqlContext.sql("FROM earthquake_warning_users SELECT firstName, lastName, city, email") .collect().foreach(sendEmail)

Otros casos de uso de Apache Spark

Los casos de uso potenciales de Spark se extienden mucho más allá de la detección de terremotos, por supuesto.

Aquí hay una lista rápida (¡pero ciertamente no es exhaustiva!) muestreo de otros casos de uso que requieren lidiar con la velocidad, la variedad y el volumen de Big Data, para lo cual Spark es tan adecuado:

En la industria de los juegos, procesar y descubrir patrones a partir del potencial firehose de eventos en tiempo real en el juego y poder responder a ellos de inmediato es una capacidad que podría generar un negocio lucrativo, para fines como la retención de jugadores, la publicidad dirigida, el ajuste automático del nivel de complejidad, etc.

En la industria del comercio electrónico, la información de transacciones en tiempo real se podía pasar a un algoritmo de agrupación en clúster de streaming como k-means o filtrado colaborativo como ALS. Los resultados podrían incluso combinarse con otras fuentes de datos no estructuradas, como comentarios de clientes o reseñas de productos, y utilizarse para mejorar y adaptar constantemente las recomendaciones con el tiempo a las nuevas tendencias.

En la industria de las finanzas o la seguridad, la pila Spark se puede aplicar a un sistema de detección de fraudes o intrusiones o a una autenticación basada en riesgos. Podría lograr resultados de primera categoría recopilando grandes cantidades de registros archivados, combinándolo con fuentes de datos externas, como información sobre violaciones de datos y cuentas comprometidas (consulte, por ejemplo, https://haveibeenpwned.com/) e información de la conexión/solicitud, como geolocalización de IP o tiempo.

Conclusión

En resumen, Spark ayuda a simplificar la tarea desafiante e intensiva computacionalmente de procesar grandes volúmenes de datos en tiempo real o archivados, estructurados y no estructurados, integrando a la perfección capacidades complejas relevantes, como aprendizaje automático y algoritmos de gráficos. Spark lleva el procesamiento de Big Data a las masas. ¡Mira esto!