La última versión de Spark 3 HelloWorld

Spark se ha lanzado a 3.1.1 y no he mirado este proyecto durante mucho tiempo. Actualicé el almacén local hoy y hubo un error en la compilación.

$ mvn compile 
...... 
[ERROR] [Error] /data/code/github/bigdata/spark/core/src/main/scala/org/apache/spark/SparkContext.scala:403: falta de coincidencia de tipos; 
 encontrado: Map [String, org.apache.spark.resource.ResourceInformation] 
 requerido: scala.collection.immutable.Map [String, org.apache.spark.ResourceInformation] 
[ERROR] [Error] / data / code / github / bigdata /spark/core/src/main/scala/org/apache/spark/SparkContext.scala:404: falta de coincidencia de tipos; 
 encontrado: scala.collection.immutable.Map [String, org.apache.spark.ResourceInformation] 
 obligatorio: Map [String, org.apache.spark.resource.ResourceInformation] 
[ERROR] [Error] / data / code / github / bigdata /spark/core/src/main/scala/org/apache/spark/SparkContext.scala:554: el valor del método sobrecargado se aplica con alternativas:
  (env: org.apache.spark.SparkEnv, resources: java.util.Map [String, org.apache.spark.resource.ResourceInformation]) Opción [org.apache.spark.internal.plugin.PluginContainer] <y> 
  ( sc: org.apache.spark.SparkContext, resources: java.util.Map [String, org.apache.spark.resource.ResourceInformation]) La opción [org.apache.spark.internal.plugin.PluginContainer] 
 no se puede aplicar a ( org.apache.spark.SparkContext, java.util.Map [String, org.apache.spark.ResourceInformation]) 
[ERROR] [Error] / data / code / github / bigdata / spark / core / src / main / scala / org / apache / spark / api / java / JavaSparkContext.scala: 118: no coinciden los tipos; 
 encontrado: java.util.Map [String, org.apache.spark.ResourceInformation] 
 requerido: java.util.Map [String, org.apache.spark.resource.ResourceInformation]
[INFO] [Info]: java.util.Map [String, org.apache.spark.ResourceInformation] <: java.util.Map [String, org.apache.spark.resource.ResourceInformation]? 
[INFO] [Info]: falso 
[ERROR] [Error] /data/code/github/bigdata/spark/core/src/main/scala/org/apache/spark/deploy/SparkSubmit.scala:308: demasiados argumentos (6) para el método resolveMavenDependencies: (packagesExclusions: String, packages: String, repositories: String, ivyRepoPath: String, ivySettingsPath: Option [String]) String 
Tenga en cuenta que 'packagesTransitive' no es un nombre de parámetro del método invocado.
[ERROR] [Error] /data/code/github/bigdata/spark/core/src/main/scala/org/apache/spark/deploy/SparkSubmit.scala:377: no hay suficientes argumentos para el método downloadFile: (ruta: String , targetDir: java.io.File, sparkConf: org.apache.spark.SparkConf, hadoopConf: org.apache.hadoop.conf.Configuration, secMgr: org.apache.spark.SecurityManager) Cadena. 
Parámetro de valor no especificado secMgr. 
[ERROR] [Error] /data/code/github/bigdata/spark/core/src/main/scala/org/apache/spark/deploy/SparkSubmit.scala:380: no hay suficientes argumentos para el método downloadFileList: (fileList: String , targetDir: java.io.File, sparkConf: org.apache.spark.SparkConf, hadoopConf: org.apache.hadoop.conf.Configuration, secMgr: org.apache.spark.SecurityManager) Cadena. 
Parámetro de valor no especificado secMgr.
[ERROR] [Error] /data/code/github/bigdata/spark/core/src/main/scala/org/apache/spark/deploy/SparkSubmit.scala:383: no hay suficientes argumentos para el método downloadFileList: (fileList: String , targetDir: java.io.File, sparkConf: org.apache.spark.SparkConf, hadoopConf: org.apache.hadoop.conf.Configuration, secMgr: org.apache.spark.SecurityManager) Cadena. 
Parámetro de valor no especificado secMgr. 
[ERROR] [Error] /data/code/github/bigdata/spark/core/src/main/scala/org/apache/spark/deploy/SparkSubmit.scala:392: no hay suficientes argumentos para el método downloadFileList: (fileList: String , targetDir: java.io.File, sparkConf: org.apache.spark.SparkConf, hadoopConf: org.apache.hadoop.conf.Configuration, secMgr: org.apache.spark.SecurityManager) Cadena. 
Parámetro de valor no especificado secMgr.
[ERROR] [Error] /data/code/github/bigdata/spark/core/src/main/scala/org/apache/spark/deploy/SparkSubmit.scala:396: no hay suficientes argumentos para el método downloadFileList: (fileList: String , targetDir: java.io.File, sparkConf: org.apache.spark.SparkConf, hadoopConf: org.apache.hadoop.conf.Configuration, secMgr: org.apache.spark.SecurityManager) Cadena. 
Parámetro de valor no especificado secMgr. 
[ERROR] [Error] /data/code/github/bigdata/spark/core/src/main/scala/org/apache/spark/deploy/SparkSubmit.scala:450: no hay suficientes argumentos para el método downloadFile: (ruta: String , targetDir: java.io.File, sparkConf: org.apache.spark.SparkConf, hadoopConf: org.apache.hadoop.conf.Configuration, secMgr: org.apache.spark.SecurityManager) Cadena. 
Parámetro de valor no especificado secMgr.
[ERROR] [Error] /data/code/github/bigdata/spark/core/src/main/scala/org/apache/spark/scheduler/Task.scala:101: no coinciden los tipos; 
 encontrado: Map [String, org.apache.spark.resource.ResourceInformation] 
 requerido: Map [String, org.apache.spark.ResourceInformation] 
