Поделиться через


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

Внимание

Эта документация устарела и, возможно, не будет обновляться.

Примечание.

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

В этой статье описывается настройка кластеров 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. Для получения подробностей см. Чувствительность к регистру идентификаторов.

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