Guía de actualización de Spark 3 en Clústeres de macrodatos de SQL Server

Se aplica a: síSQL Server 2019 (15.x)

Este artículo contiene información importante e instrucciones para migrar cargas de Apache Spark 2.4 a la versión 3.1 de Spark. Es necesario para actualizar de la CU12 a la CU13 de Clústeres de macrodatos de SQL Server y versiones posteriores.

Introducción a Apache Spark 3 en Clústeres de macrodatos de SQL Server

Hasta la actualización acumulativa 12 (CU12), los clústeres de macrodatos se basaban en la línea de Apache Spark 2.4, que llegó a su fin de ciclo de vida en mayo de 2021. En consonancia con nuestro compromiso de mejora continua de las funcionalidades de macrodatos y Machine Learning aportadas por el motor de Apache Spark, la CU13 incluye la versión actual de Apache Spark, la 3.1.2.

Una nueva línea de base de rendimiento

Esta nueva versión de Apache Spark ofrece ventajas de rendimiento con respecto a las cargas de trabajo de procesamiento de macrodatos. Con la carga de trabajo TCP-DS de 10 TB de referencia de nuestras pruebas, hemos podido reducir el tiempo de ejecución de 4,19 horas a 2,96 horas, lo que ha supuesto un 29,36 % de mejora con solo cambiar los motores usando el mismo perfil de hardware y de configuración en Clústeres de macrodatos de SQL Server, sin optimizaciones de aplicaciones adicionales. La media de mejora del tiempo de ejecución de consulta individual es del 36 %.

Menú de envío al hacer clic en el panel

Guía de actualización

Spark 3 es una versión principal y contiene cambios importantes. Siguiendo el mismo procedimiento recomendado establecido en el universo de SQL Server, se recomienda lo siguiente:

  1. Consultar este artículo completo.
  2. Consultar la guía oficial de migración de Apache Spark 3.
  3. Realizar una implementación en paralelo de la CU13 de la versión del nuevo clúster de macrodatos con el entorno actual.
  4. (Opcional) Aprovechar la nueva funcionalidad de copia distribuida azdata HDFS para tener un subconjunto de los datos necesarios para la validación.
  5. Validar la carga de trabajo actual con Spark 3 antes de actualizar.
  6. Volver a aplicar las optimizaciones de Spark en las estrategias de definición de código y tabla. Spark 3 incorpora nuevas mejoras de ordenación aleatoria, creación de particiones y ejecución de consultas adaptables. Se trata de una excelente oportunidad para volver a evaluar las decisiones anteriores e intentar aprovechar las características más recientes del motor.

¿Qué ocurre durante la actualización del clúster?

El proceso de actualización del clúster implementará los pods de Spark con la nueva versión y el entorno de ejecución actualizado para Apache Spark. Después de la actualización, ya no habrá componentes de Spark 2.4.

Se conservarán los cambios de configuración persistentes realizados a través del marco de configuración.

Se conservarán las bibliotecas de usuario y los artefactos cargados directamente en HDFS. Aun así, asegúrese de que esas bibliotecas y artefactos son compatibles con Spark 3.

Advertencia

Las personalizaciones realizadas directamente en los pods se perderán, asegúrese de validarlas y volver a aplicarlas si siguen siendo aplicables a Spark 3.

Últimos cambios

Spark 3 no es totalmente compatible con la versión 2.4. Los cambios importantes se deben principalmente a tres partes:

  • Scala 2.12, que lo usa Spark 3, no es compatible con Scala 2.11 que lo usa Spark 2.4.
  • Cambios y elementos en desuso de la API de Spark 3
  • Entorno de ejecución de los clústeres de macrodatos de SQL Server para las actualizaciones de la biblioteca de Apache Spark

Scala 2.12, que lo usa Spark 3, no es compatible con Scala 2.11.

Si ejecuta trabajos de Spark basados en archivos JAR de Scala 2.11, es necesario volver a generarlos con Scala 2.12. Scala 2.11 y 2.12 son principalmente compatibles con el código, pero no son compatibles con los binarios. Para obtener más información, consulte Scala 2.12.0.

Se necesitan los siguientes cambios:

  1. Cambie la versión de Scala para todas las dependencias de Scala.
  2. Cambie la versión de Spark para todas las dependencias de Spark.
  3. Cambie todas las dependencias de Spark que han proporcionado el ámbito, excepto las dependencias externas, como spark-sql-kafka-0-10.

