Внешнее хранилище метаданных Apache Hive (устаревшая версия)

В этой статье описывается, как настроить кластеры Azure Databricks для подключения к существующим внешним хранилищам метаданных Apache Hive. В ней приведены сведения о рекомендуемой настройке хранилища метаданных и требованиях к конфигурации кластера, а также инструкции по настройке кластеров для подключения к внешнему хранилищу метаданных. Сведения о версиях библиотек Hive, включенных в Databricks Runtime, см. в соответствующих заметках о выпуске версии Databricks Runtime.

Внимание

  • Поскольку SQL Server применяется как основная база данных хранилища метаданных для Hive 2.0 и более поздних версий, в примерах в этой статье используется База данных SQL Azure.
  • Сведения о совместимости хранилища метаданных Hive с HDInsight см. в статье "Использование внешних хранилищ метаданных" в Azure HDInsight.
  • Если в качестве внешнего хранилища метаданных вы используете Базу данных Azure для MySQL, необходимо в конфигурации базы данных на стороне сервера изменить значение свойства lower_case_table_names с 1 (по умолчанию) на 2. Дополнительные сведения см. в статье о чувствительности идентификатора к регистру.

Примечание.

Использование внешних хранилищ метаданных является устаревшей моделью управления данными. Databricks рекомендует выполнить обновление до каталога Unity. Каталог Unity упрощает безопасность и управление данными, предоставляя централизованное место для администрирования и аудита доступа к данным в нескольких рабочих областях в вашей учетной записи. См. статью Что такое Unity Catalog?

Настройка хранилища метаданных Hive

Клиент хранилища метаданных, работающий в кластере, подключается к базовой базе данных хранилища метаданных напрямую с помощью JDBC.

Чтобы проверить сетевое подключение из кластера к хранилищу метаданных, можно выполнить следующую команду в записной книжке:

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

где

  • <DNS name> — это имя сервера для Базы данных SQL Azure.
  • <port> — это порт базы данных.

Конфигурации кластера

Вам необходимо задать два набора параметров конфигурации для подключения кластера к внешнему хранилищу метаданных:

  • Параметры Spark настраивают Spark с указанием версии хранилища метаданных Hive и JAR-файлами для клиента хранилища метаданных.
  • Параметры Hive настраивают клиент хранилища метаданных для подключения к внешнему хранилищу метаданных.

Параметры настройки Spark

Задайте для spark.sql.hive.metastore.version версию своего хранилища метаданных Hive и значение spark.sql.hive.metastore.jars следующим образом:

  • Hive 0.13: не задавайте spark.sql.hive.metastore.jars.

    Примечание.

    Hive 1.2.0 и 1.2.1 не являются встроенным хранилищем метаданных в Databricks Runtime 7.0 и более поздних версий. Если вы хотите использовать Hive 1.2.0 или 1.2.1 с Databricks Runtime 7.0 и более поздних версий, выполните инструкции из раздела Скачивание JAR-файлов хранилища метаданных и указание на них.

  • Hive 2.3.7 (Databricks Runtime 7.0–9.x) или Hive 2.3.9 (Databricks Runtime 10.0 и последующих версий): параметру spark.sql.hive.metastore.jars задайте значение builtin.

  • Для всех других версий Hive Azure Databricks рекомендует скачать JAR-файлы хранилища метаданных и настроить spark.sql.hive.metastore.jars конфигурации для указания на скачанные JAR-файлы с помощью процедуры, описанной в разделе Скачивание JAR-файлов хранилища метаданных и указание на них.

