Externe Apache Hive metastore

In dit artikel wordt beschreven hoe u Azure Databricks instellen om verbinding te maken met bestaande externe Apache Hive metastores. Het bevat informatie over aanbevolen configuratievereisten voor metastores en clusterconfiguratie, gevolgd door instructies voor het configureren van clusters om verbinding te maken met een externe metastore. De volgende tabel geeft een overzicht van de Hive-metastoreversies die worden ondersteund in elke versie van Databricks Runtime.

Databricks Runtime versie 0.13 - 1.2.1 2.1 2.2 2.3 3.1.0
7.x Ja Ja Ja Ja Ja
6.x Ja Ja Ja Ja Ja
5.3 en hoger Ja Ja Ja Ja Ja
5.1 - 5.2 en 4.x Ja Ja Ja Ja Nee
3.x Ja Ja Nee Nee Nee

Belangrijk

  • SQL Server werkt niet als de onderliggende metastore-database voor Hive 2.0 en hoger; De Azure SQL Database werkt echter wel en wordt gebruikt als voorbeeld in dit artikel.
  • U kunt een Hive 1.2.0- of 1.2.1-metastore van een HDInsight-cluster gebruiken als externe metastore. Zie Use external metadata stores in Azure HDInsight.
  • Als u Azure Database for MySQL als een externe metastore gebruikt, moet u de waarde van de eigenschap wijzigen van lower_case_table_names 1 (de standaardinstelling) in 2 in de databaseconfiguratie aan de serverzijde. Zie Gevoeligheid id-case voor meer informatie.

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

Configuratieopties voor Spark

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

  • Hive 0.13: stel niet spark.sql.hive.metastore.jars in.

  • Hive 1.2.0 of 1.2.1 (Databricks Runtime 6.6 en lager): stel in spark.sql.hive.metastore.jars op builtin .

    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 met Databricks Runtime 7.0 en hoger wilt gebruiken, volgt u de procedure die wordt beschreven in De metastore-jarsdownloaden en wijs deze aan.

  • Hive 2.3.7 (Databricks Runtime 7.0 en hoger): ingesteld spark.sql.hive.metastore.jars op builtin .

  • Voor alle andere Hive-versies raadt Azure Databricks u aan de metastore-JAR's te downloaden en de configuratie in te stellen op de gedownloade JAR's met behulp van de procedure die wordt beschreven in De spark.sql.hive.metastore.jarsspark.sql.hive.metastore.jarsdownloaden en naar de jar-bestanden wijzen.

De metastore-jars downloaden en hier naar wijzen

  1. Maak een cluster met spark.sql.hive.metastore.jars ingesteld op en om overeen te komen met de versie van uw mavenspark.sql.hive.metastore.version metastore.

  2. Wanneer het cluster wordt uitgevoerd, zoekt u het logboek van het stuurprogramma en zoekt u een regel zoals de volgende:

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

  4. Maak een init-script dat naar het lokale bestandssysteem van het knooppunt kopieert. Zorg ervoor dat het init-script een paar seconden in de slaapstand wordt lapt voordat het de DBFS FUSE-client gebruikt. 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 wordt /dbfs/hive_metastore_jar gekopieerd naar , stelt u in op /databricks/hive_metastore_jars/spark.sql.hive.metastore.jars/databricks/hive_metastore_jars/* . De locatie moet de volgtekens /* bevatten.

  6. Start het cluster opnieuw op.

Configuratieopties voor Hive

In deze sectie worden de 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-connection string (die u kunt krijgen in de Azure Portal). U hoeft geen gebruikersnaam en wachtwoord op te nemen in de connection string, 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 Azure SQL Database account met lees-/schrijftoegang tot de database.

Notitie

Voor productieomgevingen wordt u aangeraden in te hive.metastore.schema.verification stellen op true . Dit voorkomt dat de Hive-metastore-client impliciet het metastore-databaseschema wijzigt wanneer de versie van de metastore-client niet overeen komt met de metastore-databaseversie. Wanneer u deze instelling inschakelen voor metastore-clientversies lager dan Hive 1.2.0, moet u ervoor zorgen dat de metastore-client de schrijfmachtiging heeft voor de metastore-database (om het probleem te voorkomen dat wordt beschreven in HIVE-9749).

  • Voor Hive-metastore 1.2.0 en hoger stelt u in hive.metastore.schema.verification.record.version op om in te truehive.metastore.schema.verification stellen.
  • Stel voor Hive-metastore 2.1.1 en hoger in op hive.metastore.schema.verification.record.version omdat deze standaard is ingesteld op truefalse .

Een externe metastore instellen met behulp van de gebruikersinterface

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

  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 door de instructies in Clusters configureren te volgen.

  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 deze niet bestaat. In het volgende voorbeeld wordt dbfs:/databricks/scripts gebruikt.
  2. Voer het volgende codefragment uit in een notebook. Het codefragment maakt het init-script /databricks/scripts/external-metastore.sh in /databricks/scripts/external-metastore.sh U kunt ook de DBFS-bewerking van REST API gebruiken om het init-script te maken. Dit init-script schrijft vereiste configuratieopties naar een configuratiebestand met de naam in een JSON-achtige indeling onder in elk knooppunt van het cluster, wanneer een cluster met de naam begint die is 00-custom-spark.conf/databricks/driver/conf/ opgegeven als wordt <cluster-name> gestart. Azure Databricks bevat standaard Spark-configuraties in het /databricks/driver/conf/spark-branch.conf bestand. Configuratiebestanden in de /databricks/driver/conf map worden in omgekeerde alfabetische volgorde toegepast. Als u de naam van het bestand wilt wijzigen, moet u ervoor zorgen dat het bestand vóór 00-custom-spark.conf het bestand van toepassing spark-branch.conf blijft.

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.

Problemen oplossen

Clusters worden niet start (vanwege onjuiste init-scriptinstellingen)

Als een init-script voor het instellen van de externe metastore een fout veroorzaakt bij het maken van het cluster, configureert u het init-script om het init-script te loggen en fouten op te sporen in het init-script met behulp van de logboeken.

Fout in SQL-instructie: InvocationTargetException

  • Foutberichtpatroon in de volledige uitzonderingsstack-trace:

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

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

  • Foutberichtpatroon in de volledige uitzonderingsstack-trace:

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

    Externe metastore-database is niet goed initialiseerd. Controleer of u de metastore-database hebt gemaakt en de juiste databasenaam hebt opgeslagen in de JDBC-connection string. Start vervolgens een nieuw cluster met de volgende twee Spark-configuratieopties:

    datanucleus.autoCreateSchema true
    datanucleus.fixedDatastore false
    

    Op deze manier probeert de Hive-clientbibliotheek automatisch tabellen in de metastore-database te maken en te initialiseren wanneer deze wordt geprobeerd te openen, maar deze niet worden gevonden.

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

Foutbericht in de volledige uitzonderingstacktrace:

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 stelt standaard ook in op , waardoor onbedoelde structurele wijzigingen in de datanucleus.fixedDatastoretrue metastore-databases worden voorkomen. Daarom kan de Hive-clientbibliotheek geen metastore-tabellen maken, zelfs niet als u hebt datanucleus.autoCreateSchema ingesteld op true . 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 om de datanucleus.autoCreateSchema metastore-database te initialiseren, moet u instellen datanucleus.fixedDatastore op false . U kunt ook beide vlaggen spiegelen na het initialiseren van de metastore-database om uw productieomgeving beter te beschermen.