Metastore Apache Hive esterno (legacy)

Questo articolo descrive come configurare i cluster Di Azure Databricks per connettersi ai metastore Apache Hive esterni esistenti. Fornisce informazioni sui requisiti consigliati per la configurazione del metastore e i requisiti di configurazione del cluster, seguiti da istruzioni per la configurazione dei cluster per la connessione a un metastore esterno. Per le versioni della libreria Hive incluse in Databricks Runtime, vedere le note sulla versione di Databricks Runtime pertinenti.

Importante

  • Mentre SQL Server funziona come database metastore sottostante per Hive 2.0 e versioni successive, gli esempi in questo articolo usano database SQL di Azure.
  • Per informazioni sulla compatibilità dei metastore Hive con HDInsight, vedere Usare archivi di metadati esterni in Azure HDInsight.
  • Se si usa Database di Azure per MySQL come metastore esterno, è necessario modificare il valore della lower_case_table_names proprietà da 1 (impostazione predefinita) a 2 nella configurazione del database lato server. Per informazioni dettagliate, vedere Distinzione tra maiuscole e minuscole dell'identificatore.

Nota

L'uso di metastore esterni è un modello di governance dei dati legacy. Databricks consiglia di eseguire l'aggiornamento a Unity Catalog. Unity Catalog semplifica la sicurezza e la governance dei dati fornendo una posizione centrale per amministrare e controllare l'accesso ai dati in più aree di lavoro nell'account. Vedere Cos'è Unity Catalog?.

Configurazione del metastore Hive

Il client metastore in esecuzione all'interno di un cluster si connette direttamente al database metastore sottostante usando JDBC.

Per testare la connettività di rete da un cluster al metastore, è possibile eseguire il comando seguente all'interno di un notebook:

%sh
nc -vz <DNS name> <port>

where

  • <DNS name>è il nome del server di database SQL di Azure.
  • <port> è la porta del database.

Configurazioni dei cluster

È necessario impostare due set di opzioni di configurazione per connettere un cluster a un metastore esterno:

  • Le opzioni di Spark configurano Spark con la versione del metastore Hive e i file JAR per il client metastore.
  • Le opzioni Hive configurano il client metastore per connettersi al metastore esterno.

Opzioni di configurazione di Spark

Impostare spark.sql.hive.metastore.version sulla versione del metastore Hive e spark.sql.hive.metastore.jars come indicato di seguito:

  • Hive 0.13: non impostare spark.sql.hive.metastore.jars.

    Nota

    Hive 1.2.0 e 1.2.1 non sono il metastore predefinito in Databricks Runtime 7.0 e versioni successive. Se si vuole usare Hive 1.2.0 o 1.2.1 con Databricks Runtime 7.0 e versioni successive, seguire la procedura descritta in Scaricare i file JAR del metastore e puntare a essi.

  • Hive 2.3.7 (Databricks Runtime 7.0 - 9.x) o Hive 2.3.9 (Databricks Runtime 10.0 e versioni successive): impostato su spark.sql.hive.metastore.jars builtin.

  • Per tutte le altre versioni di Hive, Azure Databricks consiglia di scaricare i file JAR del metastore e impostare la configurazione spark.sql.hive.metastore.jars in modo che punti ai FILE JAR scaricati usando la procedura descritta in Scaricare i file JAR del metastore e puntare a essi.

