Externt Apache Hive-metaarkiv (äldre)

Den här artikeln beskriver hur du konfigurerar Azure Databricks-kluster för att ansluta till befintliga externa Apache Hive-metaarkiv. Den innehåller information om rekommenderade konfigurationskrav för metaarkiv och klusterkonfiguration, följt av instruktioner för att konfigurera kluster för att ansluta till ett externt metaarkiv. Information om Hive-biblioteksversioner som ingår i Databricks Runtime finns i relevanta viktig information om Databricks Runtime-versionen.

Viktigt!

  • Sql Server fungerar som den underliggande metaarkivdatabasen för Hive 2.0 och senare, men exemplen i den här artikeln använder Azure SQL Database.
  • Information om Hive-metaarkivkompatibilitet med HDInsight finns i Använda externa metadatalager i Azure HDInsight.
  • Om du använder Azure Database for MySQL som ett externt metaarkiv måste du ändra värdet lower_case_table_names för egenskapen från 1 (standard) till 2 i databaskonfigurationen på serversidan. Mer information finns i Känslighet för identifierarfall.

Kommentar

Att använda externa metaarkiv är en äldre datastyrningsmodell. Databricks rekommenderar att du uppgraderar till Unity Catalog. Unity Catalog förenklar säkerheten och styrningen av dina data genom att tillhandahålla en central plats för att administrera och granska dataåtkomst över flera arbetsytor i ditt konto. Se Vad är Unity Catalog?.

Konfiguration av Hive-metaarkiv

Metaarkivklienten som körs i ett kluster ansluter till din underliggande metaarkivdatabas direkt med JDBC.

Om du vill testa nätverksanslutningen från ett kluster till metaarkivet kan du köra följande kommando i en notebook-fil:

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

där

  • <DNS name> är servernamnet för Azure SQL Database.
  • <port> är databasens port.

Klusterkonfigurationer

Du måste ange två uppsättningar konfigurationsalternativ för att ansluta ett kluster till ett externt metaarkiv:

  • Spark-alternativ konfigurerar Spark med Hive-metaarkivversionen och JAR:erna för metaarkivklienten.
  • Hive-alternativ konfigurerar metaarkivklienten för att ansluta till det externa metaarkivet.

Konfigurationsalternativ för Spark

Ange spark.sql.hive.metastore.version till versionen av hive-metaarkivet och spark.sql.hive.metastore.jars på följande sätt:

  • Hive 0.13: ange spark.sql.hive.metastore.jarsinte .

    Kommentar

    Hive 1.2.0 och 1.2.1 är inte det inbyggda metaarkivet på Databricks Runtime 7.0 och senare. Om du vill använda Hive 1.2.0 eller 1.2.1 med Databricks Runtime 7.0 och senare följer du proceduren som beskrivs i Ladda ned metaarkivburkarna och peka på dem.

  • Hive 2.3.7 (Databricks Runtime 7.0– 9.x) eller Hive 2.3.9 (Databricks Runtime 10.0 och senare): inställt spark.sql.hive.metastore.jarsbuiltin.

  • För alla andra Hive-versioner rekommenderar Azure Databricks att du laddar ned metaarkivets JAR:er och ställer in konfigurationen spark.sql.hive.metastore.jars så att den pekar på de nedladdade JAR:erna med hjälp av proceduren som beskrivs i Ladda ned metaarkivburkarna och peka på dem.