Скачивание JAR-файлов хранилища метаданных и указание на них

  1. Создайте кластер, задав для spark.sql.hive.metastore.jars значения maven и spark.sql.hive.metastore.version, чтобы обеспечить соответствие версии вашего хранилища данных.

  2. При работающем кластере выполните поиск в журнале драйвера и найдите строку, похожую на следующую:

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

    Каталог <path> — это расположение скачанных JAR-файлов на узле драйвера кластера.

    Кроме того, вы можете запустить следующий код в записной книжке Scala, чтобы вывести расположение 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. Запустите %sh cp -r <path> /dbfs/hive_metastore_jar (заменив <path> сведениями о кластере), чтобы скопировать этот каталог в каталог в корневом каталоге DBFS, вызываемом hive_metastore_jar через клиент DBFS на узле драйвера.

  4. Создайте скрипт инициализации, копирующий локальную файловую систему узла, убедитесь, что скрипт init спятит /dbfs/hive_metastore_jar несколько секунд, прежде чем он обращается к клиенту DBFS. Это обеспечит готовность клиента.

  5. Установите spark.sql.hive.metastore.jars, чтобы использовать этот каталог. Если скрипт инициализации копирует /dbfs/hive_metastore_jar в /databricks/hive_metastore_jars/, укажите для spark.sql.hive.metastore.jars значение /databricks/hive_metastore_jars/*. Расположение должно содержать завершающую косую черту (/*).

  6. Перезапустите кластер.

Параметры конфигурации Hive

В этом разделе описаны параметры, которые используются с Hive.

Чтобы подключиться к внешнему хранилищу метаданных с помощью локального режима, задайте следующие параметры конфигурации 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

где

  • <mssql-connection-string> — это строка подключения JDBC (ее можно получить на портале Azure). Вам не нужно включать имя пользователя и пароль в строку подключения, так как они будут заданы javax.jdo.option.ConnectionUserName и javax.jdo.option.ConnectionDriverName.
  • <mssql-username> и <mssql-password> указывают имя пользователя и пароль для учетной записи Базы данных SQL Azure, которая имеет доступ на чтение и запись к базе данных.

Примечание.

Для рабочих сред мы рекомендуем задать для hive.metastore.schema.verification значение true. Это не позволяет клиенту хранилища метаданных Hive явно изменять схему базы данных для хранилища метаданных, если версия клиента хранилища метаданных не совпадает с версией базы данных хранилища метаданных. Если вы хотите включить этот параметр для версий клиента хранилища метаданных ниже Hive 1.2.0, убедитесь, что клиент хранилища метаданных имеет разрешения на запись в базу данных хранилища метаданных (чтобы не допустить возникновения проблемы, описанной в HIVE-9749).

  • Для хранилища метаданных Hive версии 1.2.0 и более поздних задайте для hive.metastore.schema.verification.record.version значение true, чтобы включить hive.metastore.schema.verification.
  • Для хранилища метаданных Hive версии 2.1.1 и более поздних задайте для hive.metastore.schema.verification.record.version значение true, так как по умолчанию используется false.

Настройка внешнего хранилища метаданных с помощью пользовательского интерфейса

Чтобы настроить внешнее хранилище метаданных с помощью пользовательского интерфейса Azure Databricks, сделайте следующее:

  1. Нажмите кнопку Кластеры на боковой панели.

  2. Щелкните Создать кластер.

  3. Введите следующие параметры конфигурации 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. Перейдите к конфигурации кластера, следуя инструкциям в справочнике по конфигурации вычислений.

  5. Щелкните Создать кластер, чтобы создать кластер.

Настройка внешнего хранилища метаданных с помощью скрипта инициализации

Скрипты инициализации позволяют подключиться к существующему хранилищу метаданных Hive без настройки нужных конфигураций вручную.

  1. Создайте базовый каталог, в котором нужно сохранить скрипт инициализации, если он еще не существует. В следующем примере используется dbfs:/databricks/scripts.
  2. Выполните следующий фрагмент кода в записной книжке. Этот фрагмент создает скрипт инициализации /databricks/scripts/external-metastore.sh в файловой системе Databricks (DBFS). Кроме того, вы можете использовать операцию put в REST API DBFS, чтобы создать скрипт инициализации. Этот скрипт инициализации записывает нужные параметры конфигурации в файл конфигурации с именем 00-custom-spark.conf в формате, похожим на JSON, в папке /databricks/driver/conf/ на каждом узле каждого запускаемого кластера с именем, которое указывается <cluster-name>. Azure Databricks предоставляет конфигурации Spark по умолчанию в файле /databricks/driver/conf/spark-branch.conf. Файлы конфигурации в каталоге /databricks/driver/conf применяются в обратном алфавитном порядке. Если вы хотите изменить имя файла 00-custom-spark.conf, убедитесь, что он все так же применяется перед файлом 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. Настройте кластер с помощью скрипта инициализации.
  2. Перезапустите кластер.

Устранение неполадок

Кластеры не запускаются (из-за неправильных параметров скрипта инициализации)

Если скрипт init для настройки внешнего хранилища метаданных приводит к сбою создания кластера, настройте скрипт init для записи и отладку скрипта инициализации с помощью журналов.

Ошибка в инструкции SQL: InvocationTargetException

  • Шаблон сообщения об ошибке в полной трассировке стека исключений:

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

    Сведения о подключении JDBC к внешнему хранилищу метаданных настроены неверно. Проверьте настроенные имя узла, порт, имя пользователя, пароль и имя класса драйвера JDBC. Также убедитесь, что имя пользователя имеет права на доступ к базе данных хранилища метаданных.

  • Шаблон сообщения об ошибке в полной трассировке стека исключений:

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

    База данных внешнего хранилища метаданных не инициализирована правильно. Убедитесь, что вы создали базу данных хранилища метаданных и указали правильное имя базы данных в строке подключения JDBC. Затем запустите новый кластер со следующими двумя параметрами конфигурации Spark:

    datanucleus.schema.autoCreateTables true
    datanucleus.fixedDatastore false
    

    Так клиентская библиотека Hive попытается автоматически создать и инициализировать таблицы в базе данных хранилища метаданных в тех случаях, когда она пытается получить к ним доступ, но не находит их.

Ошибка в инструкции SQL: AnalysisException — не удается создать экземпляр org.apache.hadoop.hive.metastore.HiveMetastoreClient

Сообщение об ошибке в полной трассировке стека исключений:

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

Кластер настроен на использование неверного драйвера JDBC.

Установка для datanucleus.autoCreateSchema значения true не работает надлежащим образом

По умолчанию Databricks также задает для datanucleus.fixedDatastore значение true, что предотвращает случайные структурные изменения в базах данных хранилища метаданных. Поэтому клиентская библиотека Hive не может создать таблицы хранилища метаданных, даже если вы задали для datanucleus.autoCreateSchema значение true. Такая стратегия в целом безопаснее для рабочих сред, так как она не допускает случайного обновления базы данных хранилища метаданных.

Если вы хотите использовать datanucleus.autoCreateSchema, чтобы упростить инициализацию базы данных хранилища метаданных, обязательно задайте для datanucleus.fixedDatastore значение false. Также вам может потребоваться поменять местами оба флага после инициализации базы данных хранилища метаданных, чтобы улучшить защиту рабочей среды.