《Spark》------Fundamentos de Spark

Tabla de contenido

1. Introducción a Chispa

1.1 ¿Qué es Chispa?

1.2 Características de Chispa

1.3 Ecosistema de chispas

1.4 Componentes de Spark Core

1.5 Proceso de instalación de chispa

1.5.1 Entorno básico, instalar sistema Linux, entorno Java y entorno Hadoop

1.5.2 Descargar el archivo Spark y descomprimirlo

1.5.3, editar perfil

1.5.4, Spark-shell corriendo

2. Construcción de grupos de chispas

2.1 Modo de implementación de Spark

2.2 ¿Por qué elegir Spark On YARN?

2.3 Modo Spark On YARN

2.4. Iniciar chispa

3. Sintaxis básica de Scala y funciones de método

3.1 Sintaxis básica como definición de variable y bucle de Scala

3.1.1 Definición de variables

 3.1.2, Si bucle

 3.1.3, Bucle For

 3.1.4, bucle Do while

3.2 Colecciones mutables e inmutables

3.2.1 Sintaxis básica de colecciones inmutables

 3.2.2 Sintaxis básica de colecciones mutables

3.3 Arrays variables e inmutables

3.3.1 Gramática básica de matriz inmutable

3.3.2 Sintaxis básica de matrices de variables

3.4 Listas mutables e inmutables

3.4.1 Gramática básica de Lista inmutable

3.4.2 Sintaxis básica de la lista de variables

3.5, tupla

3.6 Mapeo mutable e inmutable (Map)

3.6.1 Gramática básica del Mapa inmutable

3.6.2 Sintaxis básica de la variable Mapa

Cuatro, orientado a objetos

4.1, qué es la orientación a objetos

4.2, que es una clase

4.3, que es un objeto

4.4, la estructura básica de clases y objetos

4.5 Constructor

4.6 Clases de muestra y objetos de muestra

Cinco, programación Spark RDD

5.1, operación de conversión RDD

5.2, operación de acción RDD

5.3, partición RDD

5.4, ​​caché RDD (persistencia)

5.5 Operación y métodos de lectura y escritura de pares clave-valor RDD

5.6 Experimento

6. Chispa SQL

6.1, ¿qué es DataFrame?

6.2, Conversión entre DataFrame, DataSet y RDD

6.2.1 De RDD a DataFrame

6.2.2 De DataFrame a RDD


1. Introducción a Chispa

1.1 ¿Qué es Chispa?

Apache Spark es un motor informático rápido y de uso general diseñado para el procesamiento de datos a gran escala

1.2 Características de Chispa

1. Velocidad de ejecución rápida: admite el cálculo iterativo de datos en la memoria

2. Buena usabilidad: admite escritura en Scala, Java, Python y otros lenguajes, con sintaxis concisa

3. Gran versatilidad: el ecosistema Spark contiene componentes ricos

4. Ejecutar en cualquier lugar: Spark es altamente adaptable y puede acceder a diferentes fuentes de datos

1.3 Ecosistema de chispas

El ecosistema Spark toma Spark Core como núcleo, lee datos de HDFS, Amazon S3 y HBase, y utiliza MESOS, YARN y su propio Standalone como administradores de recursos para programar trabajos para completar los cálculos de la aplicación. Las aplicaciones provienen de diferentes componentes, como el procesamiento por lotes de Spark Shell/Spark Submit, las aplicaciones de procesamiento en tiempo real de Spark Streaming, la consulta SparkSQL, el aprendizaje automático de MLlib, el procesamiento de gráficos GraphX, etc.

1.4 Componentes de Spark Core

Spark Core es la parte central del marco Spark, que realiza las funciones básicas de Spark, incluida la programación de tareas, la gestión de memoria, la recuperación de errores y los módulos de interacción del sistema de almacenamiento.

1) Proporciona un marco informático paralelo distribuido para gráficos acíclicos dirigidos (DAG) y proporciona un mecanismo de caché para admitir múltiples cálculos iterativos o compartir datos, lo que reduce en gran medida la sobrecarga de lectura de datos entre cálculos iterativos.

