Externo Apache Hive metastore (legado)
Essa documentação foi descontinuada e pode não estar atualizada.
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.
- 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.
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:
- configuram o site com a versão e os JARs para oSpark cliente do metastore. Spark Hive 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
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
.
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
comobuiltin
. -
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
-
Crie um clustering com
spark.sql.hive.metastore.jars
definido comomaven
espark.sql.hive.metastore.version
para corresponder à versão do seu metastore. -
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:
Scalaimport com.typesafe.config.ConfigFactory
val path = ConfigFactory.load().getString("java.io.tmpdir")
println(s"\nHive JARs are downloaded to the path: $path \n") -
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 chamadohive_metastore_jar
por meio do cliente DBFS no nó do driver. -
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. -
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/
, definaspark.sql.hive.metastore.jars
para/databricks/hive_metastore_jars/*
. O local deve incluir o/*
final. -
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:
-
Clique no botão de clustering na barra lateral.
-
Clique em Criar cluster .
-
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> -
Continue sua configuração de clustering, seguindo as instruções na referência de configuração de computação.
-
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
-
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
. -
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 chamado00-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 arquivo00-custom-spark.conf
, certifique-se de que ele continue sendo aplicado antes do arquivospark-branch.conf
.Scaladbutils.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
) -
Configure seu clustering com o site init script.
-
Reinicie o clustering.
Modo remoto
-
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
. -
Execute o seguinte trecho em um Notebook:
Scaladbutils.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
) -
Configure seu clustering com o site init script.
-
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:
inidatanucleus.schema.autoCreateTables true
datanucleus.fixedDatastore falseDessa 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.