Externí metastore Apache Hive (starší verze)

Tento článek popisuje, jak nastavit clustery Azure Databricks pro připojení k existujícím externím metastorům Apache Hive. Poskytuje informace o doporučených požadavcích na nastavení metastoru a konfiguraci clusteru a pokyny pro konfiguraci clusterů pro připojení k externímu metastoru. Informace o verzích knihovny Hive, které jsou součástí databricks Runtime, najdete v příslušných poznámkách k verzi databricks Runtime.

Důležité

  • I když SQL Server funguje jako základní databáze metastoru pro Hive 2.0 a novější, příklady v tomto článku používají Azure SQL Database.
  • Informace o kompatibilitě metastoru Hive se službou HDInsight najdete v tématu Použití externích úložišť metadat ve službě Azure HDInsight.
  • Pokud jako externí metastore používáte Azure Database for MySQL, musíte změnit hodnotu lower_case_table_names vlastnosti z 1 (výchozí) na 2 v konfiguraci databáze na straně serveru. Podrobnosti najdete v tématu Citlivost případu identifikátoru.

Poznámka:

Použití externích metastorů je starší model zásad správného řízení dat. Databricks doporučuje upgradovat na katalog Unity. Katalog Unity zjednodušuje zabezpečení a zásady správného řízení vašich dat tím, že poskytuje centrální místo pro správu a auditování přístupu k datům ve více pracovních prostorech ve vašem účtu. Podívejte se, co je Katalog Unity?

Nastavení metastoru Hive

Klient metastoru spuštěný v clusteru se připojí k podkladové databázi metastoru přímo pomocí JDBC.

Pokud chcete otestovat síťové připojení z clusteru k metastoru, můžete v poznámkovém bloku spustit následující příkaz:

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

kde

  • <DNS name> je název serveru služby Azure SQL Database.
  • <port> je port databáze.

Konfigurace clusterů

Pro připojení clusteru k externímu metastoru musíte nastavit dvě sady možností konfigurace:

  • Možnosti Sparku nakonfigurují Spark s verzí metastoru Hive a jar pro klienta metastoru.
  • Možnosti Hivu nakonfigurují klienta metastoru tak, aby se připojil k externímu metastoru.

Možnosti konfigurace Sparku

Nastavte spark.sql.hive.metastore.version na verzi metastoru Hive a spark.sql.hive.metastore.jars postupujte takto:

  • Hive 0.13: nenastavujte spark.sql.hive.metastore.jars.

    Poznámka:

    Hive 1.2.0 a 1.2.1 nejsou integrovaným metastorem v Databricks Runtime 7.0 a novějším. Pokud chcete používat Hive 1.2.0 nebo 1.2.1 s Modulem Databricks Runtime 7.0 a novějším, postupujte podle postupu popsaného v tématu Stažení souborů JAR metastoru a na ně nasměrujte.

  • Hive 2.3.7 (Databricks Runtime 7.0 – 9.x) nebo Hive 2.3.9 (Databricks Runtime 10.0 a vyšší): nastaveno spark.sql.hive.metastore.jars na builtin.

  • Ve všech ostatních verzích Hive azure Databricks doporučuje stáhnout soubory JAR metastoru a nastavit konfiguraci spark.sql.hive.metastore.jars tak, aby odkazovala na stažené verze JAR pomocí postupu popsaného v části Stažení souborů JAR metastoru a odkazování na ně.