Scaricare i file JAR del metastore e puntare a essi

  1. Creare un cluster con spark.sql.hive.metastore.jars impostato su maven e spark.sql.hive.metastore.version in modo che corrisponda alla versione del metastore.

  2. Quando il cluster è in esecuzione, cercare il log del driver e trovare una riga simile alla seguente:

    17/11/18 22:41:19 INFO IsolatedClientLoader: Downloaded metastore jars to <path>
    

    La directory <path> è il percorso dei file JAR scaricati nel nodo driver del cluster.

    In alternativa, è possibile eseguire il codice seguente in un notebook Scala per stampare il percorso dei file JAR:

    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. Eseguire %sh cp -r <path> /dbfs/hive_metastore_jar (sostituendo <path> con le informazioni del cluster) per copiare questa directory in una directory nella radice DBFS chiamata hive_metastore_jar tramite il client DBFS nel nodo driver.

  4. Creare uno script init che copia /dbfs/hive_metastore_jar nel file system locale del nodo, assicurandosi di attivare lo script init alcuni secondi prima di accedere al client DBFS. In questo modo si garantisce che il client sia pronto.

  5. Impostare spark.sql.hive.metastore.jars per usare questa directory. Se lo script init copia /dbfs/hive_metastore_jar in /databricks/hive_metastore_jars/, impostare spark.sql.hive.metastore.jars su /databricks/hive_metastore_jars/*. Il percorso deve includere /* alla fine.

  6. Riavviare il cluster.

Opzioni di configurazione di Hive

Questa sezione descrive le opzioni specifiche di Hive.

Per connettersi a un metastore esterno usando la modalità locale, impostare le opzioni di configurazione hive seguenti:

# 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

where

  • <mssql-connection-string>è il stringa di connessione JDBC (che è possibile ottenere nella portale di Azure). Non è necessario includere il nome utente e la password nella stringa di connessione, perché verranno impostati da javax.jdo.option.ConnectionUserName e javax.jdo.option.ConnectionDriverName.
  • <mssql-username>e <mssql-password> specificare il nome utente e la password dell'account database SQL di Azure con accesso in lettura/scrittura al database.

Nota

Per gli ambienti di produzione, è consigliabile impostare su hive.metastore.schema.verification true. Ciò impedisce al client metastore Hive di modificare in modo implicito lo schema del database metastore quando la versione del client metastore non corrisponde alla versione del database metastore. Quando si abilita questa impostazione per le versioni client del metastore inferiori a Hive 1.2.0, assicurarsi che il client metastore disponga dell'autorizzazione di scrittura per il database metastore (per evitare il problema descritto in HIVE-9749).

  • Per il metastore Hive 1.2.0 e versioni successive, impostare su hive.metastore.schema.verification.record.version true per abilitare hive.metastore.schema.verification.
  • Per il metastore Hive 2.1.1 e versioni successive, impostare su come è impostato su hive.metastore.schema.verification.record.version true false per impostazione predefinita.

Configurare un metastore esterno usando l'interfaccia utente

Per configurare un metastore esterno usando l'interfaccia utente di Azure Databricks:

  1. Fare clic sul pulsante Cluster sulla barra laterale.

  2. Fare clic su Create cluster (Crea cluster).

  3. Immettere le opzioni di configurazione di Spark seguenti:

    # 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. Continuare la configurazione del cluster seguendo le istruzioni riportate in Informazioni di riferimento sulla configurazione di calcolo.

  5. Fare clic su Crea cluster per creare il cluster.

Configurare un metastore esterno usando uno script init

Gli script Init consentono di connettersi a un metastore Hive esistente senza impostare manualmente le configurazioni necessarie.

  1. Creare la directory di base in cui archiviare lo script init, se non esiste. Nell'esempio seguente viene utilizzato dbfs:/databricks/scripts:
  2. Eseguire il frammento di codice seguente in un notebook. Il frammento di codice crea lo script /databricks/scripts/external-metastore.sh init in Databricks File System (DBFS). In alternativa, è possibile usare l'operazione put dell'API REST DBFS per creare lo script init. Questo script init scrive le opzioni di configurazione necessarie in un file di configurazione denominato 00-custom-spark.conf in un formato /databricks/driver/conf/ simile a JSON all'interno di ogni nodo del cluster, ogni volta che un cluster con il nome specificato viene <cluster-name> avviato. Azure Databricks fornisce configurazioni Spark predefinite nel /databricks/driver/conf/spark-branch.conf file. I file di configurazione nella /databricks/driver/conf directory si applicano in ordine alfabetico inverso. Se si desidera modificare il nome del 00-custom-spark.conf file, assicurarsi che continui a essere applicato prima del spark-branch.conf file.

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. Configurare il cluster con lo script init.
  2. Riavviare il cluster.

Risoluzione dei problemi

I cluster non si avviano (a causa di impostazioni di script init non corrette)

Se uno script init per la configurazione del metastore esterno causa l'esito negativo della creazione del cluster, configurare lo script init per registrare ed eseguire il debug dello script init usando i log.

Errore nell'istruzione SQL: InvocationTargetException

  • Modello di messaggio di errore nella traccia completa dello stack di eccezioni:

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

    Le informazioni di connessione JDBC del metastore esterno non sono configurate correttamente. Verificare il nome host, la porta, il nome utente, la password e il nome della classe del driver JDBC configurati. Assicurarsi inoltre che il nome utente abbia il privilegio di accedere al database del metastore.

  • Modello di messaggio di errore nella traccia completa dello stack di eccezioni:

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

    Database metastore esterno non inizializzato correttamente. Verificare di aver creato il database del metastore e di inserire il nome del database corretto nel stringa di connessione JDBC. Successivamente, avviare un nuovo cluster con le due opzioni di configurazione spark seguenti:

    datanucleus.schema.autoCreateTables true
    datanucleus.fixedDatastore false
    

    In questo modo, la libreria client di Hive cercherà di creare e inizializzare automaticamente le tabelle nel database del metastore quando cercherà di accedervi ma le troverà assenti.

Errore nell'istruzione SQL: AnalysisException: Impossibile creare un'istanza di org.apache.hadoop.hive.metastore.HiveMetastoreClient

Messaggio di errore nello stacktrace di eccezioni completo:

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

Il cluster è configurato per l'uso di un driver JDBC non corretto.

L'impostazione di datanucleus.autoCreateSchema su true non funziona come previsto

Per impostazione predefinita, Databricks imposta anche su datanucleus.fixedDatastore true, che impedisce modifiche strutturali accidentali ai database del metastore. Pertanto, la libreria client Hive non può creare tabelle metastore anche se è impostato su datanucleus.autoCreateSchema true. Questa strategia è, in generale, più sicura per gli ambienti di produzione perché impedisce l'aggiornamento accidentale del database del metastore.

Se si vuole usare datanucleus.autoCreateSchema per inizializzare il database del metastore, assicurarsi di impostare su datanucleus.fixedDatastore false. È anche possibile capovolgere entrambi i flag dopo aver inizializzato il database del metastore per garantire una migliore protezione all'ambiente di produzione.