Artículo 1 | Descripción general de Spark

Apache Spark nació originalmente en el laboratorio APM de la Universidad de California, Berkeley en 2009, y fue de código abierto en 2010. Ahora es uno de los principales proyectos de código abierto de la Apache Software Foundation. El objetivo de Spark es diseñar un modelo de programación que pueda analizar datos rápidamente. Spark proporciona cálculos en memoria y reduce la sobrecarga de E / S. Además, Spark está escrito en base a Scala, lo que proporciona una experiencia de programación interactiva. Después de 10 años de desarrollo, Spark se ha convertido en una plataforma de procesamiento de big data de moda. La última versión es Spark3.0. Este artículo es principalmente para brindar una descripción general de Spark, y el contenido de seguimiento discutirá detalles específicos. El contenido principal de este artículo incluye:

  • Análisis de atención de Spark
  • Características de Spark
  • Algunos conceptos importantes de Spark
  • Descripción general de los componentes de Spark
  • Descripción general de la arquitectura operativa de Spark
  • Primera experiencia de programación Spark

Análisis de intereses de Spark

Visión de conjunto

La siguiente figura muestra las tendencias de búsqueda nacionales de Spark, Hadoop y Flink durante el año pasado.

Inserte la descripción de la imagen aquí

Las tendencias de búsqueda globales para Spark, Hadoop y Flink en el último año son las siguientes:
Inserte la descripción de la imagen aquí

Distribución regional del interés de búsqueda nacional en Spark, Hadoop y Flink en el último año (en orden descendente de interés de búsqueda de Flink):

Inserte la descripción de la imagen aquí

Distribución regional del interés de búsqueda global en Spark, Hadoop y Flink en el último año (en orden descendente de interés de búsqueda de Flink):

Inserte la descripción de la imagen aquí

análisis

Se puede ver en las 4 imágenes anteriores que en el último año, ya sea a nivel nacional o mundial, el interés de búsqueda de Spark siempre ha sido mayor que el de Hadoop y Flink. En los últimos años, Flink se ha desarrollado rápidamente y cuenta con el respaldo de Ali en China. Las características de procesamiento de flujo natural de Flink lo convierten en el marco preferido para desarrollar aplicaciones de flujo. Se puede ver que aunque Flink es muy popular en China, todavía no es tan popular como Spark en el mundo. Así que aprender y dominar la tecnología Spark sigue siendo una buena opción. La tecnología tiene muchas similitudes. Si dominas Spark y luego aprendes Flink, creo que te sentirás familiarizado.

Características de Spark

  • alta velocidad

    Apache Spark utiliza un programador DAG, un optimizador de consultas y un motor de ejecución física para proporcionar un alto rendimiento para el procesamiento por lotes y de flujo.

  • Fácil de usar

    Admite el uso de Java, Scala, Python, R y SQL para escribir aplicaciones rápidamente. Spark proporciona más de 80 operadores de operaciones avanzadas para crear fácilmente aplicaciones paralelas.

  • Versatilidad

    Spark proporciona una pila ecológica muy rica, que incluye componentes como consultas SQL, computación de transmisión, aprendizaje automático y computación de gráficos. Estos componentes se pueden integrar sin problemas en una aplicación y, a través de una implementación única, puede manejar una variedad de escenarios informáticos complejos

  • Varios modos de funcionamiento

    Spark se puede ejecutar en modo independiente o en entornos como Hadoop, Apache Mesos y Kubernetes. Y puede acceder a datos de múltiples fuentes de datos como HDFS, Alluxio, Apache Cassandra, Apache HBase y Apache Hive.

Algunos conceptos importantes de Spark

  • RDD

    Resilient Distributed Dataset, un concepto abstracto de memoria distribuida, proporciona un modelo de memoria compartida altamente restringido

  • DÍA

    Gráfico acíclico dirigido, que refleja la dependencia entre RDD

  • Solicitud

    Spark programa escrito por el usuario, el programa controlador y la composición de los ejecutores


  • Paquete JAR de aplicación escrito por el usuario jar de la aplicación

  • El programa controlador
    utiliza el proceso de la función main () del programa para crear SparkContext

  • Administrador de clústeres El administrador de
    clústeres es un servicio externo que se utiliza para la asignación de solicitudes de recursos (como administrador independiente, Mesos, YARN)

  • Modo de implementación

    El modo de implementación determina dónde se ejecuta el proceso del controlador. Si está en modo clúster , el marco en sí mismo iniciará el proceso del controlador en una máquina dentro del clúster. Si está en modo cliente , el proceso del controlador se iniciará en la máquina donde se envía el programa

  • Nodo trabajador

    El nodo Executor que ejecuta la aplicación en el clúster es un proceso que se ejecuta en el nodo Worknode, responsable de ejecutar tareas específicas y almacenar datos para la aplicación.

  • Tarea
    unidad de trabajo que se ejecuta en ejecutor

  • Trabajo
    Un trabajo contiene varios RDD y una serie de operaciones de operador que se ejecutan en el RDD. El trabajo debe activarse mediante operaciones de acción (como guardar, recopilar, etc.)

  • Etapa
    Cada trabajo está dividido por una etapa compuesta por una serie de tareas que pondría en escena la interdependencia