Stáhněte soubory JAR metastoru a nasměrujte na ně.

  1. Vytvořte cluster se spark.sql.hive.metastore.jars nastavenou verzí maven metastoru a spark.sql.hive.metastore.version odpovídající verzi metastoru.

  2. Když je cluster spuštěný, vyhledejte v protokolu ovladačů řádek podobný tomuto:

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

    <path> Adresář je umístění stažených jar v uzlu ovladače clusteru.

    Případně můžete v poznámkovém bloku Scala spustit následující kód, který vytiskne umístění jar:

    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. Spuštěním %sh cp -r <path> /dbfs/hive_metastore_jar (nahrazením <path> informací o clusteru) zkopírujte tento adresář do adresáře v kořenovém adresáři DBFS volaným hive_metastore_jar prostřednictvím klienta DBFS v uzlu ovladače.

  4. Vytvořte inicializační skript, který zkopíruje /dbfs/hive_metastore_jar do místního systému souborů uzlu, a ujistěte se, že inicializační skript přejde do režimu spánku několik sekund, než bude přistupovat ke klientovi DBFS. Tím se zajistí, že je klient připravený.

  5. Nastavte konfiguraci spark.sql.hive.metastore.jars tak, aby používala tento adresář. Pokud váš inicializační skript kopíruje soubory /dbfs/hive_metastore_jar do adresáře /databricks/hive_metastore_jars/, nastavte spark.sql.hive.metastore.jars na /databricks/hive_metastore_jars/*. Umístění musí obsahovat koncový znak /*.

  6. Restartujte cluster.

Možnosti konfigurace Hivu

Tato část popisuje možnosti specifické pro Hive.

Pokud se chcete připojit k externímu metastoru pomocí místního režimu, nastavte následující možnosti konfigurace 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

kde

  • <mssql-connection-string>je připojovací řetězec JDBC (který můžete získat na webu Azure Portal). Do připojovací řetězec nemusíte do připojovací řetězec zahrnout uživatelské jméno a heslo, protože je nastavíte pomocí javax.jdo.option.ConnectionUserName a javax.jdo.option.ConnectionDriverName.
  • <mssql-username> a <mssql-password> zadejte uživatelské jméno a heslo účtu služby Azure SQL Database, který má k databázi přístup pro čtení a zápis.

Poznámka:

Pro produkční prostředí doporučujeme nastavit hive.metastore.schema.verification možnost true. To zabrání klientovi metastoru Hive implicitně upravovat schéma databáze metastoru, pokud verze klienta metastoru neodpovídá verzi databáze metastoru. Pokud povolíte toto nastavení pro verze klienta metastoru nižší než Hive 1.2.0, ujistěte se, že má klient metastoru oprávnění k zápisu do databáze metastoru (aby se zabránilo problému popsanému v HIVE-9749).

  • V případě metastoru Hive 1.2.0 a novějšího nastavte hive.metastore.schema.verification.record.version povolení truehive.metastore.schema.verification.
  • U metastoru Hive 2.1.1 a vyšší je nastavená hive.metastore.schema.verification.record.version na truefalse výchozí hodnotu.

Nastavení externího metastoru pomocí uživatelského rozhraní

Nastavení externího metastoru pomocí uživatelského rozhraní Azure Databricks:

  1. Klikněte na tlačítko Clusters na bočním panelu.

  2. Klikněte na Create Cluster (Vytvořit cluster).

  3. Zadejte následující možnosti konfigurace Sparku:

    # 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. Pokračujte v konfiguraci clusteru podle pokynůvch

  5. Kliknutím na vytvořit cluster vytvořte cluster.

Nastavení externího metastoru pomocí inicializačního skriptu

Inicializační skripty umožňují připojit se k existujícímu metastoru Hive bez ručního nastavení požadovaných konfigurací.

  1. Vytvořte základní adresář, do kterého chcete uložit inicializační skript, pokud neexistuje. Následující příklad používá dbfs:/databricks/scripts.
  2. V poznámkovém bloku spusťte následující fragment kódu. Fragment kódu vytvoří inicializační skript /databricks/scripts/external-metastore.sh v systému souborů Databricks (DBFS). Alternativně můžete k vytvoření inicializačního skriptu použít operaci vložení rozhraní REST API DBFS. Tento inicializační skript zapíše požadované možnosti konfigurace do konfiguračního souboru pojmenovaného 00-custom-spark.conf ve formátu podobném formátu /databricks/driver/conf/ JSON v každém uzlu clusteru, kdykoli cluster s názvem zadaným při <cluster-name> spuštění. Azure Databricks poskytuje v souboru výchozí konfigurace Sparku /databricks/driver/conf/spark-branch.conf . Konfigurační soubory v /databricks/driver/conf adresáři se použijí v obráceném abecedním pořadí. Pokud chcete změnit název 00-custom-spark.conf souboru, ujistěte se, že se bude dál používat před souborem spark-branch.conf .

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. Nakonfigurujte cluster pomocí inicializačního skriptu.
  2. Restartujte cluster.

Řešení problému

Clustery se nespustí (kvůli nesprávnému nastavení inicializačního skriptu)

Pokud inicializační skript pro nastavení externího metastoru způsobí selhání vytváření clusteru, nakonfigurujte inicializační skript pro protokolování a ladění inicializačního skriptu pomocí protokolů.

Chyba v příkazu SQL: InvocationTargetException

  • Vzor chybové zprávy v úplném trasování zásobníku výjimek:

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

    Informace o připojení JDBC externího metastoru jsou chybně nakonfigurované. Ověřte název nakonfigurovaného hostitele, port, uživatelské jméno, heslo a název třídy ovladače JDBC. Také se ujistěte, že uživatelské jméno má správné oprávnění pro přístup k databázi metastoru.

  • Vzor chybové zprávy v úplném trasování zásobníku výjimek:

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

    Databáze externího metastoru není správně inicializována. Ověřte, že jste vytvořili databázi metastoru, a vložte správný název databáze do připojovací řetězec JDBC. Potom spusťte nový cluster s následujícími dvěma možnostmi konfigurace Sparku:

    datanucleus.schema.autoCreateTables true
    datanucleus.fixedDatastore false
    

    Tímto způsobem se klientská knihovna Hive pokusí vytvořit a inicializovat tabulky v databázi metastoru automaticky, když se pokusí o přístup k nim, ale najde je chybí.

Chyba v příkazu SQL: AnalysisException: Nejde vytvořit instanci org.apache.hadoop.hive.metastore.HiveMetastoreClient

Chybová zpráva v úplném zásobníku výjimek:

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

Cluster je nakonfigurovaný tak, aby používal nesprávný ovladač JDBC.

Nastavení datového nucleus.autoCreateSchema na true nefunguje podle očekávání

Ve výchozím nastavení se Databricks nastaví datanucleus.fixedDatastore také na true, což brání náhodným strukturálním změnám v databázích metastoru. Klientská knihovna Hive proto nemůže vytvářet tabulky metastoru, i když je nastavena datanucleus.autoCreateSchema na truehodnotu . Tato strategie je obecně bezpečnější pro produkční prostředí, protože brání náhodnému upgradu databáze metastoru.

Pokud chcete použít datanucleus.autoCreateSchema k inicializaci databáze metastoru, ujistěte se, že je nastavená datanucleus.fixedDatastore hodnota false. Po inicializaci databáze metastoru můžete také chtít překlopit oba příznaky, abyste zajistili lepší ochranu produkčního prostředí.