Külső Apache Hive metaadattár (örökölt)

Ez a cikk azt ismerteti, hogyan állíthat be Azure Databricks-fürtöket a meglévő külső Apache Hive-metaadattárakhoz való csatlakozáshoz. Információt nyújt a metaadattár ajánlott beállítási és fürtkonfigurációs követelményeiről, majd útmutatást ad a fürtök külső metaadattárhoz való csatlakozásra való konfigurálásához. A Databricks Runtime-ban található Hive-kódtár-verziókért tekintse meg a Databricks Runtime-verzió kibocsátási megjegyzéseit.

Fontos

  • Bár az SQL Server a Hive 2.0-s és újabb verziók alapjául szolgáló metaadattár-adatbázisként működik, a jelen cikkben szereplő példák az Azure SQL Database-t használják.
  • A Hive-metaadattár HDInsighttal való kompatibilitásával kapcsolatos információkért lásd : Külső metaadattárak használata az Azure HDInsightban.
  • Ha az Azure Database for MySQL-t külső metaadattárként használja, a tulajdonság értékét a kiszolgálóoldali lower_case_table_names adatbázis konfigurációjában 1-ről (alapértelmezett) 2-re kell módosítania. További részletekért lásd : Azonosító kis- és nagybetűk érzékenysége.

Feljegyzés

A külső metaadattárak használata örökölt adatszabályozási modell. A Databricks azt javasolja, hogy frissítsen a Unity Catalogra. A Unity Catalog leegyszerűsíti az adatok biztonságát és szabályozását azáltal, hogy központi helyet biztosít az adatokhoz való hozzáférés felügyeletéhez és naplózásához a fiók több munkaterületén. Lásd : Mi az a Unity Katalógus?.

Hive metaadattár beállítása

A fürtben futó metaadattár-ügyfél közvetlenül a JDBC használatával csatlakozik a mögöttes metaadattár-adatbázishoz.

A fürt és a metaadattár közötti hálózati kapcsolat teszteléséhez futtassa a következő parancsot egy jegyzetfüzetben:

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

ebben:

  • <DNS name> az Azure SQL Database kiszolgálóneve.
  • <port> az adatbázis portja.

Fürtkonfigurációk

A fürtök külső metaadattárhoz való csatlakoztatásához két konfigurációs beállítást kell megadnia:

  • A Spark beállításai konfigurálják a Sparkot a Hive metaadattár verziójával és a metaadattár-ügyfélhez tartozó JAR-ekkel.
  • A Hive beállításai konfigurálják a metaadattár-ügyfelet a külső metaadattárhoz való csatlakozáshoz.

Spark-konfigurációs beállítások

Állítsa be spark.sql.hive.metastore.version a Hive-metaadattár verzióját az spark.sql.hive.metastore.jars alábbiak szerint:

  • Hive 0.13: nincs beállítva spark.sql.hive.metastore.jars.

    Feljegyzés

    A Hive 1.2.0 és az 1.2.1 nem a Databricks Runtime 7.0-s és újabb verziók beépített metaadattára. Ha a Hive 1.2.0-s vagy 1.2.1-et a Databricks Runtime 7.0-s vagy újabb verziójával szeretné használni, kövesse a metaadattár jarok letöltésében leírt eljárást, és mutasson rájuk.

  • Hive 2.3.7 (Databricks Runtime 7.0 - 9.x) vagy Hive 2.3.9 (Databricks Runtime 10.0 vagy újabb): beállítva spark.sql.hive.metastore.jarsbuiltin.

  • Az összes többi Hive-verzió esetében az Azure Databricks azt javasolja, hogy töltse le a metaadattár JARs-eit, és állítsa be a konfigurációt spark.sql.hive.metastore.jars úgy, hogy a letöltött JAR-re mutasson a metaadattár jars letöltésében leírt eljárással, és mutasson rájuk.

