Откройте Synapse Studio, перейдите в раздел Управление и связанные службы слева и щелкните Создать, чтобы создать связанную службу.
Выберите База данных Azure для MySQL, нажмите кнопку "Продолжить".
Укажите Имя связанной службы. Запишите имя связанной службы. Эта информация будет использоваться для настройки Spark через некоторое время.
Выберите База данных Azure для MySQL для внешнего хранилища метаданных Hive из списка подписок Azure или введите сведения вручную.
Укажите имя пользователя и пароль, чтобы настроить подключение.
Проверьте подключение, чтобы проверить имя пользователя и пароль.
Щелкните Создать, чтобы сохранить связанную службу.
Некоторые параметры правила безопасности сети могут блокировать доступ из пула Spark к внешней базе данных хранилища метаданных Hive. Перед настройкой пула Spark выполните приведенный ниже код в любой записной книжке пула Spark, чтобы проверить подключение к базе данных внешнего хранилища метаданных Hive.
Вы также можете получить версию хранилища метаданных Hive из выходных результатов. Версия хранилища метаданных Hive будет использоваться в конфигурации Spark.
Предупреждение
Не публикуйте тестовые скрипты в записной книжке с жестко заданным паролем, так как это может привести к потенциальному риску безопасности для хранилища метаданных Hive.
Код тестирования подключения для Azure SQL
%%spark
import java.sql.DriverManager
/** this JDBC url could be copied from Azure portal > Azure SQL database > Connection strings > JDBC **/
val url = s"jdbc:sqlserver://{your_servername_here}.database.windows.net:1433;database={your_database_here};user={your_username_here};password={your_password_here};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;"
try {
val connection = DriverManager.getConnection(url)
val result = connection.createStatement().executeQuery("select t.SCHEMA_VERSION from VERSION t")
result.next();
println(s"Successful to test connection. Hive Metastore version is ${result.getString(1)}")
} catch {
case ex: Throwable => println(s"Failed to establish connection:\n $ex")
}
Код тестирования подключения для Базы данных Azure MySQL
%%spark
import java.sql.DriverManager
/** this JDBC url could be copied from Azure portal > Azure Database for MySQL > Connection strings > JDBC **/
val url = s"jdbc:mysql://{your_servername_here}.mysql.database.azure.com:3306/{your_database_here}?useSSL=true"
try {
val connection = DriverManager.getConnection(url, "{your_username_here}", "{your_password_here}");
val result = connection.createStatement().executeQuery("select t.SCHEMA_VERSION from VERSION t")
result.next();
println(s"Successful to test connection. Hive Metastore version is ${result.getString(1)}")
} catch {
case ex: Throwable => println(s"Failed to establish connection:\n $ex")
}
После успешного создания связанной службы во внешнем хранилище метаданных Hive необходимо настроить несколько конфигураций Spark для использования внешнего хранилища метаданных Hive. Конфигурацию можно настроить на уровне пула Spark или на уровне сеанса Spark.
Ниже приведены конфигурации и описания.
Примечание.
Решение Synapse предназначено для беспроблемного взаимодействия с вычислительными ресурсами HDI. Однако версия HMS 3.1 в HDI 4.0 не полностью совместима с OSS HMS 3.1. Дополнительные сведения об OSS HMS 3.1.см. здесь.
Конфигурация Spark |
Description |
spark.sql.hive.metastore.version |
Поддерживаемые версии: Убедитесь, что вы используете первые две части без третьей части |
spark.sql.hive.metastore.jars |
- Версия 2.3:
/opt/hive-metastore/lib-2.3/*:/usr/hdp/current/hadoop-client/lib/*:/usr/hdp/current/hadoop-client/* - Версия 3.1:
/opt/hive-metastore/lib-3.1/*:/usr/hdp/current/hadoop-client/lib/*:/usr/hdp/current/hadoop-client/*
|
spark.hadoop.hive.synapse.externalmetastore.linkedservice.name |
Имя связанной службы |
spark.sql.hive.metastore.sharedPrefixes |
com.mysql.jdbc,com.microsoft.vegas |
При создании пула Spark на вкладке Дополнительные параметры укажите в текстовом файле приведенные ниже параметры конфигурации и отправьте его в раздел Конфигурация Apache Spark . Можно также использовать контекстное меню для существующего пула Spark и выбрать конфигурацию Apache Spark, чтобы добавить эти параметры.
Обновите версию хранилища метаданных и имя связанной службы и сохраните следующие параметры конфигурации в текстовом файле для конфигурации пула Spark:
spark.sql.hive.metastore.version <your hms version, Make sure you use the first 2 parts without the 3rd part>
spark.hadoop.hive.synapse.externalmetastore.linkedservice.name <your linked service name>
spark.sql.hive.metastore.jars /opt/hive-metastore/lib-<your hms version, 2 parts>/*:/usr/hdp/current/hadoop-client/lib/*
spark.sql.hive.metastore.sharedPrefixes com.mysql.jdbc,com.microsoft.vegas
Ниже приведен пример для хранилища метаданных версии 2.3 с связанной службой с именем HiveCatalog21:
spark.sql.hive.metastore.version 2.3
spark.hadoop.hive.synapse.externalmetastore.linkedservice.name HiveCatalog21
spark.sql.hive.metastore.jars /opt/hive-metastore/lib-2.3/*:/usr/hdp/current/hadoop-client/lib/*
spark.sql.hive.metastore.sharedPrefixes com.mysql.jdbc,com.microsoft.vegas
Для сеанса с записной книжкой также можно настроить сеанс Spark в записной книжке с помощью магической команды %%configure
. Вот код.
%%configure -f
{
"conf":{
"spark.sql.hive.metastore.version":"<your hms version, 2 parts>",
"spark.hadoop.hive.synapse.externalmetastore.linkedservice.name":"<your linked service name>",
"spark.sql.hive.metastore.jars":"/opt/hive-metastore/lib-<your hms version, 2 parts>/*:/usr/hdp/current/hadoop-client/lib/*",
"spark.sql.hive.metastore.sharedPrefixes":"com.mysql.jdbc,com.microsoft.vegas"
}
}
Для пакетного задания ту же конфигурацию можно применить с помощью SparkConf
.
Выполнение запросов для проверки подключения
После настройки всех параметров попробуйте перечислить объекты каталога, выполнив следующий запрос в записной книжке Spark, чтобы проверить подключение к внешнему хранилищу метаданных Hive.
spark.sql("show databases").show()
Настройка подключения к службе хранилища
Связанная служба для базы данных хранилища метаданных Hive просто предоставляет доступ к метаданным каталога Hive. Для запроса существующих таблиц необходимо также настроить подключение к учетной записи хранения, в которой хранятся базовые данные для таблиц Hive.
Настройка подключения к Azure Data Lake Storage 2-го поколения
Основная учетная запись хранения рабочей области
Если базовые данные таблиц Hive хранятся в основной учетной записи хранения рабочей области, дополнительные параметры не требуются. Она будет работать, пока вы не выполните инструкции по настройке хранилища во время создания рабочей области.
Другая учетная запись ADLS 2-го поколения
Если базовые данные каталогов Hive хранятся в другой учетной записи ADLS 2-го поколения, необходимо убедиться, что пользователи, выполняющие запросы Spark, имеют роль Участника данных больших двоичных объектов хранилища в учетной записи хранения ADLS 2-го поколения.
Настройка подключения к хранилищу BLOB-объектов
Если базовые данные таблиц Hive хранятся в учетной записи хранилища больших двоичных объектов Azure, настройте подключение следующим образом.
Откройте Synapse Studio, перейдите к параметрам Данные > связанная вкладка > Добавить >Подключение к внешним данным.
Нажмите кнопку Хранилище BLOB-объектов Azure и нажмите кнопку "Продолжить".
Укажите Имя связанной службы. Запишите имя связанной службы: оно вскоре понадобится вам в конфигурации Spark.
Выберите учетную запись службы хранилища BLOB-объектов Azure. Убедитесь, что метод проверки подлинности является ключом учетной записи. Сейчас пул Spark может обращаться к учетной записи службы хранилища больших двоичных объектов только через ключ учетной записи.
Проверьте подключение и нажмите кнопку "Создать".
После создания связанной службы с учетной записью хранения BLOB-объектов при выполнении запросов Spark убедитесь, что вы выполните приведенный ниже код Spark в записной книжке, чтобы получить доступ к учетной записи хранения BLOB-объектов для сеанса Spark. Дополнительные сведения о том, почему это необходимо сделать, см. здесь.
%%pyspark
blob_account_name = "<your blob storage account name>"
blob_container_name = "<your container name>"
from pyspark.sql import SparkSession
sc = SparkSession.builder.getOrCreate()
token_library = sc._jvm.com.microsoft.azure.synapse.tokenlibrary.TokenLibrary
blob_sas_token = token_library.getConnectionString("<blob storage linked service name>")
spark.conf.set('fs.azure.sas.%s.%s.blob.core.windows.net' % (blob_container_name, blob_account_name), blob_sas_token)
После настройки подключений к хранилищу можно запросить существующие таблицы в хранилище метаданных Hive.
Известные ограничения
- Обозреватель объектов Synapse Studio по прежнему будет показывать объекты в управляемом хранилище метаданных Synapse, а не во внешнем хранилище метаданных Hive.
- Синхронизация между SQL< и >Spark не работает при использовании внешних хранилищ метаданных Hive.
- В качестве внешнего хранилище метаданных Hive поддерживаются только База данных SQL Azure и База данных Azure MySQL. Поддерживается только авторизация SQL.
- В настоящее время Spark работает только с внешними таблицами Hive и нетранзакционными или не управляемыми ACID таблицами Hive. Он не поддерживает таблицы ACID/транзакционные таблицы Hive.
- Интеграция Apache Ranger не поддерживается.
Устранение неполадок
См. следующую ошибку при отправке запросов к таблице Hive с данными, размещенными в хранилище больших двоичных объектов
No credentials found for account xxxxx.blob.core.windows.net in the configuration, and its container xxxxx is not accessible using anonymous credentials. Please check if the container exists first. If it is not publicly available, you have to provide account credentials.
При использовании проверки подлинности ключа для учетной записи хранения через связанную службу необходимо выполнить дополнительный шаг, чтобы получить маркер для сеанса Spark. Выполните следующий код, чтобы настроить сеанс Spark перед выполнением запроса. Дополнительные сведения о том, почему это необходимо сделать, см. здесь.
%%pyspark
blob_account_name = "<your blob storage account name>"
blob_container_name = "<your container name>"
from pyspark.sql import SparkSession
sc = SparkSession.builder.getOrCreate()
token_library = sc._jvm.com.microsoft.azure.synapse.tokenlibrary.TokenLibrary
blob_sas_token = token_library.getConnectionString("<blob storage linked service name>")
spark.conf.set('fs.azure.sas.%s.%s.blob.core.windows.net' % (blob_container_name, blob_account_name), blob_sas_token)
При отправке запроса к таблице, находящейся в учетной записи ADLS 2-го поколения, см. ошибку ниже.
Operation failed: "This request is not authorized to perform this operation using this permission.", 403, HEAD
Это может произойти, так как пользователь, выполняющий запрос Spark, не имеет достаточных разрешений для доступа к базовой учетной записи хранения. Убедитесь, что пользователь, выполняющий запросы Spark, имеет роль Участник для данных BLOB-объектов хранилища в учетной записи хранения ADLS 2-го поколения. Этот шаг можно выполнить после создания связанной службы.
Чтобы избежать изменения схемы или версии HMS, следующие конфигурации Hive задаются системой по умолчанию:
spark.hadoop.hive.metastore.schema.verification true
spark.hadoop.hive.metastore.schema.verification.record.version false
spark.hadoop.datanucleus.fixedDatastore true
spark.hadoop.datanucleus.schema.autoCreateAll false
Если ваша версия HMS — 1.2.1
или 1.2.2
, в Hive возникает ошибка с требованием только версии 1.2.0
при установке параметра spark.hadoop.hive.metastore.schema.verification
в значение true
. Рекомендуется либо изменить версию HMS на 1.2.0
, либо перезаписать следующие две конфигурации, чтобы обойти эту проблему:
spark.hadoop.hive.metastore.schema.verification false
spark.hadoop.hive.synapse.externalmetastore.schema.usedefault false
Если необходимо перенести версию HMS, рекомендуется использовать средство Hive Schema Tool. Если HMS используется кластерами HDInsight, рекомендуется использовать версию, указанную в HDI.
Изменение схемы HMS для OSS HMS 3.1
Решение Synapse предназначено для беспроблемного взаимодействия с вычислительными ресурсами HDI. Однако HMS 3.1 в HDI 4.0 не полностью совместим с OSS HMS 3.1. Примените следующее вручную к HMS 3.1, если он не подготовлен HDI.
-- HIVE-19416
ALTER TABLE TBLS ADD WRITE_ID bigint NOT NULL DEFAULT(0);
ALTER TABLE PARTITIONS ADD WRITE_ID bigint NOT NULL DEFAULT(0);
Если вы хотите предоставить общий доступ к каталогу Hive с кластером Spark в HDInsight 4.0, убедитесь, что свойство spark.hadoop.metastore.catalog.default
в Synapse spark соответствует значению в HDInsight spark. Значение по умолчанию для HDI Spark — spark
, значение по умолчанию для Synapse Spark — hive
.
Как упоминалось в ограничениях, пул Synapse Spark поддерживает только внешние таблицы Hive и нетранзакционные или управляемые ACID таблицы. В настоящее время он не поддерживает таблицы ACID или транзакционные таблицы. В кластерах Hive HDInsight 4.0 все управляемые таблицы создаются как таблицы ACID / транзакционные по умолчанию, поэтому при запросе этих таблиц вы получаете пустые результаты.
java.lang.ClassNotFoundException: Class com.microsoft.vegas.vfs.SecureVegasFileSystem not found
Эту проблему можно легко устранить, добавив /usr/hdp/current/hadoop-client/*
к spark.sql.hive.metastore.jars
.
Eg:
spark.sql.hive.metastore.jars":"/opt/hive-metastore/lib-2.3/*:/usr/hdp/current/hadoop-client/lib/*:/usr/hdp/current/hadoop-client/*