Descripción general de los componentes de Spark

El ecosistema Spark incluye principalmente componentes como Spark Core, SparkSQL, SparkStreaming, MLlib y GraphX, como se muestra en la siguiente figura:

Inserte la descripción de la imagen aquí

  • Spark Core

    Spark core es el núcleo de Spark, incluidas las funciones básicas de Spark, como la computación de memoria, la programación de tareas, el modo de implementación, la administración de almacenamiento, etc. SparkCore proporciona una API basada en RDD que es la base de otras API de alto nivel y su función principal es implementar el procesamiento por lotes.

  • Spark SQL

    Spark SQL está diseñado para procesar datos estructurados y semiestructurados. SparkSQL permite a los usuarios consultar datos estructurados utilizando SQL, DataFrame y DataSetAPI en programas Spark, y admite lenguajes Java, Scala, Python y R. Debido a que la API de DataFrame proporciona una forma unificada de acceder a varias fuentes de datos (incluidos Hive, Avro, Parquet, ORC y JDBC), los usuarios pueden conectarse a cualquier fuente de datos de la misma manera. Además, Spark SQL puede usar metadatos de Hive, logrando así una integración perfecta con Hive.Los usuarios pueden ejecutar trabajos de Hive directamente en Spark. Se puede acceder a Spark SQL a través de los comandos de shell spark-sql .

  • SparkStreaming

    SparkStreaming es un módulo muy importante de Spark, que puede lograr la escalabilidad, el alto rendimiento y el procesamiento de flujo tolerante a fallas de los flujos de datos en tiempo real. Internamente, su método de trabajo es dividir el flujo de datos de entrada en tiempo real en una serie de micro lotes, que luego son procesados ​​por el motor Spark. SparkStreaming admite múltiples fuentes de datos, como kafka, Flume y sockets TCP, etc.

  • MLlib

    MLlib es una biblioteca de aprendizaje automático proporcionada por Spark. Los usuarios pueden usar la API de Spark para crear una aplicación de aprendizaje automático. Spark es particularmente bueno en la computación iterativa y su rendimiento es 100 veces mayor que el de Hadoop. La biblioteca contiene algoritmos comunes de aprendizaje automático, como regresión logística, máquina de vectores de soporte, clasificación, agrupamiento, regresión, bosque aleatorio, filtrado colaborativo, análisis de componentes principales, etc.

  • GraphX

    GraphX ​​es una API para computación de gráficos en Spark. Puede considerarse como una reescritura y optimización de Pregel en Spark. GraphX ​​tiene un buen rendimiento, funciones y operadores ricos y puede ejecutar libremente algoritmos de gráficos complejos en cantidades masivas de datos. GraphX ​​tiene muchos algoritmos de gráficos integrados, como el famoso algoritmo PageRank.

Descripción general de la arquitectura operativa de Spark

En general, la arquitectura de la aplicación Spark incluye las siguientes partes principales:

  • Programa conductor
  • Nodo maestro
  • Nodo de trabajo
  • Ejecutor
  • Tareas
  • SparkContext

En el modo autónomo , la arquitectura operativa se muestra en la siguiente figura:

Inserte la descripción de la imagen aquí

Programa conductor

El programa de controlador es la función main () de la aplicación Spark (crear SparkContext y la sesión Spark). El nodo que ejecuta el proceso del controlador se denomina nodo del controlador. El proceso del controlador se comunica con el administrador del clúster y envía las tareas programadas al ejecutor.

Cluster Manager

Se llama administrador de clúster y se utiliza principalmente para administrar el clúster. Los administradores de clúster comunes incluyen YARN, Mesos y Standalone. Los administradores de clúster independientes incluyen dos procesos en segundo plano de larga ejecución, uno de los cuales está en el nodo principal y el otro en el nodo de trabajo. En el artículo de seguimiento del modo de implementación del clúster, analizaremos el contenido de esta parte en detalle, aquí hay una impresión general.

Nodo trabajador

Los amigos que estén familiarizados con Hadoop deben saber que Hadoop incluye nodos namenode y datanode. Spark es similar y Spark llama al nodo que ejecuta tareas específicas como nodo Worker. El nodo informará los recursos disponibles del nodo actual al nodo Maestro. Por lo general, se inicia un proceso de trabajo en segundo plano en cada nodo Trabajador para iniciar y monitorear el Ejecutor.

Ejecutor

