Saltar al contenido principal
Página

Tema 3.1 - Procesamiento de Flujos con Spark

Objetivos del Aprendizaje 

● Comprender la necesidad del procesamiento de flujos 

● Entender Apache Spark y su arquitectura 

● Entender RDD y DAG como características principales de Spark 

● Entender las librerías MLib y GraphX dentro de Spark 

● Entender muchos casos de uso de Spark 


Arquitectura del Big Data



Definición de Stream Computing 

● Procesamiento de grandes cantidades de datos a partir de un vasto conjunto de flujos de datos entrantes extremadamente rápidos 

● Extracción de datos en movimiento 

● Calcular métricas simples y aproximadas en tiempo real 

● Relajar muchos requisitos de precisión computacional


Conceptos de Streaming 

● Ritmo de ingesta de datos elevado e imprevisible 

● Control del programador frente a personas al azar 

● Los datos son demasiado grandes para almacenarlos en la memoria 

● Hacer un procesamiento simple en el flujo con cálculos mínimos. Por ejemplo: 

  1. Contar la media, el recuento y el máximo en un flujo 
  2. Contar el número de 1's en un flujo de 0's y 1's 
  3. Contar el número de elementos distintos en un flujo 

● Analizar una ventana deslizante del flujo (tiempo o elementos de datos) 

● Los elementos antiguos se deslizan fuera de la ventana 

● Muestrear el flujo para obtener resultados aproximados 


Aplicaciones de Streaming 

● Flujos de consulta minera 

● Qué consultas son más frecuentes hoy 

● Minería de secuencias de clics 

● Qué URL se hacen clic con más frecuencia a esta hora 

● Minería de redes IP conmutadas 

● Identificar ataques de denegación de servicio 


Características del Algoritmo de Streaming 

● Calcule las propiedades sin almacenar todo el flujo 

● Limitar el número de pasos aritméticos por cada nuevo elemento de datos 

● N es tan grande que queremos almacenar sólo O (log N) 

● Filtrar el flujo para reducir el número de cosas que hay que hacer 

● La eficiencia es esencial 

● Consultas ad hoc y permanentes 


Filtro Bloom 

● Es un algoritmo de streaming muy popular 

● Puede mostrar si una URL ha sido vista antes 

● Utiliza una larga cadena de 1's y unas cuantas funciones hash 

● Cada nueva entrada utiliza todas las funciones hash para establecer los bits en la cadena de 1's 

● Si la nueva entrada tiene el hash de todos los 1's en la cadena, entonces esa entrada ha sido vista antes 

● Crea algunos falsos positivos, pero ningún falso negativo


Apache Spark para Stream Computing 

●Apache Spark es un motor integrado, rápido, en memoria y de propósito general para el procesamiento de datos a gran escala 

● Spark es ideal para tareas de procesamiento iterativo e interactivo en grandes conjuntos y flujos de datos 

● Spark consigue un rendimiento entre 10 y 100 veces superior al de Hadoop al funcionar con una construcción en memoria denominada "conjuntos de datos distribuidos resistentes" (RDD), que ayudan a evitar las latencias que conllevan las lecturas y escrituras en disco 

● Spark permite a los programadores desarrollar cadenas de datos complejas y de varios pasos utilizando el patrón de gráficos acíclicos dirigidos (DAG) 

● Spark está escrito principalmente en Scala, un lenguaje de alto nivel. Las bibliotecas integradas de Spark (para el aprendizaje automático, el procesamiento de gráficos, el procesamiento de flujos y el SQL) ofrecen un procesamiento de datos rápido y sin fisuras, además de una gran productividad para el programador 

● Spark se ha convertido en una alternativa más eficiente y productiva para Hadoop, es compatible con los sistemas de archivos y las herramientas de Hadoop 


Ecosistema de Código Abierto



Arquitectura de Apache Spark



Spark vs Hadoop





Conjuntos de Datos Distribuidos de Spark (RDD) 

● Los RDD (Resilient Distributed Datasets), son colecciones inmutables y particionadas de registros. Mantienen los datos en memoria y pueden mejorar el rendimiento en un orden de magnitud 

● Los RDDs sólo pueden crearse mediante: a) la lectura de datos de un almacenamiento estable como HDFS o b) transformaciones sobre RDDs existentes 

● La API de Spark permite dos tipos principales de operaciones sobre RDDs: transformaciones y acciones. Las transformaciones incluyen map(), filter(), sample() y union() 





                                                                                 

      • Spark: es una plataforma: la misma abstracción para diferentes casos de uso
      • Spark: Tareas "batch" (por lotes)
      • Spark-streaming: tareas de flujo de datos spark-
      • Mllib: aprendizaje automático
      • Spark-graphx: manipulación de grafos
      • Spark-sql: abstracción SQL
      • Spark-R: ejecución de R en spark
      • Pyspark: ejecución de python en spark
      • Docenas de extensiones...

Flux vs. Batch:

      • Inicialmente, el big-data funcionaba en "lote"
      • Creación de índices, informes, etc. todos los días (24 h)
      • Presión para obtener resultados cada vez más rápidos
      • Problema básico: la duración de una tarea por lotes debe ser <intervalo entre resultados
      • Necesidad de poder calcular "incrementalmente" en flujo continuo
      • P. ej.: operar en cada "tuit"
      • Se crean diferentes plataformas:
      • Storm (Twitter), Samza (LinkedIn), Spark Streaming

Apache Storm

  • Plataforma de alto rendimiento
  • Cada dato de entrada se procesa individualmente
  • La topología de procesamiento puede ser muy compleja
  • Desarrollado en Twitter con el propósito de generar tweets en tiempo real
  • El sistema de Hass fue sustituido por un sistema aún más eficiente







  • Apache Samza

  • Desarrollado en LinkedIn
  • Desarrollado en torno a las garantías y
  • propiedades de Kafka
  • Una tarea Samza consume un "tema" de Kafka y genera un nuevo flujo de datos
  • Este flujo se envía generalmente a otro "tema" de Kafka
  • Abstracción de tuberías y filtros en Kafka



  • Mecanismo de Procesamiento de Spark




    Código Spark para Pagerank 

    ● //load the edges as a graph object 

    ● val graph = GraphLoader.edgeListFile(sc, "outlink.txt") 

    ● // Run pagerank 

    ● val ranks = graph.pagerank(0.00000001).vértices 

    ● // join the rank with the webpages 

    ● val pages = sc.textFile("pages.txt").map{line => val fields = line.split(",") (fields(0).toLong, fields(1)) } 

    ● val ranksByPagename = pages.join(ranks).map { case (id, (pagename, rank)) => (pagename, rank)} 

    ● //print the output 

    ● println(rankByPagename.collect().mkString("\n")) 


    Preguntas de Repaso 

    1. Describir el ecosistema de Apache Spark 

    2. Comparar Spark y Hadoop en cuanto a su capacidad de hacer stream computing 

    3. ¿Qué es un RDD? ¿Cómo hace que Spark sea más rápido? 

    4. Describa tres capacidades principales de Spark para el análisis de datos

    Última modificación: lunes, 28 de marzo de 2022, 17:27