Guida all'aggiornamento di Spark 3 per cluster Big Data di SQL Server

Si applica a: SQL Server 2019 (15.x)

Importante

Il componente aggiuntivo per i cluster Big Data di Microsoft SQL Server 2019 verrà ritirato. Il supporto per i cluster Big Data di SQL Server 2019 terminerà il 28 febbraio 2025. Tutti gli utenti esistenti di SQL Server 2019 con Software Assurance saranno completamente supportati nella piattaforma e fino a quel momento il software continuerà a ricevere aggiornamenti cumulativi di SQL Server. Per altre informazioni, vedere il post di blog relativo all'annuncio e Opzioni per i Big Data nella piattaforma Microsoft SQL Server.

Questo articolo contiene informazioni e linee guida importanti per la migrazione di carichi di lavoro Apache Spark 2.4 a Spark versione 3.1. Questa operazione è necessaria per eseguire l'aggiornamento dei cluster Big Data di SQL Server dalla versione CU12 alla CU13 e successive.

Introduzione ad Apache Spark 3 in cluster Big Data di SQL Server

Fino all'aggiornamento cumulativo 12 (CU12), i cluster Big Data si basano sulla linea Apache Spark 2.4, che ha raggiunto la fine del ciclo di vita a maggio 2021. Coerentemente con l'impegno di Microsoft verso il miglioramento continuo delle funzionalità di Machine Learning e per Big Data offerte dal motore Apache Spark, la versione CU13 introduce la versione corrente di Apache Spark, la 3.1.2.

Un nuovo punto di riferimento per le prestazioni

Questa nuova versione di Apache Spark offre vantaggi in termini di prestazioni per i carichi di lavoro di elaborazione di Big Data. Usando il carico di lavoro TCP-DS 10 TB di riferimento nei test, è stato possibile ridurre il runtime da 4,19 ore a 2,96 ore, per un miglioramento del 29,36%, ottenuto semplicemente cambiando motore tramite lo stesso profilo hardware e di configurazione nei cluster Big Data di SQL Server, senza ottimizzazioni aggiuntive dell'applicazione. La media di miglioramento del singolo runtime di query è del 36%.

Menu per l'invio facendo clic nel dashboard

Linee guida per l'aggiornamento

Spark 3 è una versione principale e contiene modifiche di rilievo. Seguendo la stessa procedura consigliata definita in ambito di SQL Server, è consigliabile:

  1. Leggere con attenzione questo articolo.
  2. Leggere la guida ufficiale alla migrazione di Apache Spark 3.
  3. Eseguire una distribuzione affiancata di un nuovo cluster Big Data versione CU13 con l'ambiente corrente.
  4. Utilizzare la nuova funzionalità di copia distribuita HDFS azdata per ottenere un subset dei dati necessari per la convalida (facoltativo).
  5. Convalidare il carico di lavoro corrente con Spark 3 prima dell'aggiornamento.
  6. Rivalutare le ottimizzazioni di Spark applicate nelle strategie di definizione del codice e di tabella. Spark 3 offre nuovi miglioramenti per l'esecuzione casuale, il partizionamento e l'esecuzione di query adattive. Si tratta di un'ottima opportunità per rivalutare le decisioni precedenti e provare a utilizzare a pieno le funzionalità predefinite più recenti del motore.

Che cosa succede durante l'aggiornamento dei cluster?

Il processo di aggiornamento dei cluster distribuisce i pod Spark con la nuova versione e il runtime per Apache Spark aggiornato. Dopo l'aggiornamento, non sono più presenti componenti Spark 2.4.

Le modifiche di configurazione permanenti apportate tramite il framework di configurazione verranno mantenute.

Le librerie utente e gli artefatti caricati direttamente in HDFS verranno mantenuti. Assicurarsi tuttavia che le librerie e gli artefatti siano compatibili con Spark 3.

Avviso

Poiché le personalizzazioni apportate direttamente ai pod andranno perse, assicurarsi di convalidarle e riapplicarle, se sono ancora applicabili a Spark 3.

Modifiche di rilievo