2) El RDD introducido en Spark es una colección de objetos de solo lectura distribuidos en múltiples nodos informáticos. Estas colecciones son elásticas. Si se pierde una parte del conjunto de datos, se puede reconstruir de acuerdo con el "linaje" para garantizar una falla alta tolerancia.

3) Informática móvil en lugar de datos móviles, la partición RDD puede leer los bloques de datos en el sistema de archivos distribuidos en la memoria de cada nodo para el cálculo

1.5 Proceso de instalación de chispa

1.5.1 Entorno básico, instalar sistema Linux, entorno Java y entorno Hadoop

1.5.2 Descargar el archivo Spark y descomprimirlo

tar -zxvf spark-3.0.3-bin-hadoop2.7.tgz

1.5.3, editar perfil

vim /etc/profile

Agregue contenido de configuración de chispa, preste atención para no sobrescribir

export SPARK_HOME=/home/spark/spark-3.0.3-bin-hadoop2.7
export PATH=$PATH:${SPARK_HOME}/bin

Finalmente, actualice la configuración.

source /etc/profile

1.5.4, Spark-shell corriendo

Después de iniciar Spark Shell con éxito, puede ver el símbolo del símbolo del sistema "Scala>" al final de la información de salida

Use el comando ":quit" para salir de Spark Shell, o use la combinación de teclas "Ctrl + D" para salir de Spark Shell


2. Construcción de grupos de chispas

2.1 Modo de implementación de Spark

1) Modo independiente: Modo local: Spark se ejecuta en una sola máquina

2) Modo pseudodistribuido: modo independiente: use el administrador de clúster simple que viene con Spark

3) Modo distribuido: modo Spark On YARN: use YARN como administrador de clúster

                           Modo Spark On Mesos: uso de Mesos como administrador de clústeres

2.2 ¿Por qué elegir Spark On YARN?

La construcción del modo Spark On YARN es relativamente simple. Solo necesita instalar Spark en un nodo en el clúster YARN. Este nodo se puede usar como un cliente para enviar aplicaciones Spark al clúster YARN.

2.3 Modo Spark On YARN

El modo Spark On YARN tiene dos modos: cliente y clúster.La principal diferencia es que los nodos en ejecución del programa Driver son diferentes.

cliente: el programa Driver se ejecuta en el cliente, que es adecuado para la interacción, la depuración y la esperanza de ver el resultado de la operación de inmediato.

clúster: el programa Driver se ejecuta en AM (AplicationMaster) iniciado por RM (ResourceManager), que es adecuado para entornos de producción.        

2.4. Iniciar chispa

spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
/home/spark/spark-3.0.3-bin-hadoop2.7/examples/jars/spark-examples_2.12-3.0.3.jar

3. Sintaxis básica de Scala y funciones de método

3.1 Sintaxis básica como definición de variable y bucle de Scala

3.1.1 Definición de variables

 3.1.2, Si bucle

 3.1.3, Bucle For

 3.1.4, bucle Do while

 

3.2 Colecciones mutables e inmutables

Colecciones mutables: se pueden actualizar o ampliar según corresponda. Esto significa que los elementos de una colección se pueden modificar y eliminar. En pocas palabras, la colección en sí puede cambiar dinámicamente.

Colecciones inmutables: Por el contrario, nunca cambian. Sin embargo, aún es posible simular operaciones de agregar, eliminar o actualizar. Pero estas operaciones devolverán una nueva colección en cada caso, dejando la colección original sin cambios. En pocas palabras, la colección en sí no puede cambiar dinámicamente.

3.2.1 Sintaxis básica de colecciones inmutables

var/val 变量名 = Set[类型]()
var/val 变量名 = Set(元素1, 元素2, 元素3,..)

 3.2.2 Sintaxis básica de colecciones mutables

Un conjunto de variables se refiere a elementos, y la longitud es variable. Su método de creación es el mismo que el de un conjunto inmutable, pero primero debe importar la clase de colección de variables.

3.3 Arrays variables e inmutables

3.3.1 Gramática básica de matriz inmutable

var/val 变量名 = new Array[元素类型](数组长度)
var/val 变量名 = Array(元素1,元素2,...)

