Dela via


Externt Apache Hive-metaarkiv (äldre)

Viktigt!

Den här dokumentationen har dragits tillbaka och kanske inte uppdateras.

Kommentar

Att använda externa metastores är en traditionell 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?.

Den här artikeln beskriver hur du set upp Azure Databricks-kluster för att ansluta till befintliga externa Apache Hive-metastores. 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 om skiftlägeskänslighet finns i Identifier.

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>

where

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

Klusterkonfigurationer

Du måste set 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

Set spark.sql.hive.metastore.version för versionen av ditt Hive metastore och spark.sql.hive.metastore.jars enligt följande:

  • Hive 0.13: inte setspark.sql.hive.metastore.jars.

    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): setspark.sql.hive.metastore.jars till builtin.

  • För alla andra Hive-versioner rekommenderar Azure Databricks att du laddar ned metaarkivets JAR:er och set konfigurationen spark.sql.hive.metastore.jars att peka 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.jarsset till maven och spark.sql.hive.metastore.version för att matcha versionen av ditt metadatalager.

  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. Set spark.sql.hive.metastore.jars för att använda den här katalogen. Om ditt init-skript kopierar /dbfs/hive_metastore_jar till /databricks/hive_metastore_jars/och setochspark.sql.hive.metastore.jars till /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 set 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

where

  • <mssql-connection-string> är JDBC-anslutningssträngen (som du kan get i Azure-portalen). Du behöver inte inkludera användarnamn och lösenord i anslutningssträngen eftersom dessa kommer att vara set 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 sethive.metastore.schema.verificationtrue. Detta förhindrar att Hive-metaarkivklienten implicit ändrar metaarkivdatabasen schema 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, sethive.metastore.schema.verification.record.version till true för att aktivera hive.metastore.schema.verification.
  • För Hive-metaarkivet 2.1.1 och senare, sethive.metastore.schema.verification.record.version till true eftersom det är set till false som standard.

Set sätt upp en extern metadatabutik med hjälp av användargränssnittet

Så här set du upp 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.

Set upp 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 även 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 tables 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 metastore tables även om du setdatanucleus.autoCreateSchema att 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 setdatanucleus.fixedDatastore för att 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ö.