Spark 3 non è completamente compatibile con la versione precedente 2.4 e le modifiche di rilievo hanno tre motivi principali:

  • Scala 2.12 usato da Spark 3 non è compatibile con Scala 2.11 usato da Spark 2.4
  • Modifiche e deprecazione delle API Spark 3
  • Runtime dei cluster Big Data di SQL Server per l'aggiornamento delle librerie Apache Spark

Scala 2.12 usato da Spark 3 non è compatibile con Scala 2.11

Se si eseguono processi Spark basati su file JAR di Scala 2.11, è necessario ricompilarli usando Scala 2.12. Scala 2.11 e 2.12 sono compatibili con la maggior parte delle origini, ma non con file binari. Per altre informazioni, vedere Scala 2.12.0.

Sono necessarie le modifiche seguenti:

  1. Modificare la versione di Scala per tutte le dipendenze di Scala.
  2. Modificare la versione di Spark per tutte le dipendenze di Spark.
  3. Modificare tutte le dipendenze di Spark che hanno fornito l'ambito, ad eccezione delle dipendenze esterne, come spark-sql-kafka-0-10.

Di seguito viene mostrato un file pom.xml di esempio:

  <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>

Modifiche e deprecazione delle API Spark 3

Vedere la Guida ufficiale alla migrazione di Apache Spark 3, che presenta in modo dettagliato tutte le modifiche all'API.

Ecco alcune modifiche importanti:

Modifica Azione
I spark-submit parametri yarn-client e yarn-clustermodes sono stati rimossi in Spark 3 In sostituzione utilizzare spark-submit --master yarn --deploy-mode client o --deploy-mode cluster.
Per informazioni, vedere https://spark.apache.org/docs/latest/running-on-yarn.html
La classe HiveContext è stata rimossa e sostituzione con SparkSession.builder.enableHiveSupport()
L'ordine dell'argomento è invertito nel metodo TRIM Usare TRIM(str, trimStr) anziché TRIM(trimStr, str)
A causa dell'aggiornamento a Scala 2.12, DataStreamWriter.foreachBatch non è un'origine compatibile con il programma Scala Aggiornare il codice sorgente di Scala per distinguere tra la funzione Scala e la funzione lambda Java.

Runtime dei cluster Big Data di SQL Server per l'aggiornamento delle librerie Apache Spark

Come indicato nella specifica Runtime dei cluster Big Data di SQL Server per Apache Spark, tutte le librerie Python, R e Scala predefinite sono state aggiornate nella versione CU13. Inoltre, sono state aggiunte molte librerie per offrire un'esperienza ottimale.

  1. Assicurarsi che il carico di lavoro funzioni con il set di librerie più recente.
  2. Verificare se una libreria caricata personalizzata fa ora parte della baseline predefinita dei pacchetti e modificare le specifiche dei processi in modo da rimuovere la libreria personalizzata per consentire al processo di usare la libreria fornita.

Domande frequenti

Come risolvere anomalie relative a java.lang.NoSuchMethodError o java.lang.ClassNotFoundException

Questo errore è probabilmente causato da un conflitto tra versioni di Spark o Scala. Controllare le condizioni seguenti e ricompilare il progetto.

  1. Assicurarsi che tutte le versioni di Scala siano aggiornate.
  2. Assicurarsi che tutte le dipendenze di Spark siano aggiornate con le versioni corrette di Scala e Spark.
  3. Assicurarsi che tutte le dipendenze di Spark abbiano fornito l'ambito, ad eccezione di spark-sql-kafka-0-10.

SparkUpgradeException a causa della modifica relativa alla modalità calendario

Sono state apportate modifiche al modello di calendario di Spark 3.0. È possibile che venga visualizzata un'eccezione come questa durante la scrittura di una colonna di calendario in 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.

Soluzione: impostare la configurazione spark.sql.legacy.parquet.int96RebaseModeInWrite su LEGACY o CORRECTED, come spiegato sopra. Di seguito è riportata una possibile soluzione nel codice PySpark:

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

Passaggi successivi

Per altre informazioni, vedere Introduzione ai cluster Big Data di SQL Server.