Töltse le a metaadattár jarjait, és mutasson rájuk

  1. Hozzon létre egy fürtöt a metaadattár verziójának maven megfelelő beállítással és spark.sql.hive.metastore.version beállítássalspark.sql.hive.metastore.jars.

  2. Amikor a fürt fut, keressen rá az illesztőprogram-naplóban, és keressen egy olyan sort, mint a következő:

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

    A könyvtár <path> a letöltött JAR-k helye a fürt illesztőprogram-csomópontjában.

    Másik lehetőségként futtathatja a következő kódot egy Scala-jegyzetfüzetben a JARs helyének nyomtatásához:

    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. Futtassa %sh cp -r <path> /dbfs/hive_metastore_jar (cserélje le <path> a fürt adataira) a könyvtár másolásához egy dbFS-gyökérkönyvtárba, amelyet az illesztőcsomópont DBFS-ügyfélén keresztül hív meg hive_metastore_jar .

  4. Hozzon létre egy init-szkriptet , amely a csomópont helyi fájlrendszerére másol /dbfs/hive_metastore_jar , és győződjön meg arról, hogy az init szkript alvó állapotban van néhány másodperccel, mielőtt hozzáfér a DBFS-ügyfélhez. Ez biztosítja, hogy az ügyfél készen álljon.

  5. Állítsa be a spark.sql.hive.metastore.jars értékét ennek a könyvtárnak a használatára. Ha az init szkript a /dbfs/hive_metastore_jar-t a /databricks/hive_metastore_jars/-ba másolja, állítsa be a spark.sql.hive.metastore.jars-t a /databricks/hive_metastore_jars/*-ra. A helynek tartalmaznia kell a záró /* karaktert is.

  6. Indítsa újra a fürtöt.

A Hive konfigurációs beállításai

Ez a szakasz a Hive-re vonatkozó beállításokat ismerteti.

Ha helyi móddal szeretne csatlakozni egy külső metaadattárhoz, adja meg a következő Hive-konfigurációs beállításokat:

# 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

ebben:

  • <mssql-connection-string>A JDBC kapcsolati sztring (amely az Azure Portalon érhető el). Nem kell felhasználónevet és jelszót megadnia a kapcsolati sztring, mert ezeket javax.jdo.option.ConnectionUserName a beállításokat az és javax.jdo.option.ConnectionDriverNamea .
  • <mssql-username> és <mssql-password> adja meg az adatbázishoz olvasási/írási hozzáféréssel rendelkező Azure SQL Database-fiók felhasználónevét és jelszavát.

Feljegyzés

Éles környezetek esetén azt javasoljuk, hogy állítsa be a következőt hive.metastore.schema.verificationtrue: . Ez megakadályozza, hogy a Hive metaadattár-ügyfél implicit módon módosítsa a metaadattár-adatbázis sémáját, ha a metaadattár-ügyfél verziója nem felel meg a metaadattár-adatbázis verziójának. Ha engedélyezi ezt a beállítást a Hive 1.2.0-nál alacsonyabb metaadattár-ügyfélverziókhoz, győződjön meg arról, hogy a metaadattár-ügyfél rendelkezik írási engedéllyel a metaadattár-adatbázishoz (a HIVE-9749-ben leírt probléma elkerülése érdekében).

  • A Hive 1.2.0-s és újabb metaadattárában engedélyezze hive.metastore.schema.verification.record.version az engedélyezésthive.metastore.schema.verificationtrue.
  • A Hive 2.1.1-s és újabb hive.metastore.schema.verification.record.versiontrue metaadattárában alapértelmezés szerint állítsa be a beállítást false .

Külső metaadattár beállítása a felhasználói felülettel

Külső metaadattár beállítása az Azure Databricks felhasználói felületén:

  1. Kattintson a Fürtök gombra az oldalsávon.

  2. Kattintson a Fürt létrehozása lehetőségre.

  3. Adja meg a következő Spark-konfigurációs beállításokat:

    # 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. Folytassa a fürtkonfigurációt a számítási konfigurációs referencia utasításait követve.

  5. Kattintson a Fürt létrehozása elemre a fürt létrehozásához.

Külső metaadattár beállítása init szkripttel

Az Init-szkriptek lehetővé teszik, hogy a szükséges konfigurációk manuális beállítása nélkül csatlakozzon egy meglévő Hive-metaadattárhoz.

  1. Hozza létre azt az alapkönyvtárat, amelyben az inicializálási szkriptet tárolni szeretné, ha az nem létezik. Az alábbi példa a következőt használja dbfs:/databricks/scripts:
  2. Futtassa a következő kódrészletet egy jegyzetfüzetben. A kódrészlet létrehozza az init szkriptet /databricks/scripts/external-metastore.sh a Databricks fájlrendszerben (DBFS). Másik lehetőségként a DBFS REST API üzembehelyezési műveletével is létrehozhatja az init-szkriptet. Ez az init-szkript a szükséges konfigurációs beállításokat egy JSON-szerű formátumban /databricks/driver/conf/ elnevezett 00-custom-spark.conf konfigurációs fájlba írja a fürt minden csomópontjában, amikor egy fürt a megadott <cluster-name> néven indul el. Az Azure Databricks alapértelmezett Spark-konfigurációkat biztosít a /databricks/driver/conf/spark-branch.conf fájlban. A címtárban lévő /databricks/driver/conf konfigurációs fájlok fordított betűrendben érvényesek. Ha módosítani szeretné a 00-custom-spark.conf fájl nevét, győződjön meg arról, hogy a fájl előtt spark-branch.conf továbbra is érvényes marad.

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. Konfigurálja a fürtöt az init szkripttel.
  2. Indítsa újra a fürtöt.

Hibaelhárítás

A fürtök nem indulnak el (helytelen init szkriptbeállítások miatt)

Ha egy init-szkript a külső metaadattár beállításához sikertelen fürtlétrehozást okoz, konfigurálja az init szkriptet a naplózásra, és hibakeresést végezze el az init szkriptben a naplók használatával.

Hiba az SQL-utasításban: InvocationTargetException

  • Hibaüzenet minta a teljes kivételverem-nyomkövetésben:

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

    A külső metaadattár JDBC-kapcsolati adatai helytelenül konfigurálva lesznek. Ellenőrizze a konfigurált állomásnevet, portot, felhasználónevet, jelszót és JDBC-illesztőosztály nevét. Győződjön meg arról is, hogy a felhasználónév rendelkezik a megfelelő jogosultsággal a metaadattár-adatbázis eléréséhez.

  • Hibaüzenet minta a teljes kivételverem-nyomkövetésben:

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

    A külső metaadattár-adatbázis nincs megfelelően inicializálva. Ellenőrizze, hogy létrehozta-e a metaadattár-adatbázist, és elhelyezte-e a megfelelő adatbázisnevet a JDBC kapcsolati sztring. Ezután indítson el egy új fürtöt a következő két Spark-konfigurációs beállítással:

    datanucleus.schema.autoCreateTables true
    datanucleus.fixedDatastore false
    

    Ily módon a Hive ügyfélkódtár automatikusan megpróbálja létrehozni és inicializálni a táblákat a metaadattár-adatbázisban, amikor megpróbálja elérni őket, de nem találja őket.

Hiba az SQL-utasításban: AnalysisException: Nem sikerült példányosítani az org.apache.hadoop.hive.metastore.HiveMetastoreClient parancsot

Hibaüzenet a teljes kivétel veremsávjában:

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

A fürt úgy van konfigurálva, hogy helytelen JDBC-illesztőprogramot használjon.

A datanucleus.autoCreateSchema igaz értékre állítása nem a várt módon működik

A Databricks alapértelmezés szerint a metaadattár-adatbázisok véletlen szerkezeti változásait is datanucleus.fixedDatastoretruemegakadályozza. Ezért a Hive-ügyfélkódtár akkor sem tud metaadattár-táblákat létrehozni, ha be van trueállítvadatanucleus.autoCreateSchema. Ez a stratégia általában biztonságosabb az éles környezetek számára, mivel megakadályozza a metaadattár-adatbázis véletlen frissítését.

Ha segíteni szeretne datanucleus.autoCreateSchema a metaadattár-adatbázis inicializálásában, győződjön meg arról, hogy be van állítva datanucleus.fixedDatastorefalse. A metaadattár-adatbázis inicializálása után érdemes lehet mindkét jelzőt tükrözni, hogy jobb védelmet biztosítson az éles környezet számára.