El nodo maestro asigna recursos, usa el nodo Trabajo en el clúster para crear un Ejecutor y el Controlador usa estos Ejecutores para asignar y ejecutar tareas específicas. Cada aplicación tiene su propio proceso de Ejecutor, que utiliza varios subprocesos para ejecutar tareas específicas. El ejecutor es el principal responsable de ejecutar tareas y guardar datos.

Tarea

La tarea es la unidad de trabajo enviada al ejecutor

SparkContext

SparkContext es la entrada a una sesión de Spark y se usa para conectarse a un clúster de Spark. Antes de enviar una solicitud, primero debe inicializar SparkContext. SparkContext implica comunicación de red, sistema de almacenamiento, motor informático, WebUI y otros contenidos. Vale la pena señalar que solo puede haber un SparkContext en un proceso de JVM. Si desea crear un nuevo SparkContext, debe llamar al método stop () en el SparkContext original.

Prueba de programación Spark

Implementación de Spark de agrupación y topN case

Descripción : Hay un archivo order.txt para los datos de los pedidos en HDFS. El campo del archivo tiene un símbolo de segmentación ",", donde los campos indican el ID del pedido, el ID del producto y el monto de la transacción. Los datos de muestra son los siguientes:

Order_00001,Pdt_01,222.8
Order_00001,Pdt_05,25.8
Order_00002,Pdt_03,522.8
Order_00002,Pdt_04,122.4
Order_00002,Pdt_05,722.4
Order_00003,Pdt_01,222.8

Pregunta : Utilice sparkcore para encontrar la identificación del producto con la mayor rotación en cada pedido.

Código de implementación

import org.apache.spark.sql.Row
import org.apache.spark.sql.hive.HiveContext
import org.apache.spark.sql.types.{StringType, StructField, StructType}
import org.apache.spark.{SparkConf, SparkContext}

object TopOrderItemCluster {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("top n order and item")
    val sc = new SparkContext(conf)
    val hctx = new HiveContext(sc)
    val orderData = sc.textFile("data.txt")
    val splitOrderData = orderData.map(_.split(","))
    val mapOrderData = splitOrderData.map { arrValue =>
      val orderID = arrValue(0)
      val itemID = arrValue(1)
      val total = arrValue(2).toDouble
      (orderID, (itemID, total))
    }
    val groupOrderData = mapOrderData.groupByKey()

    /**
      ***groupOrderData.foreach(x => println(x))
      ***(Order_00003,CompactBuffer((Pdt_01,222.8)))
      ***(Order_00002,CompactBuffer((Pdt_03,522.8), (Pdt_04,122.4), (Pdt_05,722.4)))
      ***(Order_00001,CompactBuffer((Pdt_01,222.8), (Pdt_05,25.8)))
      */
   
    val topOrderData = groupOrderData.map(tupleData => {
      val orderid = tupleData._1
      val maxTotal = tupleData._2.toArray.sortWith(_._2 > _._2).take(1)
      (orderid, maxTotal)
    }
    )
    topOrderData.foreach(value =>
      println("最大成交额的订单ID为:" + value._1 + " ,对应的商品ID为:" + value._2(0)._1)

      /**
        ***最大成交额的订单ID为:Order_00003 ,对应的商品ID为:Pdt_01
        ***最大成交额的订单ID为:Order_00002 ,对应的商品ID为:Pdt_05
        ***最大成交额的订单ID为:Order_00001 ,对应的商品ID为:Pdt_01
        */
      
    )
    //构造出元数据为Row的RDD
    val RowOrderData = topOrderData.map(value => Row(value._1, value._2(0)._1))
    //构建元数据
    val structType = StructType(Array(
      StructField("orderid", StringType, false),
      StructField("itemid", StringType, false))
    )
    //转换成DataFrame
    val orderDataDF = hctx.createDataFrame(RowOrderData, structType)
   // 将数据写入Hive
    orderDataDF.registerTempTable("tmptable")
    hctx.sql("CREATE TABLE IF NOT EXISTS orderid_itemid(orderid STRING,itemid STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t'")
      hctx.sql("INSERT INTO orderid_itemid SELECT * FROM tmptable")
  }

}

Empaquete el código anterior y envíelo al clúster para que se ejecute. Puede ingresar al shell hive cli o spark-sql para ver los datos en Hive.

para resumir

Este artículo presenta principalmente Spark como un todo, incluyendo principalmente el análisis de popularidad de búsqueda de Spark, las características principales de Spark, algunos conceptos importantes de Spark y la arquitectura en ejecución de Spark, y finalmente se da un caso de programación de Spark. Este artículo es el primero compartido por la serie Spark. Primero, puede tener una idea de la perspectiva global de Spark. El próximo compartirá la guía de programación Spark Core.
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/jmx_bigdata/article/details/107400709
Recomendado
Clasificación