[INFO] [Info]: Map [String, org.apache.spark.resource.ResourceInformation ] <: Map [String, org.apache.spark.ResourceInformation]? 
[INFO] [Info]: falso 
[ERROR] 12 errores encontrados 
......

Leí rápidamente el proyecto README. Resulta que el entorno local ya no puede satisfacer las necesidades del nuevo Spark. El proyecto Spark también incluye las herramientas de compilación correspondientes, y simplemente compila de acuerdo con la documentación.

Si no ha descargado este proyecto antes, puede usar git clone para descargar el proyecto localmente:

clon de git https://github.com/apache/spark.git


Ingrese al directorio del proyecto y compile:

$ cd spark 
$. / build / mvn -DskipTests clean package 
...... 
[INFO] Resumen de Reactor para Spark Project Parent POM 3.2.0-SNAPSHOT: 
[INFO]  
[INFO] Spark Project Parent POM ..... ...................... ÉXITO [2.562 s] 
[INFO] Etiquetas del proyecto Spark ................. ................ ÉXITO [5.148 s] 
[INFO] Bosquejo del proyecto Spark ....................... ........ ÉXITO [5.963 s] 
[INFO] Base de datos local del proyecto Spark ............................. ÉXITO [1.505 s] 
[INFO] Spark Project Networking ........................... ÉXITO [2.883 s] 
[INFO] Spark Project Shuffle Streaming Service ............ ÉXITO [1.516 s] 
[INFO] Proyecto Spark inseguro ........................... .... ÉXITO [7.137 s]
[INFO] Lanzador del proyecto Spark ............................. ÉXITO [1.516 s] 
[INFO] Núcleo del proyecto Spark ... ............................. ÉXITO [01:55 min] 
[INFO] Biblioteca local Spark Project ML ...... ............... ÉXITO [36.128 s] 
[INFO] Spark Project GraphX ​​........................ ....... ÉXITO [30.925 s] 
[INFO] Transmisión de proyectos Spark ............................ ÉXITO [53.579 s ] 
[INFO] Spark Project Catalyst ............................. ÉXITO [03:50 min] 
[INFO] Spark Project SQL. ................................. ÉXITO [07:58 min] 
[INFO] Biblioteca de aprendizaje automático de Spark Project ... ........................ ÉXITO [02:42 min] 
[INFO] Herramientas del proyecto Spark ............. ................... ÉXITO [13.733 s]
[INFO] Spark Project Hive ................................. ÉXITO [04:52 min] 
[INFO] Spark Proyecto REPL ................................. ÉXITO [34.085 s] 
[INFO] Montaje del proyecto Spark .... ......................... ÉXITO [8.368 s] 
[INFO] Proveedor de tokens Kafka 0.10+ para transmisión .......... . ÉXITO [01:06 min] 
[INFO] Integración de Spark para Kafka 0.10 ................... ÉXITO [02:08 min] 
[INFO] Kafka 0.10+ Fuente para Streaming estructurado ........ ÉXITO [01:24 min] 
[INFO] Ejemplos de proyectos Spark ........................... .. ÉXITO [01:01 min] 
[INFO] Integración Spark para Kafka 0.10 Assembly .......... ÉXITO [10.397 s] 
[INFO] Spark Avro ............ ............................. ÉXITO [01:12 min]
[INFO] ----------------------------------------------- ------------------------- 
[INFO] CONSTRUYE EL ÉXITO 
[INFO] ----------------- -------------------------------------------------- ----- 
[INFO] Tiempo total: 31:51 min 
[INFO] Finalizado: 2021-03-13T17: 28: 05 + 08: 00 
[INFO] ------------- -------------------------------------------------- ---------