Este es un ejemplo de pom.xml como se indica a continuación:

  <properties>
    <spark.version>3.1.2</spark.version>
    <scala.version.major>2.12</scala.version.major>
    <scala.version.minor>10</scala.version.minor>
    <scala.version>${scala.version.major}.${scala.version.minor}</scala.version>
  </properties>
 
  <dependencies>
 
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-library</artifactId>
      <version>${scala.version}</version>
      <scope>provided</scope>
    </dependency>
 
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-core_${scala.version.major}</artifactId>
      <version>${spark.version}</version>
     <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-sql_${scala.version.major}</artifactId>
      <version>${spark.version}</version>
      <scope>provided</scope>
    </dependency>
 
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-sql-kafka-0-10_${scala.version.major}</artifactId>
      <version>${spark.version}</version>
    </dependency>
    
  </dependencies>

Cambios y elementos en desuso de la API de Spark 3

Revise la guía de migración oficial de Apache Spark 3 que trata en detalle todos los cambios en la API.

Algunos aspectos destacados son:

Cambio importante Acción
Los parámetros de spark-submit yarn-clienty yarn-clustermodes se han eliminado en Spark 3. Use spark-submit --master yarn --deploy-mode client o --deploy-mode cluster en su lugar.
Consulte los detalles: https://spark.apache.org/docs/latest/running-on-yarn.html
Se ha quitado la clase HiveContext. Use SparkSession.builder.enableHiveSupport() en su lugar
El orden del argumento se invierte en el método TRIM. Usar TRIM(str, trimStr) en lugar de TRIM(trimStr, str)
Debido a la actualización a Scala 2.12, DataStreamWriter.foreachBatch no es un origen compatible con el programa Scala. Actualice el código fuente de Scala para distinguir entre la función de Scala y la lambda de Java.

Entorno de ejecución de los clústeres de macrodatos de SQL Server para las actualizaciones de la biblioteca de Apache Spark

Como se trata en la especificación del entorno de ejecución de los clústeres de macrodatos de SQL Server para Apache Spark, todas las bibliotecas predeterminadas de Python, R y Scala se han actualizado con la publicación de la CU13. Además, se agregaron muchas bibliotecas para proporcionar una mejor experiencia de configuración rápida.

  1. Asegúrese de que la carga de trabajo funciona con el conjunto de bibliotecas más reciente.
  2. Revise si una biblioteca cargada personalizada ahora forma parte de la línea de base del paquete predeterminada y ajuste las especificaciones de los trabajos para quitar la biblioteca personalizada para permitir que el trabajo use la biblioteca enviada.

Preguntas más frecuentes

Cómo resolver errores extraños java.lang.NoSuchMethodError o java.lang.ClassNotFoundException

Es muy probable que este error se deba a un conflicto de versión de Spark o Scala. Compruebe lo siguiente y recompile el proyecto.

  1. Asegúrese de que todas las versiones de Scala están actualizadas.
  2. Asegúrese de que todas las dependencias de Spark están actualizadas con la versión de Scala y de Spark correctas.
  3. Asegúrese de que todas las dependencias de Spark han proporcionado ámbito, excepto spark-sql-kafka-0-10.

SparkUpgradeException debido a un cambio en el modo de calendario

Hay cambios en el modelo de calendario de Spark 3.0. Es posible que vea una excepción como esta al escribir una columna de calendario en Spark SQL:

Caused by: org.apache.spark.SparkUpgradeException: 
You may get a different result due to the upgrading of Spark 3.0:
writing dates before 1582-10-15 or timestamps before 1900-01-01T00:00:00Z into Parquet INT96 files can be dangerous,
as the files may be read by Spark 2.x or legacy versions of Hive later, 
which uses a legacy hybrid calendar that is different from Spark 3.0+'s Proleptic Gregorian calendar. 
See more details in SPARK-31404.
You can set spark.sql.legacy.parquet.int96RebaseModeInWrite to 'LEGACY' to 
rebase the datetime values w.r.t. the calendar difference during writing, to get maximum interoperability. 
Or set spark.sql.legacy.parquet.int96RebaseModeInWrite to 'CORRECTED' to 
write the datetime values as it is, if you are 100% sure that the written files 
will only be read by Spark 3.0+ or other systems that use Proleptic Gregorian calendar.

Solución: Establezca la configuración spark.sql.legacy.parquet.int96RebaseModeInWrite en LEGACY o CORRECTED, como se explicó anteriormente. A continuación se muestra una posible solución en el código de PySpark:

spark.conf.set("spark.sql.legacy.parquet.int96RebaseModeInWrite","CORRECTED")

Pasos siguientes

Para obtener más información, consulte Presentación de Clústeres de macrodatos de SQL Server.