Metastore externo do Apache Hive (legado)
Este artigo descreve como configurar clusters do Azure Databricks para se conectar a metastores Apache Hive externos existentes. Ele fornece informações sobre a configuração recomendada do metastore e os requisitos de configuração do cluster, seguidos por instruções para configurar clusters para se conectar a um metastore externo. Para versões da biblioteca do Hive incluídas no Databricks Runtime, consulte as notas de versão relevantes da versão do Databricks Runtime.
Importante
- Embora o SQL Server funcione como o banco de dados de metastore subjacente para o Hive 2.0 e superior, os exemplos ao longo deste artigo usam o Banco de Dados SQL do Azure.
- Para obter informações sobre a compatibilidade do metastore do Hive com o HDInsight, consulte Usar repositórios de metadados externos no Azure HDInsight.
- Se você usar o Banco de Dados do Azure para MySQL como um metastore externo, deverá alterar o
lower_case_table_names
valor da propriedade de 1 (o padrão) para 2 na configuração do banco de dados do lado do servidor. Para obter detalhes, consulte Diferenciação de maiúsculas e minúsculas do identificador.
Nota
O uso de metastores externos é um modelo de governança de dados herdado. O Databricks recomenda que atualize para o Unity Catalog. O Unity Catalog simplifica a segurança e a governança de seus dados, ao fornecer um local central para administrar e auditar o acesso aos dados em vários espaços de trabalho na sua conta. Veja O que é o Unity Catalog?.
Configuração do metastore do Hive
O cliente de metastore em execução dentro de um cluster se conecta ao seu banco de dados de metastore subjacente diretamente usando JDBC.
Para testar a conectividade de rede de um cluster para o metastore, você pode executar o seguinte comando dentro de um bloco de anotações:
%sh
nc -vz <DNS name> <port>
em que
<DNS name>
é o nome do servidor do Banco de Dados SQL do Azure.<port>
é a porta do banco de dados.
Configurações de clusters
Você deve definir dois conjuntos de opções de configuração para conectar um cluster a um metastore externo:
- As opções do Spark configuram o Spark com a versão do metastore do Hive e os JARs para o cliente do metastore.
- As opções do Hive configuram o cliente do metastore para se conectar ao metastore externo.
Opções de configuração do Spark
Defina spark.sql.hive.metastore.version
para a versão do seu metastore do Hive e spark.sql.hive.metastore.jars
da seguinte forma:
Colmeia 0,13: não definir
spark.sql.hive.metastore.jars
.Nota
O Hive 1.2.0 e 1.2.1 não são o metastore interno no Databricks Runtime 7.0 e superior. Se você quiser usar o Hive 1.2.0 ou 1.2.1 com o Databricks Runtime 7.0 e superior, siga o procedimento descrito em Baixar os jars do metastore e aponte para eles.
Hive 2.3.7 (Databricks Runtime 7.0 - 9.x) ou Hive 2.3.9 (Databricks Runtime 10.0 e superior): definido
spark.sql.hive.metastore.jars
comobuiltin
.Para todas as outras versões do Hive, o Azure Databricks recomenda que você baixe os JARs do metastore e defina a configuração
spark.sql.hive.metastore.jars
para apontar para os JARs baixados usando o procedimento descrito em Baixar os jars do metastore e aponte para eles.
Faça o download dos frascos da metastore e aponte para eles
Crie um cluster com
spark.sql.hive.metastore.jars
definido comomaven
espark.sql.hive.metastore.version
para corresponder à versão do seu metastore.Quando o cluster estiver em execução, pesquise o log do driver e encontre uma linha como a seguinte:
17/11/18 22:41:19 INFO IsolatedClientLoader: Downloaded metastore jars to <path>
O diretório
<path>
é o local dos JARs baixados no nó do driver do cluster.Como alternativa, você pode executar o seguinte código em um bloco de anotações Scala para imprimir o local dos JARs:
import com.typesafe.config.ConfigFactory val path = ConfigFactory.load().getString("java.io.tmpdir") println(s"\nHive JARs are downloaded to the path: $path \n")
Execute
%sh cp -r <path> /dbfs/hive_metastore_jar
(substituindo<path>
pelas informações do cluster) para copiar esse diretório para um diretório na raiz DBFS chamadohive_metastore_jar
através do cliente DBFS no nó do driver.Crie um script init que copie
/dbfs/hive_metastore_jar
para o sistema de arquivos local do nó, certificando-se de fazer o script init dormir alguns segundos antes de acessar o cliente DBFS. Isso garante que o cliente esteja pronto.Defina
spark.sql.hive.metastore.jars
para utilizar este diretório. Se o script init copiar/dbfs/hive_metastore_jar
para/databricks/hive_metastore_jars/
, definaspark.sql.hive.metastore.jars
para/databricks/hive_metastore_jars/*
. A localização tem de incluir/*
.Reinicie o cluster.
Opções de configuração do Hive
Esta seção descreve opções específicas do Hive.
Para se conectar a um metastore externo usando o modo local, defina as seguintes opções de configuração do Hive:
# JDBC connect string for a JDBC metastore
javax.jdo.option.ConnectionURL <mssql-connection-string>
# Username to use against metastore database
javax.jdo.option.ConnectionUserName <mssql-username>
# Password to use against metastore database
javax.jdo.option.ConnectionPassword <mssql-password>
# Driver class name for a JDBC metastore
javax.jdo.option.ConnectionDriverName com.microsoft.sqlserver.jdbc.SQLServerDriver
em que
<mssql-connection-string>
é a cadeia de conexão JDBC (que você pode obter no portal do Azure). Não é necessário incluir nome de usuário e senha na cadeia de conexão, porque eles serão definidos porjavax.jdo.option.ConnectionUserName
ejavax.jdo.option.ConnectionDriverName
.<mssql-username>
e<mssql-password>
especifique o nome de usuário e a senha da sua conta do Banco de Dados SQL do Azure que tem acesso de leitura/gravação ao banco de dados.
Nota
Para ambientes de produção, recomendamos que você defina hive.metastore.schema.verification
como true
. Isso impede que o cliente de metastore do Hive modifique implicitamente o esquema do banco de dados do metastore quando a versão do cliente do metastore não corresponder à versão do banco de dados do metastore. Ao habilitar essa configuração para versões de cliente de metastore inferiores ao Hive 1.2.0, verifique se o cliente de metastore tem a permissão de gravação no banco de dados de metastore (para evitar o problema descrito em HIVE-9749).
- Para o Hive metastore 1.2.0 e superior, defina
hive.metastore.schema.verification.record.version
comotrue
ativarhive.metastore.schema.verification
o . - Para o Hive metastore 2.1.1 e superior, defina
hive.metastore.schema.verification.record.version
comotrue
definido porfalse
padrão.
Configurar um metastore externo com a IU
Para configurar um metastore externo usando a interface do usuário do Azure Databricks:
Clique no botão Clusters na barra lateral.
Clique em Criar Cluster.
Insira as seguintes opções de configuração do Spark:
# Hive-specific configuration options. # spark.hadoop prefix is added to make sure these Hive specific options propagate to the metastore client. # JDBC connect string for a JDBC metastore spark.hadoop.javax.jdo.option.ConnectionURL <mssql-connection-string> # Username to use against metastore database spark.hadoop.javax.jdo.option.ConnectionUserName <mssql-username> # Password to use against metastore database spark.hadoop.javax.jdo.option.ConnectionPassword <mssql-password> # Driver class name for a JDBC metastore spark.hadoop.javax.jdo.option.ConnectionDriverName com.microsoft.sqlserver.jdbc.SQLServerDriver # Spark specific configuration options spark.sql.hive.metastore.version <hive-version> # Skip this one if <hive-version> is 0.13.x. spark.sql.hive.metastore.jars <hive-jar-source>
Continue a configuração do cluster, seguindo as instruções em Referência de configuração de computação.
Clique em Criar cluster para criar o cluster.
Configurar um metastore externo com um script init
Os scripts de inicialização permitem que você se conecte a um metastore existente do Hive sem definir manualmente as configurações necessárias.
- Crie o diretório base no qual você deseja armazenar o script init se ele não existir. O exemplo a seguir usa
dbfs:/databricks/scripts
o . - Execute o seguinte trecho em um bloco de anotações. O snippet cria o script
/databricks/scripts/external-metastore.sh
init no Databricks File System (DBFS). Como alternativa, você pode usar a operação put da API REST do DBFS para criar o script init. Esse script init grava as opções de configuração necessárias em um arquivo de configuração nomeado00-custom-spark.conf
em um formato semelhante a JSON dentro/databricks/driver/conf/
de cada nó do cluster, sempre que um cluster com o nome especificado como<cluster-name>
é iniciado. O Azure Databricks fornece configurações padrão do/databricks/driver/conf/spark-branch.conf
Spark no arquivo. Os arquivos de configuração no/databricks/driver/conf
diretório aplicam-se em ordem alfabética inversa. Se pretender alterar o00-custom-spark.conf
nome do ficheiro, certifique-se de que continua a aplicar-se antes dospark-branch.conf
ficheiro.
Scala
dbutils.fs.put(
"/databricks/scripts/external-metastore.sh",
"""#!/bin/sh
|# Loads environment variables to determine the correct JDBC driver to use.
|source /etc/environment
|# Quoting the label (i.e. EOF) with single quotes to disable variable interpolation.
|cat << 'EOF' > /databricks/driver/conf/00-custom-spark.conf
|[driver] {
| # Hive specific configuration options.
| # spark.hadoop prefix is added to make sure these Hive specific options will propagate to the metastore client.
| # JDBC connect string for a JDBC metastore
| "spark.hadoop.javax.jdo.option.ConnectionURL" = "<mssql-connection-string>"
|
| # Username to use against metastore database
| "spark.hadoop.javax.jdo.option.ConnectionUserName" = "<mssql-username>"
|
| # Password to use against metastore database
| "spark.hadoop.javax.jdo.option.ConnectionPassword" = "<mssql-password>"
|
| # Driver class name for a JDBC metastore
| "spark.hadoop.javax.jdo.option.ConnectionDriverName" = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
|
| # Spark specific configuration options
| "spark.sql.hive.metastore.version" = "<hive-version>"
| # Skip this one if <hive-version> is 0.13.x.
| "spark.sql.hive.metastore.jars" = "<hive-jar-source>"
|}
|EOF
|""".stripMargin,
overwrite = true
)
Python
contents = """#!/bin/sh
# Loads environment variables to determine the correct JDBC driver to use.
source /etc/environment
# Quoting the label (i.e. EOF) with single quotes to disable variable interpolation.
cat << 'EOF' > /databricks/driver/conf/00-custom-spark.conf
[driver] {
# Hive specific configuration options.
# spark.hadoop prefix is added to make sure these Hive specific options will propagate to the metastore client.
# JDBC connect string for a JDBC metastore
"spark.hadoop.javax.jdo.option.ConnectionURL" = "<mssql-connection-string>"
# Username to use against metastore database
"spark.hadoop.javax.jdo.option.ConnectionUserName" = "<mssql-username>"
# Password to use against metastore database
"spark.hadoop.javax.jdo.option.ConnectionPassword" = "<mssql-password>"
# Driver class name for a JDBC metastore
"spark.hadoop.javax.jdo.option.ConnectionDriverName" = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
# Spark specific configuration options
"spark.sql.hive.metastore.version" = "<hive-version>"
# Skip this one if <hive-version> is 0.13.x.
"spark.sql.hive.metastore.jars" = "<hive-jar-source>"
}
EOF
"""
dbutils.fs.put(
file = "/databricks/scripts/external-metastore.sh",
contents = contents,
overwrite = True
)
- Configure seu cluster com o script init.
- Reinicie o cluster.
Resolução de Problemas
Os clusters não são iniciados (devido a configurações incorretas de script de inicialização)
Se um script init para configurar o metastore externo fizer com que a criação do cluster falhe, configure o script init para registrar em log e depure o script init usando os logs.
Erro na instrução SQL: InvocationTargetException
Padrão de mensagem de erro no rastreamento de pilha de exceção completo:
Caused by: javax.jdo.JDOFatalDataStoreException: Unable to open a test connection to the given database. JDBC url = [...]
As informações de conexão JDBC do metastore externo estão configuradas incorretamente. Verifique o nome de host, a porta, o nome de usuário, a senha e o nome da classe do driver JDBC configurados. Além disso, confirme que o nome de utilizador tem o privilégio certo para aceder à base de dados do metastore.
Padrão de mensagem de erro no rastreamento de pilha de exceção completo:
Required table missing : "`DBS`" in Catalog "" Schema "". DataNucleus requires this table to perform its persistence operations. [...]
Banco de dados de metastore externo não inicializado corretamente. Verifique se você criou o banco de dados de metastore e coloque o nome correto do banco de dados na cadeia de conexão JDBC. Em seguida, inicie um novo cluster com as duas opções de configuração do Spark seguintes:
datanucleus.schema.autoCreateTables true datanucleus.fixedDatastore false
Desta forma, a biblioteca de cliente do Hive tentará criar e inicializar as tabelas na base de dados do metastore automaticamente quando tentar aceder-lhes mas estiverem ausentes.
Erro na instrução SQL: AnalysisException: Não é possível instanciar org.apache.hadoop.hive.metastore.HiveMetastoreClient
Mensagem de erro no stacktrace de exceção completo:
The specified datastore driver (driver name) was not found in the CLASSPATH
O cluster está configurado para usar um driver JDBC incorreto.
Definir datanucleus.autoCreateSchema como true não funciona como esperado
Por padrão, o Databricks também define datanucleus.fixedDatastore
como , o true
que impede quaisquer alterações estruturais acidentais nos bancos de dados do metastore. Portanto, a biblioteca de cliente do Hive não pode criar tabelas de metastore mesmo se você definir datanucleus.autoCreateSchema
como true
. Essa estratégia é, em geral, mais segura para ambientes de produção, pois evita que o banco de dados do metastore seja atualizado acidentalmente.
Se você quiser usar datanucleus.autoCreateSchema
para ajudar a inicializar o banco de dados do metastore, certifique-se de definir datanucleus.fixedDatastore
como false
. Além disso, você pode querer inverter ambos os sinalizadores depois de inicializar o banco de dados de metastore para fornecer melhor proteção ao seu ambiente de produção.