Externe Apache Hive-metastore (verouderd)

In dit artikel wordt beschreven hoe u Azure Databricks-clusters instelt om verbinding te maken met bestaande externe Apache Hive-metastores. Het bevat informatie over aanbevolen configuratievereisten voor metastore en clusterconfiguratie, gevolgd door instructies voor het configureren van clusters om verbinding te maken met een externe metastore. Zie de relevante releaseopmerkingen van de Databricks Runtime-versie voor Hive-bibliotheekversies die zijn opgenomen in Databricks Runtime.

Belangrijk

  • Hoewel SQL Server werkt als de onderliggende metastore-database voor Hive 2.0 en hoger, maken de voorbeelden in dit artikel gebruik van Azure SQL Database.
  • Zie Externe metagegevensarchieven gebruiken in Azure HDInsight voor meer informatie over hive-metastorecompatibiliteit met HDInsight.
  • Als u Azure Database for MySQL als een externe metastore gebruikt, moet u de waarde van de lower_case_table_names eigenschap wijzigen van 1 (de standaardinstelling) in 2 in de databaseconfiguratie aan de serverzijde. Zie Gevoeligheid voor id-hoofdletters voor meer informatie.

Notitie

Het gebruik van externe metastores is een verouderd gegevensbeheermodel. Databricks raadt u aan om een upgrade uit te voeren naar Unity Catalog. Unity Catalog vereenvoudigt de beveiliging en governance van uw gegevens door een centrale plaats te bieden voor het beheren en controleren van toegang tot gegevens in meerdere werkruimten in uw account. Zie Wat is Unity Catalog?

Installatie van Hive-metastore

De metastore-client die in een cluster wordt uitgevoerd, maakt rechtstreeks verbinding met uw onderliggende metastore-database met behulp van JDBC.

Als u de netwerkverbinding van een cluster naar de metastore wilt testen, kunt u de volgende opdracht uitvoeren in een notebook:

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

waar

  • <DNS name> is de servernaam van Azure SQL Database.
  • <port> is de poort van de database.

Clusterconfiguraties

U moet twee sets configuratieopties instellen om een cluster te verbinden met een externe metastore:

  • Spark-opties configureren Spark met de Hive-metastoreversie en de JAR's voor de metastore-client.
  • Hive-opties configureren de metastore-client om verbinding te maken met de externe metastore.

Spark-configuratieopties

Stel spark.sql.hive.metastore.version deze in op de versie van uw Hive-metastore en spark.sql.hive.metastore.jars ga als volgt te werk:

  • Hive 0.13: niet ingesteld spark.sql.hive.metastore.jars.

    Notitie

    Hive 1.2.0 en 1.2.1 zijn niet de ingebouwde metastore op Databricks Runtime 7.0 en hoger. Als u Hive 1.2.0 of 1.2.1 wilt gebruiken met Databricks Runtime 7.0 en hoger, volgt u de procedure die wordt beschreven in De metastore-JAR's downloaden en wijst u deze aan.

  • Hive 2.3.7 (Databricks Runtime 7.0 - 9.x) of Hive 2.3.9 (Databricks Runtime 10.0 en hoger): ingesteld op spark.sql.hive.metastore.jarsbuiltin.

  • Voor alle andere Hive-versies raadt Azure Databricks u aan de metastore-JAR's te downloaden en de configuratie spark.sql.hive.metastore.jars zo in te stellen dat deze verwijst naar de gedownloade JAR's met behulp van de procedure die wordt beschreven in De metastore-JAR's downloaden en ernaar verwijzen.

