Tabla de contenido
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
2. Construcción de grupos de chispas
2.1 Modo de implementación de Spark
2.2 ¿Por qué elegir Spark On YARN?
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.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.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
4.1, qué es la orientación a objetos
4.4, la estructura básica de clases y objetos
4.6 Clases de muestra y objetos de muestra
5.1, operación de conversión RDD
5.4, caché RDD (persistencia)
5.5 Operación y métodos de lectura y escritura de pares clave-valor RDD
6.2, Conversión entre DataFrame, DataSet y 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()
}
}