A partir de los resultados de la compilación, la estructura del proyecto Spark3 ha cambiado bastante, como Tags / Sketch / LocalDB / que no se han visto antes. Presentaremos lo que hace cada subproyecto en el futuro. A continuación, ejecutemos HelloWorld Primero. La forma más fácil de probar Spark es usar el shell scala:

tianlang @ tianlang: spark $ ./bin/spark-shell  
2021-03-14 08: 51: 53,351 WARN util.Utils: Su nombre de host, tianlang se resuelve en una dirección de loopback: 127.0.0.1; usando 192.168.0.104 en su lugar (en la interfaz wlp7s0) 
2021-03-14 08: 51: 53,352 WARN util.Utils: Establezca SPARK_LOCAL_IP si necesita enlazar a otra dirección 
Estableciendo el nivel de registro predeterminado en "WARN". 
Para ajustar el nivel de registro, use sc.setLogLevel (newLevel). Para SparkR, use setLogLevel (newLevel). 
2021-03-14 08: 52: 01,141 WARN util.NativeCodeLoader: No se puede cargar la biblioteca native-hadoop para su plataforma ... usando clases integradas-java donde corresponda 
Interfaz web de contexto Spark disponible en http://192.168.0.104:4040 
El contexto de Spark está disponible como 'sc' (master = local [*], app id = local-1615683123916).
Sesión de chispa disponible como 'chispa'. 
Bienvenido a 
      ____ __ 
     / __ / __ ___ _____ / / __ 
    _ \ / _ \ / _ `/ __ / '_ / 
   / ___ / .__ / \ _, _ / _ / / _ / \ _ \ versión 3.2. 0-SNAPSHOT 
      / _ / 
         
Usando Scala versión 2.12.10 (Java HotSpot (TM) 64-Bit Server VM, Java 1.8.0_201) 
Escriba expresiones para evaluarlas. 
Escriba: ayuda para obtener más información. 

scala> spark.range (1000 * 1000 * 1000) .count (); 
res0: Largo = 1000000000

spark.range (1000 * 1000 * 1000) es generar una secuencia de 0 (inclusive) a 1 billón (no incluido), que se puede considerar como una tabla t_range con una sola columna:

1
2
......
999999998
999999999


Count () es calcular la cantidad de elementos de datos, y un elemento se cuenta como mil millones en total. Es equivalente al recuento de selección de SQL (*) de t_range. La función de recuento de SQL es fácil de confundir con la función de suma de SQL, la suma es todo La suma de los datos es la suma de todos los valores en la secuencia: 0 + 1 + 2 + 3 + ... + 999999998 + 9999999999; y el recuento es el número de datos en la secuencia debajo de las estadísticas. el valor 1 o 999999998: 1 + 1 + 1 + ...... + 1 + 1;

En SparkShell, no puede llamar directamente a sum para sumar los valores en la secuencia:

scala> spark.range (1000 * 1000 * 1000) .sum (); 
<console>: 24: error: value sum no es miembro de org.apache.spark.sql.Dataset [Long] 
       spark.range (1000 * 1000 * 1000) .sum ();

Debido a que el objeto Dataset generado por spark.range no tiene una función de suma, ¿cómo implementar la operación de suma?

Puede consultar la documentación de la API de Spark para ver qué funciones del conjunto de datos se pueden usar:

Lo primero que vi es el resumen que es más similar a la suma. Mira su introducción. No importa si no entiendes inglés, puedes ver el código de muestra. Descubrí que se puede usar para contar el número total / promedio / máximo / mínimo La espera simplemente no tomó la suma No parece que el nombre sea como la función.

Si ha estado expuesto a big data antes, debería haber oído hablar de MapReduce. Debería ser más fácil encontrar la función de reducción:

defreduce (función: (T, T) ⇒ T): T

(Específico de Scala) Reduce los elementos de este conjunto de datos utilizando la función binaria especificada. Lo dado  func debe ser conmutativo y asociativo o el resultado puede ser no determinista.

Tome la suma con reducir:

scala> spark.range (1000 * 1000 * 1000) .reduce ((a, b) => a + b) 
<console>: 24: error: valor del método sobrecargado reducir con alternativas: 
  (func: org.apache.spark. api.java.function.ReduceFunction [java.lang.Long]) java.lang.Long <y> 
  (func: (java.lang.Long, java.lang.Long) => java.lang.Long) java.lang .Long 
 no se puede aplicar a ((java.lang.Long, java.lang.Long) => scala.Long) 
       spark.range (1000 * 1000 * 1000) .reduce ((a, b) => a + b)

Proporcione una función de suma para reducir e informar un error. En el mensaje de error, se puede ver que el tipo de datos no coincide. Tengamos una conversión de tipo forzada:

scala> spark.range (1000 * 1000 * 1000) .reduce ((a, b) => (a + b). asInstanceOf [java.lang.Long])
res11: Long = 499999999500000000  

Por supuesto, también puede usar otros métodos para lograr la suma, como foreach, pero el método de ejecución es diferente al reduce, y tenemos la oportunidad de hablar de ello más adelante. 

También debe sentir que usar la función de reducción es mucho menos conveniente que la función de suma en SQL. Las funciones en SQL se llaman API declarativas con las palabras más populares ahora. Solo necesita prestar atención a lo que quiero, no a reducir. Necesito prestar atención a cómo hacerlo.

Esta es también una de las razones por las que SQL ha perdurado durante mucho tiempo. Spark también proporcionó el módulo Spark SQL para admitir la sintaxis SQL desde muy temprano. Puede mirar hacia atrás y ver que el conjunto de datos que usamos anteriormente está en el paquete sql:

scala> spark.range (1000 * 1000 * 1000);
res2: org.apache.spark. sql .Dataset [Long] = [id: bigint]

También dijimos anteriormente que el resultado del rango se puede comparar con una tabla con una sola columna, y no es casual hablar de ello. Es realmente posible ejecutar sentencias SQL en él:

Primero registre el conjunto de datos como una vista temporal (también se puede llamar tabla temporal, pero la API para registrar una tabla temporal está marcada como obsoleta después de 2.0.0):

scala> spark.range (1000 * 1000 * 1000) .createOrReplaceTempView ("t_range");

Luego puede ejecutar SQL en la vista t_range :


scala> spark.sql ("seleccione suma (id) de t_range");
res18 : org.apache.spark.sql.DataFrame = [sum (id): bigint]

scala> res18 .collect
res19: Array [org.apache.spark.sql.Row] = Array ([ 499999999500000000 ])

¿Cómo sé que el nombre de la columna es id ? Es a través de la función printSchema .

scala> spark.range (1000 * 1000 * 1000). printSchema ();
root
 | - id: long (nullable = false)

El código anterior usa Scala, si prefiere usar Python. También puede usar ./bin/pyspark. El soporte de Spark3 para Python también menciona un nuevo nivel.

HelloWorld está aquí primero. Las hormigas mastican sus huesos poco a poco.


Supongo que te gusta

Origin blog.51cto.com/14256460/2659042
Recomendado
Clasificación