Pular para o conteúdo principal

Externo Apache Hive metastore (legado)

important

Essa documentação foi descontinuada e pode não estar atualizada.

nota

O uso de metastores externos é um modelo de governança de dados legado. A Databricks recomenda que o senhor atualize para o Unity Catalog. Unity Catalog simplifica a segurança e a governança de seus dados, fornecendo um local central para administrar e auditar o acesso aos dados em vários espaços de trabalho em seu site account. Consulte O que é o Unity Catalog?

Este artigo descreve como configurar o clustering do Databricks para se conectar a metastores externos existentes do Apache Hive. Ele fornece informações sobre os modos de implantação do metastore, a configuração de rede recomendada e os requisitos de configuração do clustering, seguidos de instruções para configurar o clustering para se conectar a um metastore externo. Para as versões da Hive biblioteca incluídas na Databricks Runtime, consulte a versão relevante da Databricks Runtime notas sobre a versão.

important
  • Se o senhor usar o Azure Database for MySQL como um metastore externo, deverá alterar o valor da propriedade lower_case_table_names de 1 (o default) para 2 na configuração do banco de dados no lado do servidor. Para obter detalhes, consulte Identifier Case Sensibility.
  • Se o senhor usar um banco de dados de metastore somente leitura, o site Databricks recomenda enfaticamente que defina spark.databricks.delta.catalog.update.enabled como false no seu clustering para obter melhor desempenho.

Hive metastore modos de implantação

Em um ambiente de produção, o senhor pode implantar um Hive metastore em dois modos: local e remoto.

Modo local

O cliente do metastore em execução dentro de um clustering se conecta ao banco de dados subjacente do metastore diretamente via JDBC.

Modo remoto

Em vez de se conectar diretamente ao banco de dados subjacente, o cliente do metastore se conecta a um serviço de metastore separado por meio do protocolo Thrift. O serviço de metastore se conecta ao banco de dados subjacente. Ao executar um metastore no modo remoto, não há suporte para DBFS.

Para obter mais detalhes sobre esses modos de implantação, consulte a documentação do Hive.

nota

Os exemplos deste documento usam o MySQL como o banco de dados do metastore subjacente.

Configuração de rede

Databricks execução de clustering dentro de uma nuvem privada virtual (VPC). Recomendamos que o senhor configure o Hive metastore externo dentro de um novo VPC e, em seguida, faça um par entre esses dois VPCs para que o clustering se conecte ao Hive metastore usando um endereço IP privado. VPC O peering fornece instruções detalhadas sobre como fazer peering entre o VPC usado pelo Databricks clustering e o VPC onde o metastore reside. Depois de fazer o peering entre as VPCs, o senhor pode testar a conectividade de rede de um clustering para o metastore VPC executando o seguinte comando em um Notebook:

Bash
%sh
nc -vz <DNS name or private IP> <port>

onde

  • <DNS name or private IP> é o nome DNS ou o endereço IP privado do banco de dados MySQL (para o modo local) ou o serviço de metastore (para o modo remoto). Se você usar um nome DNS aqui, certifique-se de que o endereço IP resolvido seja privado.
  • <port> é a porta do banco de dados MySQL ou a porta do serviço de metastore.

configurações de agrupamento

O senhor deve definir três conjuntos de opções de configuração para conectar um clustering a um metastore externo:

Opções de configuração do Spark

Defina spark.sql.hive.metastore.version como a versão do site Hive metastore e spark.sql.hive.metastore.jars da seguinte forma:

  • Hive 0.13: não definir spark.sql.hive.metastore.jars.
nota

Hive 1.2.0 e 1.2.1 não são o metastore integrado em Databricks Runtime 7.0 e acima. Se o senhor quiser usar o Hive 1.2.0 ou 1.2.1 com o Databricks Runtime 7.0 e o acima, siga o procedimento descrito em download dos 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 acima): define spark.sql.hive.metastore.jars como builtin.

  • Para todas as outras versões do Hive, o Databricks recomenda que o senhor download os JARs do metastore e defina a configuração spark.sql.hive.metastore.jars para apontar para os JARs de download usando o procedimento descrito em download the metastore jars and point to them.

