Usar o Hive Metastore externo para Synapse Spark Pool
Nota
Os metastores externos do Hive não terão mais suporte no Azure Synapse Runtime for Apache Spark 3.4 e versões subsequentes no Synapse.
O Azure Synapse Analytics permite que os conjuntos do Apache Spark na mesma área de trabalho partilhem um metastore compatível com HMS (Metastore do Hive) gerido como catálogo. Quando os clientes quiserem manter os metadados do catálogo do Hive fora do espaço de trabalho e compartilhar objetos de catálogo com outros mecanismos computacionais fora do espaço de trabalho, como o HDInsight e o Azure Databricks, eles poderão se conectar a um Metastore externo do Hive. Neste artigo, você pode aprender como conectar o Synapse Spark a um Apache Hive Metastore externo.
Versões suportadas do Hive Metastore
O recurso funciona com o Spark 3.1. A tabela a seguir mostra as versões suportadas do Hive Metastore 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 ao Hive Metastore
Nota
Somente o Banco de Dados SQL do Azure e o Banco de Dados do Azure para MySQL são suportados como um Metastore Hive externo. E atualmente só suportamos a autenticação User-Password. Se o banco de dados fornecido estiver em branco, provisione-o via Hive Schema Tool para criar o esquema do banco de dados.
Siga as etapas abaixo para configurar um serviço vinculado ao Hive Metastore externo no espaço de trabalho Synapse.
Abra o Synapse Studio, vá para Gerenciar > serviços vinculados à esquerda, selecione Novo para criar um novo serviço vinculado.
Escolha Banco de Dados 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. Registre o nome do serviço vinculado, essas informações serão usadas para configurar o Spark em breve.
Você pode selecionar o Banco de Dados/SQL do Azure para MySQL para o Hive Metastore externo na lista de assinaturas do Azure ou inserir as informações manualmente.
Forneça nome de usuário e senha para configurar a conexão.
Teste a conexão para verificar o nome de usuário e a senha.
Selecione Criar para criar o serviço vinculado.
Teste a conexão e obtenha a versão metastore no notebook
Algumas configurações de regra de segurança de rede podem bloquear o acesso do pool do Spark ao banco de dados externo do Hive Metastore. Antes de configurar o pool do Spark, execute o código abaixo em qualquer bloco de anotações do pool do Spark para testar a conexão com o banco de dados externo do Hive Metastore.
Você também pode obter sua versão do Hive Metastore a partir dos resultados de saída. A versão Hive Metastore será usada na configuração do Spark.
Aviso
Não publique os scripts de teste em seu bloco de anotações com sua senha codificada, pois isso pode causar um risco potencial de segurança para sua Hive Metastore.
Código de teste de conexão para o Azure SQL
%%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 Hive Metastore externo
Depois de criar o serviço vinculado ao Hive Metastore externo com êxito, você precisa configurar algumas configurações do Spark para usar o Hive Metastore externo. Você pode configurar a configuração no nível da piscina do Spark ou no nível da sessão do Spark.
Aqui estão as configurações e descrições:
Nota
Synapse visa trabalhar sem problemas com os cálculos do IDH. No entanto, o HMS 3.1 no HDI 4.0 não é totalmente compatível com o OSS HMS 3.1. Para OSS HMS 3.1, por favor verifique aqui.
Configuração do Spark | Description |
---|---|
spark.sql.hive.metastore.version |
Versões suportadas:
|
spark.sql.hive.metastore.jars |
|
spark.hadoop.hive.synapse.externalmetastore.linkedservice.name |
Nome do serviço vinculado |
spark.sql.hive.metastore.sharedPrefixes |
com.mysql.jdbc,com.microsoft.sqlserver,com.microsoft.vegas |
Configurar ao nível da piscina 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-o na seção de configuração do Apache Spark. Você também pode usar o menu de contexto para um pool 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 metastore versão 2.3 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 bloco de anotações, você também pode configurar a sessão do Spark no bloco de anotações usando %%configure
o comando magic. Aqui está o código.
%%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 trabalho em lote, a mesma configuração também pode ser aplicada via 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 bloco de anotações do Spark para verificar a conectividade com o Hive Metastore externo.
spark.sql("show databases").show()
Configurar conexão de armazenamento
O serviço vinculado ao banco de dados do Hive Metastore apenas fornece acesso aos metadados do catálogo do Hive. Para consultar as tabelas existentes, você precisa configurar a conexão com a conta de armazenamento que armazena os dados subjacentes para suas tabelas do Hive também.
Configurar a conexão com o Azure Data Lake Storage Gen 2
Conta de armazenamento principal do espaço de trabalho
Se os dados subjacentes das tabelas do Hive estiverem armazenados na conta de armazenamento principal do espaço de trabalho, você não precisará fazer configurações extras. Ele funcionará apenas desde que você siga as instruções de configuração de armazenamento durante a criação do espaço de trabalho.
Outra conta ADLS Gen 2
Se os dados subjacentes dos catálogos do Hive estiverem armazenados em outra conta do ADLS Gen 2, você precisará garantir que os usuários que executam consultas do Spark tenham a função de Colaborador de Dados de Blob de Armazenamento na conta de armazenamento do ADLS Gen2.
Configurar ligação ao Armazenamento de Blobs
Se os dados subjacentes de suas tabelas do Hive estiverem armazenados na conta de armazenamento de Blob do Azure, configure a conexão siga as etapas abaixo:
Abra o Synapse Studio, vá para a guia Dados vinculados Adicionar botão> Conectar a 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, essas informações serão usadas na configuração do Spark em breve.
Selecione a conta de Armazenamento de Blob do Azure. Verifique se o método de autenticação é a chave da conta. Atualmente, o pool do Spark só pode acessar a conta de armazenamento de Blob por meio da chave da conta.
Teste a conexão e selecione Criar.
Depois de criar o serviço vinculado à conta de Armazenamento de Blob, ao executar consultas do Spark, certifique-se de executar abaixo do código do Spark no bloco de anotações para obter acesso à conta de Armazenamento de Blob para a sessão do Spark. Saiba mais sobre por que você precisa fazer isso aqui.
%%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 as conexões de armazenamento, você pode consultar as tabelas existentes no Hive Metastore.
Limitações conhecidas
- O explorador de objetos do Synapse Studio continuará a mostrar objetos no metastore Synapse gerenciado em vez do HMS externo.
- SQL <-> A sincronização do 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 suportados como banco de dados externo do Hive Metastore. Somente a autorização SQL é suportada.
- Atualmente, o Spark só funciona em tabelas Hive externas e tabelas Hive gerenciadas não transacionais/não ACID. Não suporta tabelas transacionais/ACID do Hive.
- A integração com o Apache Ranger não é suportada.
Resolução de Problemas
Veja abaixo o erro ao consultar uma tabela do Hive com 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 para sua conta de armazenamento via serviço vinculado, você precisa dar uma etapa extra para obter o token para a sessão do Spark. Execute o código abaixo para configurar sua sessão do Spark antes de executar a consulta. Saiba mais sobre por que você precisa fazer isso aqui.
%%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)
Veja abaixo o erro 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
Este erro poderá ocorrer porque o utilizador que executa a consulta do Apache Spark não tem acesso suficiente à conta de armazenamento subjacente. Verifique se o usuário que executa consultas do Spark tem a função de Colaborador de Dados de Blob de Armazenamento na conta de armazenamento ADLS Gen2. Esta etapa pode ser feita após a criação do serviço vinculado.
Configurações relacionadas ao esquema HMS
Para evitar alterar o esquema/versão do 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 sua versão do HMS for 1.2.1
ou 1.2.2
, há um problema no Hive que afirma ser necessário apenas 1.2.0
se você recorrer spark.hadoop.hive.metastore.schema.verification
ao true
. Nossa sugestão é que você possa modificar sua versão do HMS para 1.2.0
, ou substituir abaixo duas configurações para contornar 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 o uso da ferramenta de esquema hive. E se o HMS tiver sido usado por clusters HDInsight, sugerimos usar a versão fornecida pelo HDI.
Alteração de esquema do HMS para OSS HMS 3.1
Synapse visa trabalhar sem problemas com os cálculos do IDH. No entanto, 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 pela 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 HDInsight 4.0 Spark, não consigo ver as tabelas
Se você quiser compartilhar o catálogo do Hive com um cluster de faíscas no HDInsight 4.0, verifique se sua propriedade spark.hadoop.metastore.catalog.default
no Synapse spark está alinhada com o valor no HDInsight spark. O valor predefinido para o Apache Spark no HDI é spark
e o valor predefinido para o Apache Spark no Synapse é hive
.
Ao compartilhar o Hive Metastore com o cluster Hive do HDInsight 4.0, posso listar as tabelas com êxito, mas só obtenho o resultado vazio quando consulto a tabela
Como mencionado nas limitações, o pool Synapse Spark suporta apenas tabelas de hive externas e tabelas gerenciadas não transacionais/ACID, ele não suporta tabelas Hive ACID/transacionais atualmente. Nos clusters Hive do HDInsight 4.0, todas as tabelas gerenciadas são criadas como tabelas ACID/transacionais por padrão, é por isso que você obtém resultados vazios ao consultar essas tabelas.
Veja abaixo o erro quando um metastore externo é usado enquanto o cache inteligente está habilitado
java.lang.ClassNotFoundException: Class com.microsoft.vegas.vfs.SecureVegasFileSystem not found
Você pode facilmente corrigir esse problema anexando /usr/hdp/current/hadoop-client/*
ao seu spark.sql.hive.metastore.jars
arquivo .
Eg:
spark.sql.hive.metastore.jars":"/opt/hive-metastore/lib-2.3/*:/usr/hdp/current/hadoop-client/lib/*:/usr/hdp/current/hadoop-client/*