3.3.2 Sintaxis básica de matrices de variables

var/val 变量名 = new ArrayBuffer[元素类型](数组长度)
var/val 变量名 = ArrayBuffer(元素1,元素2,...)

3.4 Listas mutables e inmutables

Los elementos y la longitud de la lista son inmutables.

3.4.1 Gramática básica de Lista inmutable

val/var 变量名 = List(元素1,元素2,元素3,...)

3.4.2 Sintaxis básica de la lista de variables

val/var 变量名 = ListBuffer[数据类型]()
val/var 变量名 = ListBuffer(元素1,元素2,元素3,..)

3.5, tupla

val/var 元组名 = (元素 1, 元素 2, 元素 3....)
val/var 元组名 = 元素 1 -> 元素 2

3.6 Mapeo mutable e inmutable (Map)

3.6.1 Gramática básica del Mapa inmutable

val/var map = Map(键->值, 键->值, 键->值...)
val/var map = Map((键, 值), (键, 值), (键, 值), (键, 值)...)

3.6.2 Sintaxis básica de la variable Mapa

La sintaxis de la definición es consistente con la del mapa inmutable, pero primero debe importar manualmente el paquete: import scala.collection.mutable.Map

Cuatro, orientado a objetos

4.1, qué es la orientación a objetos

La orientación a objetos es un tipo de idea de programación, se basa en la orientación a procesos y completa la programación sobre la base de objetos, es decir, instancias de clases.

4.2, que es una clase

Una clase es una colección de atributos y comportamientos y es un concepto abstracto.

4.3, que es un objeto

Los objetos son instancias concretas de clases.

4.4, la estructura básica de clases y objetos

Crear sintaxis de clase: clase nombre de clase {atributos y comportamientos} Nota: si la clase está vacía y no tiene miembros, se puede omitir {}

Crear sintaxis de objeto: val nombre de objeto = nueva clase ()

4.5 Constructor

Cuando se crea un objeto, el constructor de la clase se llama automáticamente. El constructor predeterminado se usó antes. Además de definir constructores primarios, también se pueden definir constructores auxiliares según sea necesario. Los constructores distintos de los constructores primarios se denominan constructores auxiliares.

Clasificación: 1. Constructor principal. 2. Constructor auxiliar

4.6 Clases de muestra y objetos de muestra

Clase de muestra: en Scala, una clase de muestra es una clase especial que generalmente se usa para guardar datos. A menudo se usa en programación concurrente y marcos como Spark y Flink.

Objeto de muestra: en Scala, un objeto singleton decorado con case se denomina objeto de muestra y no tiene un constructor principal.


Cinco, programación Spark RDD

5.1, operación de conversión RDD

filter(func): filtra los elementos que satisfacen la función func y devuelve un nuevo conjunto de datos

map(func): pase cada elemento a la función func y devuelva el resultado como un nuevo conjunto de datos

flatMap(func): similar a map(), pero cada elemento de entrada se puede asignar a 0 o más resultados de salida

groupByKey(): cuando se aplica a un conjunto de datos de pares clave-valor (K, V), devuelve un nuevo conjunto de datos en forma de (K, Iterable)

reduceByKey(func): cuando se aplica a un conjunto de datos de pares clave-valor (K, V), se devuelve un nuevo conjunto de datos en forma de (K, V), donde cada valor se pasa a la función func para cada clave para la agregación el resultado de

5.2, operación de acción RDD

count (): devuelve la cantidad de elementos en el conjunto de datos

collect (): devuelve todos los elementos en el conjunto de datos como una matriz

first(): devuelve el primer elemento del conjunto de datos

take(n): devuelve los primeros n elementos del conjunto de datos como una matriz

reduce(func): agregue los elementos en el conjunto de datos a través de la función func (ingrese dos parámetros y devuelva un valor)

foreach(func): Pase cada elemento en el conjunto de datos a la función func para ejecutar

  

5.3, partición RDD

RDD es un conjunto de datos distribuidos elásticos. Por lo general, RDD es muy grande y se dividirá en muchas particiones, que se almacenan en diferentes nodos.

5.4, ​​caché RDD (persistencia)

