Synapse Studio를 열고, 왼쪽의 관리 > 연결된 서비스로 차례로 이동한 다음, 새로 만들기를 클릭하여 새 연결된 서비스를 만듭니다.
Azure Database for MySQL을 선택하고 계속을 클릭합니다.
연결된 서비스의 이름을 제공합니다. 연결된 서비스의 이름을 기록합니다. 이 정보는 곧 Spark를 구성하는 데 사용됩니다.
Azure 구독 목록에서 외부 Hive Metastore에 대한 Azure Database for MySQL을 선택하거나 정보를 수동으로 입력합니다.
사용자 이름 및 암호를 제공하여 연결을 설정합니다.
연결을 테스트하여 사용자 이름과 암호를 확인합니다.
만들기를 클릭하여 연결된 서비스를 만듭니다.
일부 네트워크 보안 규칙 설정은 Spark 풀에서 외부 Hive Metastore DB로의 액세스를 차단할 수 있습니다. Spark 풀을 구성하기 전에 Spark 풀 Notebook에서 아래 코드를 실행하여 외부 Hive Metastore DB에 대한 연결을 테스트합니다.
또한 출력 결과에서 Hive Metastore 버전을 가져올 수 있습니다. Hive Metastore 버전은 Spark 구성에서 사용됩니다.
Warning
Hive Metastore에 잠재적인 보안 위험을 초래할 수 있으므로 암호가 하드 코딩된 테스트 스크립트를 Notebook에 게시하지 마세요.
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 Database for 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 Metastore에 연결된 서비스를 성공적으로 만든 후에는 외부 Hive Metastore를 사용하도록 몇 가지 Spark 구성을 설정해야 합니다. 구성은 Spark 풀 수준 또는 Spark 세션 수준에서 설정할 수 있습니다.
구성 및 설명은 다음과 같습니다.
참고 항목
Synapse는 HDI에서 컴퓨팅을 통해 원활하게 작동하는 것을 목표로 합니다. 그러나 HDI 4.0의 HMS 3.1은 OSS HMS 3.1과 완전히 호환되지 않습니다. OSS HMS 3.1의 경우 여기를 확인하세요.
Spark 구성 |
설명 |
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
HiveCatalog21로 명명된 연결된 서비스를 사용하는 메타스토어 버전 2.3의 예는 다음과 같습니다.
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
Notebook 세션의 경우 %%configure
매직 명령을 사용하여 Notebook에서 Spark 세션을 구성할 수도 있습니다. 코드는 다음과 같습니다.
%%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 Notebook에서 카탈로그 개체를 나열하는 아래 쿼리를 실행하여 외부 Hive Metastore에 대한 연결을 확인합니다.
spark.sql("show databases").show()
스토리지 연결 설정
Hive Metastore 데이터베이스에 연결된 서비스는 Hive 카탈로그 메타데이터에 대한 액세스만 제공합니다. 기존 테이블을 쿼리하려면 Hive 테이블의 기본 데이터도 저장하는 스토리지 계정에 대한 연결을 설정해야 합니다.
Azure Data Lake Storage Gen 2에 대한 연결 설정
작업 영역 기본 스토리지 계정
Hive 테이블의 기본 데이터가 작업 영역 기본 스토리지 계정에 저장되면 추가 설정을 수행할 필요가 없습니다. 이는 작업 영역을 만드는 중에 스토리지 설정 지침을 수행하는 동안에만 작동합니다.
다른 ADLS Gen 2 계정
Hive 카탈로그의 기본 데이터가 다른 ADLS Gen 2 계정에 저장되면 Spark 쿼리를 실행하는 사용자에게 ADLS Gen2 스토리지 계정에 대한 Storage Blob 데이터 기여자 역할이 있는지 확인해야 합니다.
Blob Storage에 대한 연결 설정
Hive 테이블의 기본 데이터가 Azure Blob 스토리지 계정에 저장되면 아래 단계에 따라 연결을 설정합니다.
Synapse Studio를 열고 데이터 > 연결됨 탭 > 추가 단추 >외부 데이터에 연결로 차례로 이동합니다.
Azure Blob Storage를 선택하고 계속을 선택합니다.
연결된 서비스의 이름을 제공합니다. 연결된 서비스의 이름을 기록합니다. 이 정보는 곧 Spark 구성에서 사용됩니다.
Azure Blob Storage 계정을 선택합니다. 인증 방법이 계정 키인지 확인합니다. 현재 Spark 풀은 계정 키를 통해서만 Blob Storage 계정에 액세스할 수 있습니다.
연결을 테스트하고 만들기를 선택합니다.
Blob Storage 계정에 연결된 서비스를 만든 후 Spark 쿼리를 실행할 때 Spark 세션에 대한 Blob Storage 계정에 액세스하려면 Notebook에서 아래 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 Metastore에서 기존 테이블을 쿼리할 수 있습니다.
알려진 제한 사항
- Synapse Studio 개체 탐색기는 외부 HMS 대신 관리되는 Synapse 메타스토어에 개체를 계속 표시합니다.
- 외부 HMS를 사용하는 경우 SQL <-> Spark 동기화가 작동하지 않습니다.
- Azure SQL Database 및 Azure Database for MySQL만 외부 Hive Metastore 데이터베이스로 지원됩니다. SQL 권한 부여만 지원됩니다.
- 현재 Spark는 외부 Hive 테이블 및 비 트랜잭션/비 ACID 관리형 Hive 테이블에서만 작동합니다. 현재 Hive ACID/트랜잭션 테이블은 지원되지 않습니다.
- Apache Ranger 통합은 지원되지 않습니다.
문제 해결
Blob Storage에 저장된 데이터를 사용하여 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 Gen2 계정에 저장된 테이블 조회 시 아래 오류 참조
Operation failed: "This request is not authorized to perform this operation using this permission.", 403, HEAD
이는 Spark 쿼리를 실행하는 사용자에게 기본 스토리지 계정에 대한 충분한 액세스 권한이 없기 때문에 발생할 수 있습니다. Spark 쿼리를 실행하는 사용자에게 ADLS Gen2 스토리지 계정에 대한 Storage Blob 데이터 기여자 역할이 있는지 확인합니다. 이 단계는 연결된 서비스를 만든 후에 수행할 수 있습니다.
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
이면 spark.hadoop.hive.metastore.schema.verification
을 true
로 전환하는 경우에만 1.2.0
이 필요하다고 요구하는 Hive 문제가 있습니다. HMS 버전을 1.2.0
으로 수정하거나 아래 두 가지 구성을 덮어써서 해결하는 것이 좋습니다.
spark.hadoop.hive.metastore.schema.verification false
spark.hadoop.hive.synapse.externalmetastore.schema.usedefault false
HMS 버전을 마이그레이션해야 하는 경우 Hive Schema Tool을 사용하는 것이 좋습니다. 그리고 HDInsight 클러스터에서 HMS를 사용한 경우 HDI 제공 버전을 사용하는 것이 좋습니다.
OSS HMS 3.1에 대한 HMS 스키마 변경
Synapse는 HDI에서 컴퓨팅을 통해 원활하게 작동하는 것을 목표로 합니다. 그러나 HDI 4.0의 HMS 3.1은 OSS HMS 3.1과 완전히 호환되지 않습니다. HDI에서 프로비전되지 않은 경우 HMS 3.1에 다음을 수동으로 적용합니다.
-- 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 카탈로그를 HDInsight 4.0의 Spark 클러스터와 공유하려면 Synapse Spark의 spark.hadoop.metastore.catalog.default
속성이 HDInsight Spark의 값과 일치하는지 확인합니다. HDI spark의 기본값은 spark
이고, Synapse spark의 기본값은 hive
입니다.
제한 사항에서 설명한 대로 Synapse Spark 풀은 외부 Hive 테이블 및 비 트랜잭션/ACID 관리형 테이블만 지원하며, 현재 Hive ACID/트랜잭션 테이블은 지원하지 않습니다. HDInsight 4.0 Hive 클러스터에서 모든 관리형 테이블은 기본적으로 ACID/트랜잭션 테이블로 만들어지므로 이러한 테이블을 쿼리하면 빈 결과를 얻습니다.
java.lang.ClassNotFoundException: Class com.microsoft.vegas.vfs.SecureVegasFileSystem not found
spark.sql.hive.metastore.jars
에 /usr/hdp/current/hadoop-client/*
를 추가하면 이 문제를 쉽게 해결할 수 있습니다.
Eg:
spark.sql.hive.metastore.jars":"/opt/hive-metastore/lib-2.3/*:/usr/hdp/current/hadoop-client/lib/*:/usr/hdp/current/hadoop-client/*