Zewnętrzny magazyn metadanych Apache Hive (starsza wersja)

W tym artykule opisano sposób konfigurowania klastrów usługi Azure Databricks w celu nawiązania połączenia z istniejącymi zewnętrznymi magazynami metadanych Apache Hive. Zawiera on informacje o zalecanych wymaganiach dotyczących konfiguracji magazynu metadanych i konfiguracji klastra, a następnie instrukcje dotyczące konfigurowania klastrów w celu nawiązania połączenia z zewnętrznym magazynem metadanych. Aby uzyskać informacje o wersji biblioteki Hive zawarte w środowisku Databricks Runtime, zobacz odpowiednie informacje o wersji środowiska Databricks Runtime.

Ważne

  • Chociaż program SQL Server działa jako bazowa baza danych magazynu metadanych dla programu Hive 2.0 lub nowszego, przykłady w tym artykule korzystają z usługi Azure SQL Database.
  • Aby uzyskać informacje o zgodności magazynu metadanych Hive z usługą HDInsight, zobacz Używanie zewnętrznych magazynów metadanych w usłudze Azure HDInsight.
  • Jeśli używasz usługi Azure Database for MySQL jako zewnętrznego magazynu metadanych, musisz zmienić wartość lower_case_table_names właściwości z 1 (wartość domyślna) na 2 w konfiguracji bazy danych po stronie serwera. Aby uzyskać szczegółowe informacje, zobacz Ważność przypadku identyfikatora.

Uwaga

Używanie zewnętrznych magazynów metadanych to starszy model zapewniania ładu danych. Usługa Databricks zaleca uaktualnienie do wykazu aparatu Unity. Katalog aparatu Unity upraszcza zabezpieczenia i nadzór nad danymi, zapewniając centralne miejsce do administrowania i inspekcji dostępu do danych w wielu obszarach roboczych na twoim koncie. Zobacz Co to jest wykaz aparatu Unity?.

Konfiguracja magazynu metadanych Hive

Klient magazynu metadanych uruchomiony wewnątrz klastra łączy się z bazową bazą danych magazynu metadanych bezpośrednio przy użyciu sterownika JDBC.

Aby przetestować łączność sieciową z klastra do magazynu metadanych, możesz uruchomić następujące polecenie w notesie:

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

where

  • <DNS name> to nazwa serwera usługi Azure SQL Database.
  • <port> to port bazy danych.

Konfiguracje klastrów

Należy ustawić dwa zestawy opcji konfiguracji, aby połączyć klaster z zewnętrznym magazynem metadanych:

  • Opcje platformy Spark umożliwiają skonfigurowanie platformy Spark przy użyciu wersji magazynu metadanych Hive i żądania JAR dla klienta magazynu metadanych.
  • Opcje programu Hive umożliwiają skonfigurowanie klienta magazynu metadanych w celu nawiązania połączenia z zewnętrznym magazynem metadanych.

Opcje konfiguracji platformy Spark

Ustaw spark.sql.hive.metastore.version wersję magazynu metadanych Hive i spark.sql.hive.metastore.jars w następujący sposób:

  • Hive 0.13: nie ustawiaj wartości spark.sql.hive.metastore.jars.

    Uwaga

    Hive 1.2.0 i 1.2.1 nie są wbudowanym magazynem metadanych w środowisku Databricks Runtime 7.0 i nowszym. Jeśli chcesz użyć programu Hive 1.2.0 lub 1.2.1 w środowisku Databricks Runtime 7.0 lub nowszym, wykonaj procedurę opisaną w temacie Pobieranie plików jar magazynu metadanych i wskaż je.

  • Hive 2.3.7 (Databricks Runtime 7.0 – 9.x) lub Hive 2.3.9 (Databricks Runtime 10.0 i nowsze): ustaw wartość spark.sql.hive.metastore.jarsbuiltin.

  • W przypadku wszystkich innych wersji usługi Hive usługa Azure Databricks zaleca pobranie plików JAR magazynu metadanych i ustawienie konfiguracji spark.sql.hive.metastore.jars tak, aby wskazywała pobrane pliki JAR przy użyciu procedury opisanej w temacie Pobieranie plików jar magazynu metadanych i wskaż je.

