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%.
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:
- Leggere con attenzione questo articolo.
- Leggere la guida ufficiale alla migrazione di Apache Spark 3.
- Eseguire una distribuzione affiancata di un nuovo cluster Big Data versione CU13 con l'ambiente corrente.
- Utilizzare la nuova funzionalità di copia distribuita HDFS azdata per ottenere un subset dei dati necessari per la convalida (facoltativo).
- Convalidare il carico di lavoro corrente con Spark 3 prima dell'aggiornamento.
- 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:
- Modificare la versione di Scala per tutte le dipendenze di Scala.
- Modificare la versione di Spark per tutte le dipendenze di Spark.
- 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.
- Assicurarsi che il carico di lavoro funzioni con il set di librerie più recente.
- 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.
- Assicurarsi che tutte le versioni di Scala siano aggiornate.
- Assicurarsi che tutte le dipendenze di Spark siano aggiornate con le versioni corrette di Scala e Spark.
- 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.