Guia de atualização do Spark 3 dos Clusters de Big Data do SQL Server
Aplica-se a: SQL Server 2019 (15.x)
Importante
O complemento Clusters de Big Data do Microsoft SQL Server 2019 será desativado. O suporte para Clusters de Big Data do SQL Server 2019 será encerrado em 28 de fevereiro de 2025. Todos os usuários existentes do SQL Server 2019 com Software Assurance terão suporte total na plataforma e o software continuará a ser mantido por meio de atualizações cumulativas do SQL Server até esse momento. Para obter mais informações, confira a postagem no blog de anúncio e as opções de Big Data na plataforma do Microsoft SQL Server.
Este artigo contém informações e diretrizes importantes para migrar cargas de trabalho do Apache Spark 2.4 para o Spark versão 3.1. Isso é necessário para atualizar dos Clusters de Big Data do SQL Server da CU12 para a CU13 e superior.
Introdução ao Apache Spark 3 em Clusters de Big Data do SQL Server
Até a CU12 (Atualização Cumulativa 12), os clusters de Big Data dependiam da linha Apache Spark 2.4, que atingiu o fim da vida útil em maio de 2021. Seguindo nosso compromisso com as melhorias contínuas dos recursos de Big Data e de Machine Learning trazidos pelo mecanismo Apache Spark, a CU13 traz a versão 3.1.2 do Spark, a mais atual.
Uma nova linha de base de desempenho
Essa nova versão do Apache Spark melhora o desempenho das cargas de trabalho de processamento de Big Data. Usando a carga de trabalho de referência TCP-DS de 10 TB em nossos testes, conseguimos reduzir o tempo de execução de 4,19 horas para 2,96 horas, uma melhoria de 29,36% apenas com a mudança do mecanismo, usando o mesmo hardware e perfil de configuração em Clusters de Big Data do SQL Server sem outras otimizações no aplicativo. A média de melhoria do tempo de execução de consultas individuais é de 36%.
Diretrizes de atualização
O Spark 3 é uma versão principal e contém alterações interruptivas. Seguindo a mesma prática recomendada estabelecida na área do SQL Server, recomendamos o seguinte:
- Leia este artigo inteiro.
- Leia o Guia de migração do Apache Spark 3 oficial.
- Execute uma implantação lado a lado de um novo cluster de Big Data versão CU13 com seu ambiente atual.
- (Opcional) Aproveite a nova funcionalidade de cópia distribuída do azdata HDFS para ter um subconjunto dos dados necessários para validação.
- Valide sua carga de trabalho atual com o Spark 3 antes de atualizar.
- Reavalie as otimizações do Spark impostas em suas estratégias de definição de código e tabela. O Spark 3 traz novos aprimoramentos de embaralhamento, de particionamento e de execução de consulta adaptável. Esta é uma ótima oportunidade para reavaliar as decisões anteriores e tentar aproveitar os recursos mais novos do mecanismo já disponíveis.
O que acontece durante a atualização do cluster?
O processo de atualização do cluster implantará pods do Spark com a nova versão e o runtime atualizado do Apache Spark. Após a atualização, não haverá mais componentes do Spark 2.4.
As alterações de configuração permanentes feitas por meio da estrutura de configuração serão preservadas.
Bibliotecas de usuário e artefatos carregados diretamente no HDFS serão preservados. No entanto, verifique se essas bibliotecas e artefatos são compatíveis com o Spark 3.
Aviso
As personalizações feitas diretamente nos pods serão perdidas. Valide e aplique novamente as personalizações que ainda se aplicam ao Spark 3.
Alterações de quebra
O Spark 3 não é totalmente compatível com a versão 2.4. As alterações interruptivas são causadas principalmente por três partes:
- O Scala 2.12 usado pelo Spark 3 é incompatível com o Scala 2.11 usado pelo Spark 2.4
- Alterações e preterições da API do Spark 3
- Atualizações da biblioteca do runtime dos Clusters de Big Data do SQL Server para Apache Spark
O Scala 2.12 usado pelo Spark 3 é incompatível com o Scala 2.11
Se você executa trabalhos do Spark com base em jars do Scala 2.11, é necessário recompilá-los usando o Scala 2.12. O Scala 2.11 e o 2.12 são compatíveis no código-fonte, mas não na forma binária. Para obter mais informações, confira Scala 2.12.0.
As alterações abaixo são necessárias:
- Altere a versão do Scala para todas as dependências dele.
- Altere a versão do Spark para todas as dependências dele.
- Altere todas as dependências do Spark que têm escopo, exceto dependências externas como
spark-sql-kafka-0-10
.
Aqui está um exemplo de arquivo pom.xml:
<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>
Alterações e preterições da API do Spark 3
Leia o Guia de migração do Apache Spark 3 oficial, que traz detalhes de todas as alterações da API.
Alguns destaques capturados são:
Alteração da falha | Ação |
---|---|
Os parâmetros yarn-client e yarn-clustermodes de spark-submit foram removidos no Spark 3 |
Use spark-submit --master yarn --deploy-mode client ou --deploy-mode cluster em vez disso.Confira os detalhes em https://spark.apache.org/docs/latest/running-on-yarn.html |
A classe HiveContext foi removida |
Usar SparkSession.builder.enableHiveSupport() |
A ordem dos argumentos foi invertida no método TRIM | Use TRIM(str, trimStr) em vez de TRIM(trimStr, str) |
Devido à atualização para o Scala 2.12, DataStreamWriter.foreachBatch não é uma fonte compatível com o programa Scala |
Atualize o código-fonte do Scala para distinguir entre a função Scala e o lambda Java. |
Atualizações da biblioteca do runtime dos Clusters de Big Data do SQL Server para Apache Spark
Conforme descrito na especificação do runtime de Clusters de Big Data do SQL Server para Apache Spark, todas as bibliotecas padrão de Python, de R e de Scala foram atualizadas na versão CU13. Além disso, muitas bibliotecas foram adicionadas para melhorar a experiência inicial.
- Verifique se sua carga de trabalho funciona com o conjunto de bibliotecas mais novo.
- Verifique se alguma biblioteca personalizada carregada agora faz parte da linha de base do pacote padrão. Em caso positivo, remova essa biblioteca das especificações dos trabalhos para que eles usem a biblioteca incluída.
Perguntas frequentes
Como resolver os erros estranhos java.lang.NoSuchMethodError ou java.lang.ClassNotFoundException
O erro provavelmente é causado por conflito de versão do Spark ou do Scala. Verifique os itens abaixo e recompile o projeto.
- Verifique se todas as versões do Scala foram atualizadas.
- Verifique se todas as dependências do Spark foram atualizadas com as versões corretas do Scala e do Spark.
- Verifique se todas as dependências do Spark têm escopo fornecido, exceto spark-sql-kafka-0-10.
SparkUpgradeException devido à alteração no modo de calendário
Há alterações no modelo de calendário do Spark 3.0. Quando você gravar uma coluna de calendário no SQL do Spark, talvez ocorra uma exceção como esta:
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.
Solução: defina a configuração spark.sql.legacy.parquet.int96RebaseModeInWrite como LEGACY ou CORRECTED, segundo a explicação acima. Veja abaixo uma solução possível em código PySpark:
spark.conf.set("spark.sql.legacy.parquet.int96RebaseModeInWrite","CORRECTED")
Próximas etapas
Para saber mais, confira Introdução a Clusters de Big Data do SQL Server.