Partilhar via


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 como builtin.

  • 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

  1. Crie um cluster com spark.sql.hive.metastore.jars definido como maven e spark.sql.hive.metastore.version para corresponder à versão do seu metastore.

  2. 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")
    
  3. 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 chamado hive_metastore_jar através do cliente DBFS no nó do driver.

  4. 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.

  5. 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/, defina spark.sql.hive.metastore.jars para /databricks/hive_metastore_jars/*. A localização tem de incluir /*.

  6. 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 por javax.jdo.option.ConnectionUserName e javax.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 como true ativar hive.metastore.schema.verificationo .
  • Para o Hive metastore 2.1.1 e superior, defina hive.metastore.schema.verification.record.version como true definido por false padrão.

Configurar um metastore externo com a IU

Para configurar um metastore externo usando a interface do usuário do Azure Databricks:

  1. Clique no botão Clusters na barra lateral.

  2. Clique em Criar Cluster.

  3. 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>
    
  4. Continue a configuração do cluster, seguindo as instruções em Referência de configuração de computação.

  5. 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.

  1. 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/scriptso .
  2. 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 nomeado 00-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 o 00-custom-spark.conf nome do ficheiro, certifique-se de que continua a aplicar-se antes do spark-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
)
  1. Configure seu cluster com o script init.
  2. 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 trueque 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.