Pobierz pliki jar magazynu metadanych i wskaż je

  1. Utwórz klaster z ustawioną wartością spark.sql.hive.metastore.jarsmaven i spark.sql.hive.metastore.version , aby był zgodny z wersją magazynu metadanych.

  2. Gdy klaster jest uruchomiony, przeszukaj dziennik sterowników i znajdź wiersz podobny do następującego:

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

    Katalog <path> jest lokalizacją pobranych jednostek JAR w węźle sterownika klastra.

    Alternatywnie możesz uruchomić następujący kod w notesie Scala, aby wydrukować lokalizację jednostek 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. Uruchom polecenie %sh cp -r <path> /dbfs/hive_metastore_jar (zastępując <path> element informacjami klastra), aby skopiować ten katalog do katalogu głównego systemu plików DBFS wywoływanego hive_metastore_jar za pośrednictwem klienta DBFS w węźle sterownika.

  4. Utwórz skrypt inicjowania, który kopiuje /dbfs/hive_metastore_jar do lokalnego systemu plików węzła, upewniając się, że skrypt inicjowania spał kilka sekund przed uzyskaniem dostępu do klienta systemu plików DBFS. Gwarantuje to, że klient jest gotowy.

  5. Ustaw element spark.sql.hive.metastore.jars, aby użyć tego katalogu. Jeśli skrypt inicjowania kopiuje /dbfs/hive_metastore_jar do /databricks/hive_metastore_jars/, ustaw pozycję spark.sql.hive.metastore.jars na /databricks/hive_metastore_jars/*. Lokalizacja musi zawierać końcowy znak /*.

  6. Uruchom ponownie klaster.

Opcje konfiguracji programu Hive

W tej sekcji opisano opcje specyficzne dla programu Hive.

Aby nawiązać połączenie z zewnętrznym magazynem metadanych przy użyciu trybu lokalnego, ustaw następujące opcje konfiguracji programu 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>to parametry połączenia JDBC (którą można uzyskać w witrynie Azure Portal). Nie musisz uwzględniać nazwy użytkownika i hasła w parametry połączenia, ponieważ zostaną one ustawione według javax.jdo.option.ConnectionUserName i javax.jdo.option.ConnectionDriverName.
  • <mssql-username> i <mssql-password> określ nazwę użytkownika i hasło konta usługi Azure SQL Database, które ma dostęp do odczytu/zapisu w bazie danych.

Uwaga

W przypadku środowisk produkcyjnych zalecamy ustawienie wartości hive.metastore.schema.verificationtrue. Zapobiega to niejawnej modyfikacji schematu bazy danych magazynu metadanych programu Hive, gdy wersja klienta magazynu metadanych nie jest zgodna z wersją bazy danych magazynu metadanych. Podczas włączania tego ustawienia dla wersji klienta magazynu metadanych starszych niż Hive 1.2.0 upewnij się, że klient magazynu metadanych ma uprawnienie do zapisu w bazie danych magazynu metadanych (aby zapobiec problemowi opisanemu w programie HIVE-9749).

  • W przypadku magazynu metadanych Hive w wersji 1.2.0 lub nowszej ustaw wartość hive.metastore.schema.verification.record.version na true wartość .hive.metastore.schema.verification
  • W przypadku magazynu metadanych Hive w wersji 2.1.1 lub nowszej ustaw hive.metastore.schema.verification.record.versionfalse wartość na true ustawioną domyślnie.

Konfigurowanie zewnętrznego magazynu metadanych przy użyciu interfejsu użytkownika

Aby skonfigurować zewnętrzny magazyn metadanych przy użyciu interfejsu użytkownika usługi Azure Databricks:

  1. Kliknij przycisk Klastry na pasku bocznym.

  2. Kliknij pozycję Utwórz klaster.

  3. Wprowadź następujące opcje konfiguracji platformy 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. Kontynuuj konfigurację klastra, postępując zgodnie z instrukcjami w dokumentacji konfiguracji obliczeniowej.

  5. Kliknij pozycję Utwórz klaster , aby utworzyć klaster.

Konfigurowanie zewnętrznego magazynu metadanych przy użyciu skryptu init

Skrypty inicjowania umożliwiają nawiązywanie połączenia z istniejącym magazynem metadanych Hive bez ręcznego ustawiania wymaganych konfiguracji.

  1. Utwórz katalog podstawowy, w którym chcesz przechowywać skrypt inicjowania, jeśli nie istnieje. W poniższym przykładzie użyto metody dbfs:/databricks/scripts.
  2. Uruchom poniższy fragment kodu w notesie. Fragment kodu tworzy skrypt /databricks/scripts/external-metastore.sh inicjowania w systemie plików usługi Databricks (DBFS). Alternatywnie możesz użyć operacji put interfejsu API REST dbFS, aby utworzyć skrypt inicjowania. Ten skrypt init zapisuje wymagane opcje konfiguracji do pliku konfiguracji o nazwie 00-custom-spark.conf w formacie przypominającym kod JSON wewnątrz /databricks/driver/conf/ każdego węzła klastra, za każdym razem, gdy klaster o nazwie określonej jako <cluster-name> rozpoczyna. Usługa Azure Databricks udostępnia domyślne konfiguracje platformy Spark w /databricks/driver/conf/spark-branch.conf pliku. Pliki konfiguracji w /databricks/driver/conf katalogu mają zastosowanie w odwrotnej kolejności alfabetycznej. Jeśli chcesz zmienić nazwę 00-custom-spark.conf pliku, upewnij się, że będzie on nadal stosowany przed plikiem 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. Skonfiguruj klaster za pomocą skryptu init.
  2. Uruchom ponownie klaster.

Rozwiązywanie problemów

Klastry nie są uruchamiane (z powodu nieprawidłowych ustawień skryptu inicjowania)

Jeśli skrypt inicjowania do konfigurowania zewnętrznego magazynu metadanych powoduje niepowodzenie tworzenia klastra, skonfiguruj skrypt inicjowania do rejestrowania i debuguj skrypt inicjowania przy użyciu dzienników.

Błąd w instrukcji SQL: InvocationTargetException

  • Wzorzec komunikatu o błędzie w pełnym śladzie stosu wyjątków:

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

    Informacje o połączeniu JDBC zewnętrznego magazynu metadanych są błędnie skonfigurowane. Sprawdź skonfigurowaną nazwę hosta, port, nazwę użytkownika, hasło i nazwę klasy sterownika JDBC. Upewnij się również, że nazwa użytkownika ma odpowiednie uprawnienia dostępu do bazy danych magazynu metadanych.

  • Wzorzec komunikatu o błędzie w pełnym śladzie stosu wyjątków:

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

    Zewnętrzna baza danych magazynu metadanych nie została poprawnie zainicjowana. Sprawdź, czy utworzono bazę danych magazynu metadanych i umieść poprawną nazwę bazy danych w parametry połączenia JDBC. Następnie uruchom nowy klaster z następującymi dwiema opcjami konfiguracji platformy Spark:

    datanucleus.schema.autoCreateTables true
    datanucleus.fixedDatastore false
    

    W ten sposób biblioteka klienta programu Hive spróbuje utworzyć i zainicjować tabele w bazie danych magazynu metadanych automatycznie, gdy próbuje uzyskać do nich dostęp, ale znajdzie je nieobecne.

Błąd w instrukcji SQL: AnalysisException: Nie można utworzyć wystąpienia org.apache.hadoop.hive.metastore.HiveMetastoreClient

Komunikat o błędzie w pełnym stosie wyjątków:

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

Klaster jest skonfigurowany do używania nieprawidłowego sterownika JDBC.

Ustawienie wartości datanucleus.autoCreateSchema na true nie działa zgodnie z oczekiwaniami

Domyślnie usługa Databricks ustawia również wartość datanucleus.fixedDatastoretrue, co uniemożliwia przypadkowe zmiany strukturalne w bazach danych magazynu metadanych. W związku z tym biblioteka kliencka programu Hive nie może utworzyć tabel magazynu metadanych, nawet jeśli ustawiono wartość datanucleus.autoCreateSchematrue. Ta strategia jest ogólnie bezpieczniejsza dla środowisk produkcyjnych, ponieważ uniemożliwia przypadkowe uaktualnienie bazy danych magazynu metadanych.

Jeśli chcesz użyć datanucleus.autoCreateSchema polecenia w celu zainicjowania bazy danych magazynu metadanych, upewnij się, że ustawiono wartość falsedatanucleus.fixedDatastore . Ponadto możesz przerzucić obie flagi po zainicjowaniu bazy danych magazynu metadanych, aby zapewnić lepszą ochronę środowiska produkcyjnego.