Faça o download dos jars do metastore e aponte para eles

  1. Crie um clustering 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 clustering estiver em execução, pesquise o driver log 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 de downloads de JARs no nó do driver do clustering.

    Como alternativa, o senhor pode executar o seguinte código em um notebook Scala para imprimir o local dos JARs:

    Scala
    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. execução %sh cp -r <path> /dbfs/hive_metastore_jar (substituindo <path> pelas informações do seu clustering) para copiar esse diretório para um diretório em DBFS root chamado hive_metastore_jar por meio do cliente DBFS no nó do driver.

  4. Crie um arquivo init script que copia /dbfs/hive_metastore_jar para o sistema de arquivos local do nó, certificando-se de fazer com que o init script durma alguns segundos antes de acessar o cliente DBFS. Isso garante que o cliente esteja pronto.

  5. Defina spark.sql.hive.metastore.jars para usar esse diretório. Se o site init script copiar /dbfs/hive_metastore_jar para /databricks/hive_metastore_jars/, defina spark.sql.hive.metastore.jars para /databricks/hive_metastore_jars/*. O local deve incluir o /* final.

  6. Reinicie o clustering.

Opções de configuração do Hive

Esta seção descreve as opções específicas do Hive.

Opções de configuração para o modo local

Para se conectar a um metastore externo usando o modo local, defina as seguintes opções de configuração do Hive:

ini
# JDBC connect string for a JDBC metastore
javax.jdo.option.ConnectionURL jdbc:mysql://<metastore-host>:<metastore-port>/<metastore-db>

# Username to use against metastore database
javax.jdo.option.ConnectionUserName <mysql-username>

# Password to use against metastore database
javax.jdo.option.ConnectionPassword <mysql-password>

# Driver class name for a JDBC metastore (Runtime 3.4 and later)
javax.jdo.option.ConnectionDriverName org.mariadb.jdbc.Driver

# Driver class name for a JDBC metastore (prior to Runtime 3.4)
# javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver

onde

  • <metastore-host> e <metastore-port> são o host e a porta de escuta da sua instância do MySQL.
  • <metastore-db> é o nome do banco de dados MySQL que contém todas as tabelas do metastore.
  • <mysql-username> e <mysql-password> especificam o nome de usuário e a senha do site MySQL account que tem acesso de leitura/gravação a <metastore-db>.
nota
  • Use o driver MariaDB para se comunicar com os bancos de dados MySQL.
  • Para ambientes de produção, recomendamos que você defina hive.metastore.schema.verification como true. Isso evita que o cliente Hive metastore 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 ativar essa configuração para versões do cliente do metastore inferiores ao Hive 1.2.0, certifique-se de que o cliente do metastore tenha permissão de gravação no banco de dados do 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 para habilitar hive.metastore.schema.verification.
    • Para Hive metastore 2.1.1 e superior, defina hive.metastore.schema.verification.record.version como true, pois ele é definido como false por default.

Opções de configuração para o modo remoto

Para se conectar a um metastore externo usando o modo remoto, defina a seguinte opção de configuração do Hive:

ini
# Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.
hive.metastore.uris thrift://<metastore-host>:<metastore-port>

onde <metastore-host> e <metastore-port> são o host e a porta de escuta do seu serviço Hive metastore.

Opções do sistema de arquivos

Se quiser usar um instance profile e definir AssumeRole, o senhor deve definir:

  • fs.s3a.credentialsType para AssumeRole
  • fs.s3a.stsAssumeRole.arn para o Amazon recurso Name (ARN) da função a ser assumida

Configure um metastore externo usando a interface do usuário

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

  1. Clique no botão de clustering na barra lateral.

  2. Clique em Criar cluster .

  3. Digite as seguintes opções de configuração do Spark:

    Modo local

    ini
    # Hive specific configuration options.
    # spark.hadoop prefix is added to make sure these Hive specific options will propagate to the metastore client.
    spark.hadoop.javax.jdo.option.ConnectionURL jdbc:mysql://<mysql-host>:<mysql-port>/<metastore-db>

    # Driver class name for a JDBC metastore (Runtime 3.4 and later)
    spark.hadoop.javax.jdo.option.ConnectionDriverName org.mariadb.jdbc.Driver

    # Driver class name for a JDBC metastore (prior to Runtime 3.4)
    # spark.hadoop.javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver

    spark.hadoop.javax.jdo.option.ConnectionUserName <mysql-username>
    spark.hadoop.javax.jdo.option.ConnectionPassword <mysql-password>

    # 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>

    # If you need to use AssumeRole, uncomment the following settings.
    # spark.hadoop.fs.s3a.credentialsType AssumeRole
    # spark.hadoop.fs.s3a.stsAssumeRole.arn <sts-arn>

    Modo remoto

    ini
    # Hive specific configuration option
    # spark.hadoop prefix is added to make sure these Hive specific options will propagate to the metastore client.
    spark.hadoop.hive.metastore.uris thrift://<metastore-host>:<metastore-port>

    # 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>

    # If you need to use AssumeRole, uncomment the following settings.
    # spark.hadoop.fs.s3a.credentialsType AssumeRole
    # spark.hadoop.fs.s3a.stsAssumeRole.arn <sts-arn>
  4. Continue sua configuração de clustering, seguindo as instruções na referência de configuração de computação.

  5. Clique em Create clustering para criar o clustering.

Configure um metastore externo usando um init script

permite que o senhor se conecte a um site existente Hive metastore sem definir manualmente as configurações necessárias.

Modo local

  1. Crie o diretório base no qual o senhor deseja armazenar o init script, caso ele não exista. O exemplo a seguir usa dbfs:/databricks/scripts.
  2. Execute o seguinte trecho em um Notebook. O snippet cria o init script /databricks/scripts/external-metastore.sh no sistema de arquivosDatabricks (DBFS). Como alternativa, o senhor pode usar o DBFS REST API put operações para criar o init script. Este init script grava as opções de configuração necessárias em um arquivo de configuração chamado 00-custom-spark.conf em um formato semelhante ao JSONem /databricks/driver/conf/ dentro de cada nó do clustering. Databricks fornece default Spark configurações no arquivo /databricks/driver/conf/spark-branch.conf. Os arquivos de configuração no diretório /databricks/driver/conf se aplicam em ordem alfabética inversa. Se você quiser alterar o nome do arquivo 00-custom-spark.conf, certifique-se de que ele continue sendo aplicado antes do arquivo spark-branch.conf.
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 for metastores in local mode.
| # spark.hadoop prefix is added to make sure these Hive specific options will propagate to the metastore client.
| "spark.hadoop.javax.jdo.option.ConnectionURL" = "jdbc:mysql://<mysql-host>:<mysql-port>/<metastore-db>"
| "spark.hadoop.javax.jdo.option.ConnectionUserName" = "<mysql-username>"
| "spark.hadoop.javax.jdo.option.ConnectionPassword" = "<mysql-password>"
|
| # 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>"
|
| # If you need to use AssumeRole, uncomment the following settings.
| # "spark.hadoop.fs.s3a.credentialsType" = "AssumeRole"
| # "spark.hadoop.fs.s3a.stsAssumeRole.arn" = "<sts-arn>"
|EOF
|
|case "$DATABRICKS_RUNTIME_VERSION" in
| "")
| DRIVER="com.mysql.jdbc.Driver"
| ;;
| *)
| DRIVER="org.mariadb.jdbc.Driver"
| ;;
|esac
|# Add the JDBC driver separately since must use variable expansion to choose the correct
|# driver version.
|cat << EOF >> /databricks/driver/conf/00-custom-spark.conf
| "spark.hadoop.javax.jdo.option.ConnectionDriverName" = "$DRIVER"
|}
|EOF
|""".stripMargin,
overwrite = true
)
  1. Configure seu clustering com o site init script.
  2. Reinicie o clustering.

Modo remoto

  1. Crie o diretório base no qual o senhor deseja armazenar o init script, caso ele não exista. O exemplo a seguir usa dbfs:/databricks/scripts.

  2. Execute o seguinte trecho em um Notebook:

Scala
dbutils.fs.put(
"/databricks/scripts/external-metastore.sh",
"""#!/bin/sh
|
|# 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 for metastores in remote mode.
| # spark.hadoop prefix is added to make sure these Hive specific options will propagate to the metastore client.
| "spark.hadoop.hive.metastore.uris" = "thrift://<metastore-host>:<metastore-port>"
|
| # 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>"
|
| # If you need to use AssumeRole, uncomment the following settings.
| # "spark.hadoop.fs.s3a.credentialsType" = "AssumeRole"
| # "spark.hadoop.fs.s3a.stsAssumeRole.arn" = "<sts-arn>"
|}
|EOF
|""".stripMargin,
overwrite = true
)
  1. Configure seu clustering com o site init script.

  2. Reinicie o clustering.

Solução de problemas

O clustering não começa (devido a configurações incorretas do init script )

Se um init script para configurar o metastore externo causar falha na criação do cluster, configure o init script para loge depure o init script usando o logs.

Erro na instrução SQL: InvocationTargetException

  • Padrão de mensagem de erro no rastreamento completo da pilha de exceções:

    Caused by: javax.jdo.JDOFatalDataStoreException: Unable to open a test connection to the given database. JDBC url = [...]

    Metastore externo JDBC informações de conexão estão mal configuradas. Verifique o nome do host, a porta, o nome de usuário, a senha e o nome da classe do driver JDBC configurados. Além disso, certifique-se de que o nome de usuário tenha o privilégio certo para acessar o banco de dados metastore.

  • Padrão de mensagem de erro no rastreamento completo da pilha de exceções:

    Required table missing : "`DBS`" in Catalog "" Schema "". DataNucleus requires this table to perform its persistence operations. [...]

    O banco de dados externo do metastore não foi inicializado corretamente. Verifique se o senhor criou o banco de dados do metastore e colocou o nome correto do banco de dados nas cadeias de conexão JDBC. Em seguida, inicie um novo clustering com as duas opções de configuração Spark a seguir:

    ini
    datanucleus.schema.autoCreateTables true
    datanucleus.fixedDatastore false

    Dessa forma, a biblioteca cliente do Hive tentará criar e inicializar tabelas no banco de dados do metastore automaticamente quando tentar acessá-las, mas não as encontrar.

Erro na declaração SQL: AnalysisException: Não foi possível instanciar org.apache.hadoop.Hive metastore.HiveMetastoreClient

Mensagem de erro na exceção completa do stacktrace:

The specified datastore driver (driver name) was not found in the CLASSPATH

O clustering está configurado para usar um driver JDBC incorreto.

Esse erro pode ocorrer se um clustering que usa o site Runtime 3.4 ou posterior estiver configurado para usar o driver MySQL em vez do driver MariaDB.

Configurando DataNucleus.AutoCreateSchema to true não funciona conforme o esperado

Em default, Databricks também define datanucleus.fixedDatastore como true, o que impede qualquer alteração estrutural acidental nos bancos de dados do metastore. Portanto, a biblioteca cliente Hive não pode criar tabelas de metastore, mesmo que o senhor defina datanucleus.autoCreateSchema como true. Essa estratégia é, em geral, mais segura para ambientes de produção, pois evita que o banco de dados metastore seja atualizado acidentalmente.

Se você quiser usar datanucleus.autoCreateSchema para ajudar a inicializar o banco de dados metastore, certifique-se de definir datanucleus.fixedDatastore como false. Além disso, talvez você queira inverter os dois sinalizadores após inicializar o banco de dados metastore para oferecer melhor proteção ao seu ambiente de produção.

com.amazonaws.AmazonClientException: Não foi possível inicializar um driver SAX para criar um XMLReader

Essa exceção pode ser lançada se a versão do clustering for 2.1.1-db5. Esse problema foi corrigido no 2.1.1-db6. Para 2.1.1-db5, O senhor pode corrigir esse problema definindo as seguintes propriedades JVM como parte das configurações de spark.driver.extraJavaOptions e spark.executor.extraJavaOptions:

ini
-Djavax.xml.datatype.DatatypeFactory=com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl
-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
-Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl
-Djavax.xml.validation.SchemaFactory:https://www.w3.org/2001/XMLSchema=com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory
-Dorg.xml.sax.driver=com.sun.org.apache.xerces.internal.parsers.SAXParser
-Dorg.w3c.dom.DOMImplementationSourceList=com.sun.org.apache.xerces.internal.dom.DOMXSImplementationSourceImpl