Usar o metastore do Hive externo para o Pool do Spark do Synapse
Observação
Metastores do Hive externo não terão mais suporte no Azure Synapse Runtime para Apache Spark 3.4 e nas versões subsequentes no Synapse.
O Azure Synapse Analytics permite que pools do Apache Spark no mesmo workspace compartilhem um metastore compatível com HMS (Metastore do Hive) gerenciado como o catálogo desses pools. Quando os clientes desejam manter os metadados de catálogo do Hive fora do workspace e compartilhar objetos de catálogo com outros mecanismos computacionais fora do workspace, como o HDInsight e o Azure Databricks, eles podem se conectar a um metastore do Hive externo. Neste artigo, você saberá como conectar o Spark do Synapse a um metastore do Apache Hive externo.
Versões compatíveis do metastore do Hive
O recurso funciona com o Spark 3.1. A tabela a seguir mostra as versões compatíveis do metastore do Hive para cada versão do Spark.
Versão do Spark | HMS 2.3.x | HMS 3.1.X |
---|---|---|
3.3 | Sim | Sim |
Configurar o serviço vinculado para o metastore do Hive
Observação
Somente o Banco de Dados SQL do Azure e o Banco de Dados do Azure para MySQL são compatíveis como um metastore do Hive externo. No momento, só damos suporte à autenticação por usuário e senha. Se o banco de dados fornecido estiver em branco, provisione-o por meio da Ferramenta de Esquema do Hive para criar o esquema de banco de dados.
Siga as etapas abaixo para configurar um serviço vinculado para o metastore do Hive externo no workspace do Azure Synapse.
Abra o Synapse Studio, vá em Gerenciar > Serviços vinculados à esquerda, selecione Novo para criar um novo serviço vinculado.
Escolha Banco de Dados do SQL do Azure ou Banco de Dados do Azure para MySQL com base no seu tipo de banco de dados, selecione Continuar.
Forneça o Nome do serviço vinculado. Grave o nome do serviço vinculado. Essas informações serão usadas em breve para configurar o Spark.
Você pode selecionar o Banco de Dados SQL do Azure/Banco de Dados do Azure para MySQL para o metastore do Hive externo na lista de assinaturas do Azure ou inserir as informações manualmente.
Forneça o Nome de usuário e a Senha para configurar a conexão.
Teste a conectividade para verificar o nome de usuário e a senha.
Selecione Criar para criar o serviço vinculado.
Testar conectividade e obter a versão do metastore no notebook
Algumas configurações de regras de segurança de rede podem bloquear o acesso do pool Spark ao banco de dados externo do metastore do Hive. Antes de configurar o Pool do Spark, execute o código abaixo em um notebook do Pool do Spark para testar a conexão com o banco de dados do metastore do Hive externo.
Você também pode obter a versão do metastore do Hive com base nos resultados da saída. A versão do metastore do Hive será usada na configuração do Spark.
Aviso
Não publique os scripts de teste no seu notebook com sua senha codificada, pois isso pode causar um risco potencial de segurança para seu metastore do Hive.
Código de teste de conexão para o SQL do Azure
%%spark
import java.sql.DriverManager
/** this JDBC url could be copied from Azure portal > Azure SQL database > Connection strings > JDBC **/
val url = s"jdbc:sqlserver://{your_servername_here}.database.windows.net:1433;database={your_database_here};user={your_username_here};password={your_password_here};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;"
try {
val connection = DriverManager.getConnection(url)
val result = connection.createStatement().executeQuery("select t.SCHEMA_VERSION from VERSION t")
result.next();
println(s"Successful to test connection. Hive Metastore version is ${result.getString(1)}")
} catch {
case ex: Throwable => println(s"Failed to establish connection:\n $ex")
}
Código de teste de conexão para o Banco de Dados do Azure para MySQL
%%spark
import java.sql.DriverManager
/** this JDBC url could be copied from Azure portal > Azure Database for MySQL > Connection strings > JDBC **/
val url = s"jdbc:mysql://{your_servername_here}.mysql.database.azure.com:3306/{your_database_here}?useSSL=true"
try {
val connection = DriverManager.getConnection(url, "{your_username_here}", "{your_password_here}");
val result = connection.createStatement().executeQuery("select t.SCHEMA_VERSION from VERSION t")
result.next();
println(s"Successful to test connection. Hive Metastore version is ${result.getString(1)}")
} catch {
case ex: Throwable => println(s"Failed to establish connection:\n $ex")
}
Configurar o Spark para usar o metastore do Hive externo
Depois de criar o serviço vinculado ao metastore do Hive externo com êxito, você precisará definir algumas configurações do Spark para usar o metastore do Hive externo. Você pode definir a configuração no nível do Pool do Spark ou no nível da sessão do Spark.
Estas são as configurações e descrições:
Observação
O Synapse tem como objetivo trabalhar sem problemas com computações do HDI. No entanto, o HMS 3.1 no HDI 4.0 não é totalmente compatível com o OSS HMS 3.1. Verifique aqui as diretrizes para o OSS HMS 3.1.
Configuração do Spark | Descrição |
---|---|
spark.sql.hive.metastore.version |
Versões com suporte:
|
spark.sql.hive.metastore.jars |
|
spark.hadoop.hive.synapse.externalmetastore.linkedservice.name |
Nome do seu serviço vinculado |
spark.sql.hive.metastore.sharedPrefixes |
com.mysql.jdbc,com.microsoft.sqlserver,com.microsoft.vegas |
Configurar no nível do pool do Spark
Ao criar o Pool do Spark, na guia Configurações adicionais, coloque as configurações abaixo em um arquivo de texto e carregue-as na seção Configuração do Apache Spark. Você também pode usar o menu de contexto para um Pool do Spark existente. Escolha a configuração do Apache Spark para adicionar essas configurações.
Atualize a versão do metastore e o nome do serviço vinculado e salve as configurações abaixo em um arquivo de texto para a configuração do Pool do Spark:
spark.sql.hive.metastore.version <your hms version, Make sure you use the first 2 parts without the 3rd part>
spark.hadoop.hive.synapse.externalmetastore.linkedservice.name <your linked service name>
spark.sql.hive.metastore.jars /opt/hive-metastore/lib-<your hms version, 2 parts>/*:/usr/hdp/current/hadoop-client/lib/*
spark.sql.hive.metastore.sharedPrefixes com.mysql.jdbc,com.microsoft.sqlserver,com.microsoft.vegas
Aqui está um exemplo para a versão 2.3 do metastore com serviço vinculado chamado HiveCatalog21:
spark.sql.hive.metastore.version 2.3
spark.hadoop.hive.synapse.externalmetastore.linkedservice.name HiveCatalog21
spark.sql.hive.metastore.jars /opt/hive-metastore/lib-2.3/*:/usr/hdp/current/hadoop-client/lib/*
spark.sql.hive.metastore.sharedPrefixes com.mysql.jdbc,com.microsoft.sqlserver,com.microsoft.vegas
Configurar no nível da sessão do Spark
Para a sessão do notebook, você também pode configurar a sessão do Spark no notebook usando o comando magic %%configure
. O código é o seguinte:
%%configure -f
{
"conf":{
"spark.sql.hive.metastore.version":"<your hms version, 2 parts>",
"spark.hadoop.hive.synapse.externalmetastore.linkedservice.name":"<your linked service name>",
"spark.sql.hive.metastore.jars":"/opt/hive-metastore/lib-<your hms version, 2 parts>/*:/usr/hdp/current/hadoop-client/lib/*",
"spark.sql.hive.metastore.sharedPrefixes":"com.mysql.jdbc,com.microsoft.sqlserver,com.microsoft.vegas"
}
}
Para um trabalho em lotes, a mesma configuração também pode ser aplicada por meio de SparkConf
.
Executar consultas para verificar a conexão
Depois de todas essas configurações, tente listar objetos de catálogo executando a consulta abaixo no notebook do Spark para verificar a conectividade com o metastore do Hive externo.
spark.sql("show databases").show()
Configurar uma conexão de armazenamento
O serviço vinculado ao banco de dados metastore do Hive fornece acesso somente aos metadados do catálogo do Hive. Para consultar as tabelas existentes, você também precisa configurar a conexão com a conta de armazenamento que armazena os dados subjacentes para as tabelas do Hive.
Configurar a conexão com o Azure Data Lake Storage Gen 2
Conta de armazenamento primária do workspace
Se os dados subjacentes das tabelas do Hive são armazenados na conta de armazenamento primária do workspace, você não precisa fazer configurações extras. Ela funcionará apenas se você tiver seguido as instruções de configuração do armazenamento durante a criação do workspace.
Outra conta ADLS Gen 2
Se os dados subjacentes de seus catálogos do Hive forem armazenados em outra conta do ADLS Gen 2, você precisará garantir que os usuários que executem consultas do Spark tenham uma função de Colaborador de Dados de Armazenamento de Blobs na conta de armazenamento ADLS Gen2.
Configurar a conexão com o Armazenamento de Blobs
Se os dados subjacentes das tabelas do Hive estiverem armazenados na conta de Armazenamento de Blobs do Azure, configure a conexão seguindo as etapas abaixo:
Abra o Synapse Studio, acesse Dados > guia Vinculado > botão Adicionar>Conectar com os dados externos.
Escolha Armazenamento de Blobs do Azure e selecione Continuar.
Forneça o Nome do serviço vinculado. Registre o nome do serviço vinculado, pois essa informação será usada em breve na configuração do Spark.
Selecione a conta do Armazenamento de Blobs do Azure. Verifique se o método de autenticação é a Chave de conta. Atualmente, o Pool do Spark pode acessar a conta de Armazenamento de Blobs somente por meio da chave de conta.
Teste a conexão e selecione Criar.
Depois de criar o serviço vinculado na conta de Armazenamento de Blobs, ao executar as consultas do Spark, execute abaixo do código Spark no notebook para obter acesso à conta de Armazenamento de Blobs na sessão do Spark. Saiba mais aqui sobre o motivo de precisar fazer isso.
%%pyspark
blob_account_name = "<your blob storage account name>"
blob_container_name = "<your container name>"
from pyspark.sql import SparkSession
sc = SparkSession.builder.getOrCreate()
token_library = sc._jvm.com.microsoft.azure.synapse.tokenlibrary.TokenLibrary
blob_sas_token = token_library.getConnectionString("<blob storage linked service name>")
spark.conf.set('fs.azure.sas.%s.%s.blob.core.windows.net' % (blob_container_name, blob_account_name), blob_sas_token)
Depois de configurar conexões de armazenamento, você pode consultar as tabelas existentes no Metastore do Hive.
Limitações conhecidas
- O pesquisador de objetos do Synapse Studio continuará mostrando objetos no metastore gerenciado do Azure Synapse em vez do HMS externo.
- A sincronização SQL <-> Spark não funciona ao usar o HMS externo.
- Somente o Banco de Dados SQL do Azure e o Banco de Dados do Azure para MySQL são compatíveis como banco de dados de metastore do Hive externo. Há suporte somente para a autorização SQL.
- Atualmente, o Spark funciona apenas em tabelas Hive externas e tabelas Hive gerenciadas não transacionais/não ACID. Ele não dá suporte a tabelas ACID/transacionais do Hive.
- A integração com o Apache Ranger não é suportada.
Solução de problemas
Observe o erro abaixo ao consultar uma tabela do Hive com os dados armazenados no Armazenamento de Blobs
No credentials found for account xxxxx.blob.core.windows.net in the configuration, and its container xxxxx is not accessible using anonymous credentials. Please check if the container exists first. If it is not publicly available, you have to provide account credentials.
Ao usar a autenticação de chave na sua conta de armazenamento pelo serviço vinculado, você precisa dar uma etapa extra para obter o token da sessão do Spark. Execute o código abaixo para configurar sua sessão do Spark antes de executar a consulta. Saiba mais aqui sobre o motivo de precisar fazer isso.
%%pyspark
blob_account_name = "<your blob storage account name>"
blob_container_name = "<your container name>"
from pyspark.sql import SparkSession
sc = SparkSession.builder.getOrCreate()
token_library = sc._jvm.com.microsoft.azure.synapse.tokenlibrary.TokenLibrary
blob_sas_token = token_library.getConnectionString("<blob storage linked service name>")
spark.conf.set('fs.azure.sas.%s.%s.blob.core.windows.net' % (blob_container_name, blob_account_name), blob_sas_token)
Observe o erro abaixo ao consultar uma tabela armazenada na conta ADLS Gen2
Operation failed: "This request is not authorized to perform this operation using this permission.", 403, HEAD
Isso pode acontecer pois o usuário que executa a consulta do Spark não tem acesso suficiente à conta de armazenamento subjacente. Verifique se o usuário que executa as consultas do Spark tem a função de Colaborador de Dados de Armazenamento de Blobs na conta de armazenamento do ADLS Gen2. Essa etapa pode ser realizada após a criação do serviço vinculado.
Configurações relacionadas ao esquema do HMS
Para evitar alterar o esquema/versão de back-end do HMS, as seguintes configurações de Hive são definidas pelo sistema por padrão:
spark.hadoop.hive.metastore.schema.verification true
spark.hadoop.hive.metastore.schema.verification.record.version false
spark.hadoop.datanucleus.fixedDatastore true
spark.hadoop.datanucleus.schema.autoCreateAll false
Se a versão do HMS for 1.2.1
ou 1.2.2
, haverá um problema no Hive que exigirá apenas 1.2.0
se você definir spark.hadoop.hive.metastore.schema.verification
como true
. Nossa sugestão é que você possa modificar sua versão do HMS para 1.2.0
ou substituir as duas configurações abaixo para resolver o problema:
spark.hadoop.hive.metastore.schema.verification false
spark.hadoop.hive.synapse.externalmetastore.schema.usedefault false
Se você precisar migrar sua versão do HMS, recomendamos usar a ferramenta de esquema do Hive. E se o HMS tiver sido usado por clusters do HDInsight, sugerimos usar a versão fornecida pelo HDI.
Alteração de esquema do HMS para OSS HMS 3.1
O Synapse tem como objetivo trabalhar sem problemas com computações do HDI. Entretanto, o HMS 3.1 no HDI 4.0 não é totalmente compatível com o OSS HMS 3.1. Aplique o seguinte manualmente ao seu HMS 3.1 se ele não for provisionado pelo HDI.
-- HIVE-19416
ALTER TABLE TBLS ADD WRITE_ID bigint NOT NULL DEFAULT(0);
ALTER TABLE PARTITIONS ADD WRITE_ID bigint NOT NULL DEFAULT(0);
Ao compartilhar o metastore com o cluster Spark do HDInsight 4.0, não consigo ver as tabelas
Se desejar compartilhar o catálogo do Hive com um cluster Spark no HDInsight 4.0, verifique se a sua propriedade spark.hadoop.metastore.catalog.default
no Synapse Spark está alinhada com o valor no Spark do HDInsight. O valor padrão para Spark do HDI é spark
e o valor padrão para o Spark do Synapse é hive
.
Ao compartilhar o metastore do Hive com um cluster de Hive do HDInsight 4.0, posso listar as tabelas com êxito, mas obtenho apenas um resultado vazio ao consultar a tabela
Conforme mencionado nas limitações, o pool Synapse Spark dá suporte somente a tabelas de Hive externas e tabelas gerenciadas não transacionais e não ACID. No momento, ele não dá suporte a tabelas ACID/transacionais do Hive. Em clusters de Hive do HDInsight 4.0, todas as tabelas gerenciadas são criadas como tabelas ACID/transacionais por padrão, fazendo com que você receba resultados vazios ao consultar essas tabelas.
Veja o erro abaixo quando um metastore externo é usado enquanto o cache inteligente está habilitado
java.lang.ClassNotFoundException: Class com.microsoft.vegas.vfs.SecureVegasFileSystem not found
Você pode corrigir esse problema facilmente acrescentando /usr/hdp/current/hadoop-client/*
ao seu spark.sql.hive.metastore.jars
.
Eg:
spark.sql.hive.metastore.jars":"/opt/hive-metastore/lib-2.3/*:/usr/hdp/current/hadoop-client/lib/*:/usr/hdp/current/hadoop-client/*