Download de metastore-JAR's en wijs ze aan

  1. Maak een cluster met de set en spark.sql.hive.metastore.versionmaven die overeenkomt met spark.sql.hive.metastore.jars de versie van uw metastore.

  2. Wanneer het cluster wordt uitgevoerd, zoekt u in het stuurprogrammalogboek en zoekt u een regel zoals hieronder:

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

    De map <path> is de locatie van gedownloade JAR's in het stuurprogrammaknooppunt van het cluster.

    U kunt ook de volgende code uitvoeren in een Scala-notebook om de locatie van de JAR's af te drukken:

    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. Voer %sh cp -r <path> /dbfs/hive_metastore_jar deze map uit (vervang deze <path> door de gegevens van uw cluster) om deze map te kopiëren naar een map in de DBFS-hoofdmap die via de DBFS-client in het stuurprogrammaknooppunt wordt aangeroepen hive_metastore_jar .

  4. Maak een init-script dat naar het lokale bestandssysteem van het knooppunt kopieert /dbfs/hive_metastore_jar , en zorg ervoor dat het init-script enkele seconden in de slaapstand blijft voordat deze toegang krijgt tot de DBFS-client. Dit zorgt ervoor dat de client gereed is.

  5. Stel spark.sql.hive.metastore.jars in op het gebruik van deze map. Als uw init-script /dbfs/hive_metastore_jar naar /databricks/hive_metastore_jars/ wordt gekopieerd, stelt u spark.sql.hive.metastore.jars in op /databricks/hive_metastore_jars/*. De locatie moet de volgtekens /* bevatten.

  6. Start het cluster opnieuw op.

Hive-configuratieopties

In deze sectie worden opties beschreven die specifiek zijn voor Hive.

Als u verbinding wilt maken met een externe metastore met behulp van de lokale modus, stelt u de volgende Hive-configuratieopties in:

# 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

waar

  • <mssql-connection-string>is de JDBC-verbindingsreeks (die u kunt ophalen in Azure Portal). U hoeft geen gebruikersnaam en wachtwoord op te nemen in de verbindingsreeks, omdat deze worden ingesteld door javax.jdo.option.ConnectionUserName en javax.jdo.option.ConnectionDriverName.
  • <mssql-username> en <mssql-password> geef de gebruikersnaam en het wachtwoord op van uw Azure SQL Database-account met lees-/schrijftoegang tot de database.

Notitie

Voor productieomgevingen wordt u aangeraden deze in te truestellen hive.metastore.schema.verification op . Hierdoor voorkomt u dat de Hive-metastore-client impliciet het metastore-databaseschema wijzigt wanneer de metastore-clientversie niet overeenkomt met de versie van de metastore-database. Wanneer u deze instelling inschakelt voor metastore-clientversies lager dan Hive 1.2.0, moet u ervoor zorgen dat de metastore-client over de schrijfmachtiging voor de metastore-database beschikt (om het probleem te voorkomen dat wordt beschreven in HIVE-9749).

  • Voor Hive-metastore 1.2.0 en hoger moet hive.metastore.schema.verification.record.version u dit true inschakelen hive.metastore.schema.verification.
  • Voor Hive-metastore 2.1.1 en hoger, ingesteld hive.metastore.schema.verification.record.version op true de standaardinstelling false .

Een externe metastore instellen met behulp van de gebruikersinterface

Een externe metastore instellen met behulp van de Gebruikersinterface van Azure Databricks:

  1. Klik op de knop Clusters op de zijbalk.

  2. Klik op Cluster maken.

  3. Voer de volgende Spark-configuratieopties in:

    # 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. Ga door met de clusterconfiguratie en volg de instructies in de referentie voor compute-configuratie.

  5. Klik op Cluster maken om het cluster te maken.

Een externe metastore instellen met behulp van een init-script

Met Init-scripts kunt u verbinding maken met een bestaande Hive-metastore zonder handmatig vereiste configuraties in te stellen.

  1. Maak de basismap waarin u het init-script wilt opslaan als het niet bestaat. In het volgende voorbeeld wordt gebruikgemaakt van dbfs:/databricks/scripts.
  2. Voer het volgende codefragment uit in een notebook. Het fragment maakt het init-script /databricks/scripts/external-metastore.sh in Databricks File System (DBFS). U kunt ook de putbewerking van de DBFS REST API gebruiken om het init-script te maken. Dit init-script schrijft vereiste configuratieopties naar een configuratiebestand met de naam 00-custom-spark.conf in een JSON-achtige indeling binnen /databricks/driver/conf/ elk knooppunt van het cluster, wanneer een cluster met de naam die is opgegeven als <cluster-name> begint. Azure Databricks biedt standaard Spark-configuraties in het /databricks/driver/conf/spark-branch.conf bestand. Configuratiebestanden in de /databricks/driver/conf map zijn van toepassing in omgekeerde alfabetische volgorde. Als u de naam van het 00-custom-spark.conf bestand wilt wijzigen, moet u ervoor zorgen dat het bestand van toepassing blijft vóór het spark-branch.conf bestand.

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. Configureer uw cluster met het init-script.
  2. Start het cluster opnieuw op.

Probleemoplossing

Clusters worden niet gestart (vanwege onjuiste init-scriptinstellingen)

Als een init-script voor het instellen van de externe metastore ervoor zorgt dat het maken van clusters mislukt, configureert u het init-script om te registreren en fouten in het init-script op te sporen met behulp van de logboeken.

Fout in SQL-instructie: InvocationTargetException

  • Foutberichtpatroon in de volledige tracering van de uitzonderingsstack:

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

    Externe metastore JDBC-verbindingsgegevens zijn onjuist geconfigureerd. Controleer de geconfigureerde hostnaam, poort, gebruikersnaam, wachtwoord en JDBC-stuurprogrammaklassenaam. Zorg er ook voor dat de gebruikersnaam de juiste bevoegdheid heeft voor toegang tot de metastore-database.

  • Foutberichtpatroon in de volledige tracering van de uitzonderingsstack:

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

    Externe metastore-database is niet juist geïnitialiseerd. Controleer of u de metastore-database hebt gemaakt en plaats de juiste databasenaam in de JDBC-verbindingsreeks. Start vervolgens een nieuw cluster met de volgende twee Spark-configuratieopties:

    datanucleus.schema.autoCreateTables true
    datanucleus.fixedDatastore false
    

    Op deze manier probeert de Hive-clientbibliotheek automatisch tabellen te maken en te initialiseren in de metastore-database wanneer wordt geprobeerd om ze te openen, maar vindt ze afwezig.

Fout in SQL-instructie: AnalysisException: Kan org.apache.hadoop.hive.metastore.HiveMetastoreClient niet instantiëren

Foutbericht in de volledige uitzonderingsstacktrace:

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

Het cluster is geconfigureerd voor het gebruik van een onjuist JDBC-stuurprogramma.

Het instellen van datanucleus.autoCreateSchema op true werkt niet zoals verwacht

Databricks wordt standaard ook ingesteld datanucleus.fixedDatastoretrueop , waardoor onbedoelde structurele wijzigingen in de metastore-databases worden voorkomen. Daarom kan de Hive-clientbibliotheek geen metastore-tabellen maken, zelfs niet als u instelt op datanucleus.autoCreateSchematrue. Deze strategie is over het algemeen veiliger voor productieomgevingen, omdat hiermee wordt voorkomen dat de metastore-database per ongeluk wordt bijgewerkt.

Als u wilt gebruiken datanucleus.autoCreateSchema om de metastore-database te initialiseren, moet u deze instellen datanucleus.fixedDatastorefalseop . U kunt ook beide vlaggen spiegelen nadat u de metastore-database hebt geïnitialiseerd om uw productieomgeving beter te beveiligen.