Внешнее хранилище метаданных 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-файлов хранилища метаданных и указание на них
Создайте кластер, задав для
spark.sql.hive.metastore.jars
значенияmaven
иspark.sql.hive.metastore.version
, чтобы обеспечить соответствие версии вашего хранилища данных.При работающем кластере выполните поиск в журнале драйвера и найдите строку, похожую на следующую:
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")
Запустите
%sh cp -r <path> /dbfs/hive_metastore_jar
(заменив<path>
сведениями о кластере), чтобы скопировать этот каталог в каталог в корневом каталоге DBFS, вызываемомhive_metastore_jar
через клиент DBFS на узле драйвера.Создайте скрипт инициализации, копирующий локальную файловую систему узла, убедитесь, что скрипт init спятит
/dbfs/hive_metastore_jar
несколько секунд, прежде чем он обращается к клиенту DBFS. Это обеспечит готовность клиента.Установите
spark.sql.hive.metastore.jars
, чтобы использовать этот каталог. Если скрипт инициализации копирует/dbfs/hive_metastore_jar
в/databricks/hive_metastore_jars/
, укажите дляspark.sql.hive.metastore.jars
значение/databricks/hive_metastore_jars/*
. Расположение должно содержать завершающую косую черту (/*
).Перезапустите кластер.
Параметры конфигурации 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, сделайте следующее:
Нажмите кнопку Кластеры на боковой панели.
Щелкните Создать кластер.
Введите следующие параметры конфигурации 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>
Перейдите к конфигурации кластера, следуя инструкциям в справочнике по конфигурации вычислений.
Щелкните Создать кластер, чтобы создать кластер.
Настройка внешнего хранилища метаданных с помощью скрипта инициализации
Скрипты инициализации позволяют подключиться к существующему хранилищу метаданных Hive без настройки нужных конфигураций вручную.
- Создайте базовый каталог, в котором нужно сохранить скрипт инициализации, если он еще не существует. В следующем примере используется
dbfs:/databricks/scripts
. - Выполните следующий фрагмент кода в записной книжке. Этот фрагмент создает скрипт инициализации
/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
)
- Настройте кластер с помощью скрипта инициализации.
- Перезапустите кластер.
Устранение неполадок
Кластеры не запускаются (из-за неправильных параметров скрипта инициализации)
Если скрипт 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
. Также вам может потребоваться поменять местами оба флага после инициализации базы данных хранилища метаданных, чтобы улучшить защиту рабочей среды.