En Spark, RDD adopta un mecanismo de evaluación perezoso y cada vez que se encuentra una operación, el cálculo se realiza desde cero. Cada llamada a una acción desencadena un cálculo desde cero. Esto es costoso para los cálculos iterativos, que a menudo requieren reutilizar el mismo conjunto de datos varias veces.

Importancia del almacenamiento en caché: en la segunda operación de acción, solo necesita usar el valor almacenado en caché en la primera operación de acción para evitar cálculos repetidos

5.5 Operación y métodos de lectura y escritura de pares clave-valor RDD

1) Creación del par clave-valor RDD

val pairRDD = lines.flatMap(line => line.split("")).map(word => (word, 1))
pairRDD.foreach(println)

2) Leer datos del archivo para crear RDD

val textFile = sc.textFile(".....")

5.6 Experimento

1. Hay un archivo local word.txt, que contiene muchas líneas de texto, cada línea de texto se compone de varias palabras y las palabras están separadas por espacios. La siguiente declaración se puede usar para estadísticas de frecuencia de palabras (es decir, para contar el número de ocurrencias de cada palabra)

2. Escribir en diferentes archivos según el último dígito del valor de la clave

package com.qst.rdd

import org.apache.spark.{Partitioner, SparkConf, SparkContext}

//自定义分区类,需要继承org.apache.spark.Partitioner类
class MyPartitioner(numParts: Int) extends Partitioner {

  //覆盖分区数
  override def numPartitions: Int = numParts

  //覆盖分区号获取函数
  override def getPartition(key: Any): Int = {
    key.toString.toInt % 10
  }
}

object MyPartitioner {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("persistDemo")
    val sc = new SparkContext(conf)
    // 模拟5个分区的数据
    val data = sc.parallelize(1 to 10, 5)
    // 将每个元素转化为 (元素, 1) 的形式
    data.map((_, 1))
      // MyPartitioner的构造函数需要传入分区数,这里传入的是10,将原本的5个分区转变为10个分区
      .partitionBy(new MyPartitioner(10))
      // 对集合中的每个元组取第一个元素进行映射操作,返回一个包含映射结果的新集合。
      // 也就是只保留元素,去除分区前加的1
      .map(_._1)
      // 使用saveAsTextFile方法将结果保存到HDFS中。
      // Spark 会自动将数据写到多个文件中,每个文件对应一个分区。
      .saveAsTextFile("hdfs://192.168.74.80:9000/output6")
    sc.stop()
  }
}

6. Chispa SQL

6.1, ¿qué es DataFrame?

Similar a RDD, DataFrame también es un contenedor de datos distribuidos. Sin embargo, DataFrame es más como una tabla bidimensional de una base de datos tradicional, además de los datos, también registra la información estructural de los datos, es decir, el esquema.

6.2, Conversión entre DataFrame, DataSet y RDD

6.2.1 De RDD a DataFrame

object SparkSQLDemo03 {
// 样例类
case class Person(id: Int, name: String, age: Int)
def main(args: Array[String]): Unit = {
// 准备工作:创建 SparkSession
val spark = SparkSession.builder().appName(this.getClass.getName).master("local[*]").getOrCreate()
val sc = spark.sparkContext
sc.setLogLevel("WARN")
// 1. 通过样例类进行转换
val linesRDD = sc.textFile("file/person.txt")
// 1.1. RDD[String] 变为 RDD[Person]
课程内容页
val personRDD: RDD[Person] = linesRDD.map(x => {
val arr = x.split(",")
Person(arr(0).toInt, arr(1), arr(2).toInt)
})
import spark.implicits._ // 隐式转换
// 1.2. RDD+样例类 => DataFrame
val personDF: DataFrame = personRDD.toDF()
val personDS: Dataset[Person] = personRDD.toDS()
personDF.show()
personDS.show()
// 关闭
spark.stop()
}
}

 6.2.2 De DataFrame a RDD

val rdd = pDF.rdd
println(rdd)
println(rdd.collect())
// 关闭
spark.stop()
}
}

Supongo que te gusta

Origin blog.csdn.net/m0_60964321/article/details/131153681
Recomendado
Clasificación