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
  • SQL Server não funciona como o banco de dados de metastore subjacente para Hive 2.0 e acima.
  • 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.

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çõ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.

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>

    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>
  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). 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>"
    |
    |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
    )
  3. Configure seu clustering com o site init script.

  4. 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
    )
  3. Configure seu clustering com o site init script.

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

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.