Ladda ned metaarkivsburkarna och peka på dem

  1. Skapa ett kluster med spark.sql.hive.metastore.jars inställt på maven och spark.sql.hive.metastore.version för att matcha versionen av metaarkivet.

  2. När klustret körs söker du i drivrutinsloggen och hittar en rad som liknar följande:

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

    Katalogen <path> är platsen för nedladdade JAR:er i drivrutinsnoden i klustret.

    Du kan också köra följande kod i en Scala-anteckningsbok för att skriva ut platsen för JAR:erna:

    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. Kör %sh cp -r <path> /dbfs/hive_metastore_jar (ersätt <path> med klustrets information) för att kopiera den här katalogen till en katalog i DBFS-roten som anropas hive_metastore_jar via DBFS-klienten i drivrutinsnoden.

  4. Skapa ett init-skript som kopierar till nodens /dbfs/hive_metastore_jar lokala filsystem och se till att init-skriptet viloläge några sekunder innan det kommer åt DBFS-klienten. Detta säkerställer att klienten är klar.

  5. Ange att spark.sql.hive.metastore.jars ska använda den här katalogen. Om ditt init-skript kopierar /dbfs/hive_metastore_jar till /databricks/hive_metastore_jars/ anger du spark.sql.hive.metastore.jars som /databricks/hive_metastore_jars/*. Platsen måste innehålla det avslutande /*.

  6. Starta om klustret.

Konfigurationsalternativ för Hive

I det här avsnittet beskrivs alternativ som är specifika för Hive.

Om du vill ansluta till ett externt metaarkiv med lokalt läge anger du följande Konfigurationsalternativ för Hive:

# 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

där

  • <mssql-connection-string>är JDBC-anslutningssträng (som du kan få i Azure-portalen). Du behöver inte inkludera användarnamn och lösenord i anslutningssträng eftersom dessa anges av javax.jdo.option.ConnectionUserName och javax.jdo.option.ConnectionDriverName.
  • <mssql-username> och <mssql-password> ange användarnamnet och lösenordet för ditt Azure SQL Database-konto som har läs- och skrivåtkomst till databasen.

Kommentar

För produktionsmiljöer rekommenderar vi att du anger hive.metastore.schema.verification till true. Detta förhindrar att Hive-metaarkivklienten implicit ändrar metaarkivdatabasschemat när metaarkivklientversionen inte matchar metaarkivdatabasversionen. När du aktiverar den här inställningen för metaarkivklientversioner som är lägre än Hive 1.2.0 kontrollerar du att metaarkivklienten har skrivbehörighet till metaarkivdatabasen (för att förhindra problemet som beskrivs i HIVE-9749).

  • För Hive-metaarkivet 1.2.0 och senare anger du hive.metastore.schema.verification.record.version till true aktivera hive.metastore.schema.verification.
  • För Hive-metaarkivet 2.1.1 och senare anger du hive.metastore.schema.verification.record.version till truefalse som standard.

Konfigurera ett externt metaarkiv med hjälp av användargränssnittet

Så här konfigurerar du ett externt metaarkiv med hjälp av Azure Databricks-användargränssnittet:

  1. Klicka på knappen Kluster i sidofältet.

  2. Klicka på Skapa kluster.

  3. Ange följande Konfigurationsalternativ för Spark:

    # 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. Fortsätt konfigurationen av klustret genom att följa anvisningarna i referensen för beräkningskonfiguration.

  5. Klicka på Skapa kluster för att skapa klustret.

Konfigurera ett externt metaarkiv med hjälp av ett init-skript

Med Init-skript kan du ansluta till ett befintligt Hive-metaarkiv utan att manuellt ange nödvändiga konfigurationer.

  1. Skapa den baskatalog som du vill lagra init-skriptet i om det inte finns. I följande exempel används dbfs:/databricks/scripts.
  2. Kör följande kodfragment i en notebook-fil. Kodfragmentet skapar init-skriptet /databricks/scripts/external-metastore.sh i Databricks File System (DBFS). Du kan också använda DBFS REST API:ets put-åtgärd för att skapa init-skriptet. Det här init-skriptet skriver nödvändiga konfigurationsalternativ till en konfigurationsfil med namnet 00-custom-spark.conf i ett JSON-liknande format under /databricks/driver/conf/ varje nod i klustret, när ett kluster med det namn som anges som <cluster-name> startar. Azure Databricks tillhandahåller standardkonfigurationer för Spark i /databricks/driver/conf/spark-branch.conf filen. Konfigurationsfiler i /databricks/driver/conf katalogen gäller i omvänd alfabetisk ordning. Om du vill ändra namnet på filen kontrollerar du att den 00-custom-spark.conf fortsätter att gälla före spark-branch.conf filen.

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. Konfigurera klustret med init-skriptet.
  2. Starta om klustret.

Felsökning

Kluster startar inte (på grund av felaktiga init-skriptinställningar)

Om ett init-skript för att konfigurera det externa metaarkivet gör att klusterskapandet misslyckas konfigurerar du init-skriptet för att logga och felsöker init-skriptet med hjälp av loggarna.

Fel i SQL-instruktion: InvocationTargetException

  • Felmeddelandemönster i den fullständiga undantagsstackspårningen:

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

    JDBC-anslutningsinformation för externt metaarkiv är felkonfigurerad. Kontrollera det konfigurerade värdnamnet, porten, användarnamnet, lösenordet och JDBC-drivrutinsklassnamnet. Kontrollera också att användarnamnet har rätt behörighet att komma åt metaarkivdatabasen.

  • Felmeddelandemönster i den fullständiga undantagsstackspårningen:

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

    Den externa metaarkivdatabasen har inte initierats korrekt. Kontrollera att du har skapat metaarkivdatabasen och placera rätt databasnamn i JDBC-anslutningssträng. Starta sedan ett nytt kluster med följande två Spark-konfigurationsalternativ:

    datanucleus.schema.autoCreateTables true
    datanucleus.fixedDatastore false
    

    På så sätt försöker Hive-klientbiblioteket skapa och initiera tabeller i metaarkivdatabasen automatiskt när det försöker komma åt dem men hittar dem frånvarande.

Fel i SQL-instruktion: AnalysisException: Det går inte att instansiera org.apache.hadoop.hive.metastore.HiveMetastoreClient

Felmeddelande i den fullständiga undantagsstacken:

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

Klustret är konfigurerat för att använda en felaktig JDBC-drivrutin.

Att ange datanucleus.autoCreateSchema till true fungerar inte som förväntat

Som standard anger datanucleus.fixedDatastore Databricks också till true, vilket förhindrar oavsiktliga strukturella ändringar i metaarkivdatabaserna. Hive-klientbiblioteket kan därför inte skapa metaarkivtabeller även om du har angett datanucleus.autoCreateSchema till true. Den här strategin är i allmänhet säkrare för produktionsmiljöer eftersom den förhindrar att metaarkivdatabasen av misstag uppgraderas.

Om du vill använda datanucleus.autoCreateSchema för att initiera metaarkivdatabasen kontrollerar du att du har angett datanucleus.fixedDatastore till false. Du kanske också vill vända båda flaggorna när du har initierat metaarkivdatabasen för att ge bättre skydd för din produktionsmiljö.