Udostępnij za pośrednictwem


Zewnętrzny magazyn metadanych Apache Hive (starsza wersja)

Ważne

Ta dokumentacja została wycofana i może nie zostać zaktualizowana.

Uwaga

Używanie zewnętrznych metastorów to przestarzały model zarządzania danymi. Databricks zaleca przeprowadzenie aktualizacji do Unity Catalog. Unity Catalog upraszcza zabezpieczenia i zarządzanie danymi, zapewniając centralne miejsce do administrowania i audytu dostępu do danych we wielu workspace'ach na twoim koncie. Zobacz Co to jest Unity Catalog?.

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 Rozróżnianie wielkości liter dla identyfikatorów.

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>

gdzie

  • <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 na wersję magazynu metadanych Hive i spark.sql.hive.metastore.jars w następujący sposób:

  • Hive 0.13: nie ustawiaj 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 spark.sql.hive.metastore.jars na wartość builtin.

  • W przypadku wszystkich innych wersji Hive, Azure Databricks zaleca pobranie plików JAR magazynu metadanych i skonfigurowanie spark.sql.hive.metastore.jars tak, aby wskazywało na pobrane pliki JAR, używając procedury opisanej w Pobierz pliki JAR magazynu metadanych i wskaż je.

Pobierz pliki jar magazynu metadanych i wskaż je

  1. Utwórz klaster, ustawiając spark.sql.hive.metastore.jars na maven i spark.sql.hive.metastore.version, aby dopasować do wersji 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 Gwarantuje to, że klient jest gotowy.

  5. Ustaw 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 spark.sql.hive.metastore.jars na wartość /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

gdzie

  • <mssql-connection-string> to parametry połączenia JDBC (które można uzyskać w witrynie Azure Portal). Nie musisz dołączać nazwy użytkownika i hasła do parametrów połączenia, ponieważ zostaną one ustawione przez 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 hive.metastore.schema.verification na wartość true. 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 hive.metastore.schema.verification.record.version na true, aby włączyć hive.metastore.schema.verification.
  • W przypadku magazynu metadanych Hive w wersji 2.1.1 lub nowszej ustaw wartość hive.metastore.schema.verification.record.versiontrue, ponieważ jest ona domyślnie ustawiona na false.

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ż, czy 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 Hive spróbuje automatycznie utworzyć i zainicjować tabele w bazie danych magazynu metadanych, gdy próbuje uzyskać do nich dostęp, ale je nie znajdzie.

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 klienta programu Hive nie może tworzyć tabel magazynu metadanych, nawet jeśli ustawiono datanucleus.autoCreateSchema na wartość true. 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, aby ułatwić zainicjowanie bazy danych magazynu metadanych, upewnij się, że ustawiono datanucleus.fixedDatastore na wartość false. Ponadto możesz przerzucić obie flagi po zainicjowaniu bazy danych magazynu metadanych, aby zapewnić lepszą ochronę środowiska produkcyjnego.