Aracılığıyla paylaş


Synapse Spark Havuzu için dış Hive Meta Veri Deposu kullanma

Not

Dış Hive meta veri depoları artık Apache Spark 3.4 için Azure Synapse Runtime'da ve Synapse'deki sonraki sürümlerde desteklenmeyecektir.

Azure Synapse Analytics, aynı çalışma alanındaki Apache Spark havuzlarının yönetilen HMS (Hive Meta Veri Deposu) ile uyumlu meta veri deposunu katalog olarak kullanmalarına olanak tanır. Müşteriler Hive kataloğu meta verilerini çalışma alanının dışında kalıcı hale getirmek ve katalog nesnelerini çalışma alanının dışındaki HDInsight ve Azure Databricks gibi diğer hesaplama altyapılarıyla paylaşmak istediklerinde, dış Hive Meta Veri Deposu'na bağlanabilirler. Bu makalede Synapse Spark'ı bir dış Apache Hive Meta Deposuna bağlamayı öğrenebilirsiniz.

Desteklenen Hive Meta Veri Deposu sürümleri

Bu özellik Spark 3.1 ile çalışır. Aşağıdaki tabloda her Spark sürümü için desteklenen Hive Meta Veri Deposu sürümleri gösterilmektedir.

Spark Sürümü HMS 2.3.x HMS 3.1.X
3.3 Yes Yes

Hive Meta Veri Deposu'na bağlı hizmeti ayarlama

Not

Dış Hive Meta Veri Deposu olarak yalnızca Azure SQL Veritabanı ve MySQL için Azure Veritabanı desteklenir. Ve şu anda yalnızca Kullanıcı Parolası kimlik doğrulamasını destekliyoruz. Sağlanan veritabanı boşsa, veritabanı şeması oluşturmak için lütfen Hive Şema Aracı aracılığıyla sağlayın.

Synapse çalışma alanında dış Hive Meta Veri Deposu'na bağlı bir hizmet ayarlamak için aşağıdaki adımları izleyin.

  1. Synapse Studio'yu açın, soldaki Bağlı hizmetleri yönet'e > gidin, yeni bir bağlı hizmet oluşturmak için Yeni'ye tıklayın.

    Hive Meta Veri Deposu bağlı hizmetini ayarlama

  2. Veritabanınızın türüne göre Azure SQL Veritabanı veya MySQL için Azure Veritabanı seçin, Devam'a tıklayın.

  3. Bağlı hizmetin Adını belirtin. Bağlı hizmetin adını kaydedin; bu bilgiler kısa süre sonra Spark'ı yapılandırmak için kullanılacaktır.

  4. Azure aboneliği listesinden dış Hive Meta Veri Deposu için Azure SQL Veritabanı/ MySQL için Azure Veritabanı seçebilir veya bilgileri el ile girebilirsiniz.

  5. Bağlantıyı ayarlamak için Kullanıcı adı ve Parola girin.

  6. Kullanıcı adını ve parolayı doğrulamak için bağlantıyı test edin.

  7. Bağlı hizmeti oluşturmak için Oluştur'a tıklayın.

Bağlantıyı test edin ve not defterinde meta veri deposu sürümünü alın

Bazı ağ güvenlik kuralı ayarları Spark havuzundan dış Hive Meta Veri Deposu VERITABANı'na erişimi engelleyebilir. Spark havuzunu yapılandırmadan önce, dış Hive Meta Veri Deposu VERITABANı bağlantısını test etmek için herhangi bir Spark havuzu not defterinde aşağıdaki kodu çalıştırın.

Hive Meta Veri Deposu sürümünüzü çıkış sonuçlarından da alabilirsiniz. Hive Meta Veri Deposu sürümü Spark yapılandırmasında kullanılır.

Azure SQL için bağlantı test kodu

%%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") 
}  

MySQL için Azure Veritabanı için bağlantı test kodu

%%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") 
}  

Spark'ı dış Hive Meta Veri Deposu kullanacak şekilde yapılandırma

Dış Hive Meta Veri Deposu'na bağlı hizmeti başarıyla oluşturduktan sonra, dış Hive Meta Veri Deposu'nı kullanmak için birkaç Spark yapılandırması ayarlamanız gerekir. Her ikisi de yapılandırmayı Spark havuzu düzeyinde veya Spark oturum düzeyinde ayarlayabilirsiniz.

Yapılandırmalar ve açıklamalar şunlardır:

Not

Synapse, HDI'den gelen işlemlerle sorunsuz bir şekilde çalışmayı hedefler. Ancak HDI 4.0'daki HMS 3.1, OSS HMS 3.1 ile tam olarak uyumlu değildir. OSS HMS 3.1 için lütfen buraya bakın.

Spark yapılandırması Açıklama
spark.sql.hive.metastore.version Desteklenen sürümler:
  • 2.3
  • 3.1
3. bölüm olmadan ilk 2 parçayı kullandığınızdan emin olun
spark.sql.hive.metastore.jars
  • Sürüm 2.3: /opt/hive-metastore/lib-2.3/*:/usr/hdp/current/hadoop-client/lib/*:/usr/hdp/current/hadoop-client/*
  • Sürüm 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 Bağlı hizmetinizin adı
spark.sql.hive.metastore.sharedPrefixes com.mysql.jdbc,com.microsoft.sqlserver,com.microsoft.vegas

Spark havuzu düzeyinde yapılandırma

Spark havuzunu oluştururken, Ek Ayarlar sekmesinin altında, bir metin dosyasına yapılandırmaların altına yerleştirin ve Apache Spark yapılandırma bölümüne yükleyin. Ayrıca mevcut Spark havuzu için bağlam menüsünü kullanabilir, apache Spark yapılandırması'nı seçerek bu yapılandırmaları ekleyebilirsiniz.

Spark havuzunu yapılandırma

Meta veri deposu sürümünü ve bağlı hizmet adını güncelleştirin ve Spark havuzu yapılandırması için bir metin dosyasına aşağıdaki yapılandırmaları kaydedin:

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.sqlserver,com.microsoft.vegas

HiveCatalog21 olarak adlandırılan bağlı hizmete sahip meta veri deposu sürüm 2.3 için bir örnek aşağıda verilmiştir:

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.sqlserver,com.microsoft.vegas

Spark oturum düzeyinde yapılandırma

Not defteri oturumu için, magic komutunu kullanarak %%configure not defterinde Spark oturumunu da yapılandırabilirsiniz. Kodu burada bulabilirsiniz.

%%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.sqlserver,com.microsoft.vegas"
    }
}

Toplu iş için aynı yapılandırma aracılığıyla SparkConfda uygulanabilir.

Bağlantıyı doğrulamak için sorgu çalıştırma

Tüm bu ayarlardan sonra, dış Hive Meta Veri Deposu bağlantısını denetlemek için Spark not defterinde aşağıdaki sorguyu çalıştırarak katalog nesnelerini listelemeyi deneyin.

spark.sql("show databases").show()

Depolama bağlantısını ayarlama

Hive Meta Veri Deposu veritabanına bağlı hizmet yalnızca Hive kataloğu meta verilerine erişim sağlar. Mevcut tabloları sorgulamak için Hive tablolarınızın temel verilerini de depolayan depolama hesabına bağlantı kurmanız gerekir.

Azure Data Lake Storage 2. Nesil bağlantısını ayarlama

Çalışma alanı birincil depolama hesabı

Hive tablolarınızın temel verileri çalışma alanı birincil depolama hesabında depolanıyorsa, ek ayarlar yapmanız gerekmez. Çalışma alanı oluşturma sırasında depolama ayarlama yönergelerini izlediğiniz sürece çalışır.

Diğer ADLS 2. Nesil hesabı

Hive kataloglarınızın temel verileri başka bir ADLS 2. Nesil hesabında depolanıyorsa, Spark sorguları çalıştıran kullanıcıların ADLS 2. Nesil depolama hesabında Depolama Blob Verileri Katkıda Bulunanı rolüne sahip olduğundan emin olmanız gerekir.

Blob Depolama bağlantısını ayarlama

Hive tablolarınızın temel verileri Azure Blob depolama hesabında depolanıyorsa bağlantıyı ayarlamak için aşağıdaki adımları izleyin:

  1. Synapse Studio'yu açın, Veri > Bağlantılı sekmesi > Ekle düğmesi >Dış verilere bağlan'a gidin.

    Depolama hesabına bağlanma

  2. Azure Blob Depolama seçin ve Devam'a tıklayın.

  3. Bağlı hizmetin Adını belirtin. Bağlı hizmetin adını kaydedin; bu bilgiler kısa süre içinde Spark yapılandırmasında kullanılacaktır.

  4. Azure Blob Depolama hesabını seçin. Kimlik doğrulama yönteminin Hesap anahtarı olduğundan emin olun. Şu anda Spark havuzu yalnızca hesap anahtarı aracılığıyla Blob Depolama hesabına erişebilir.

  5. Bağlantıyı test edin ve Oluştur'a tıklayın.

  6. Blob Depolama hesabına bağlı hizmeti oluşturduktan sonra Spark sorgularını çalıştırdığınızda, Spark oturumu için Blob Depolama hesabına erişmek için not defterinde Spark kodunun altında çalıştırdığınızdan emin olun. Bunu neden yapmanız gerektiği hakkında daha fazla bilgiyi burada bulabilirsiniz.

%%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)

Depolama bağlantılarını ayarladıktan sonra Hive Meta Veri Deposundaki mevcut tabloları sorgulayabilirsiniz.

Bilinen sınırlamalar

  • Synapse Studio nesne gezgini, dış HMS yerine yönetilen Synapse meta veri deposunda nesneleri göstermeye devam eder.
  • SQL <-> Spark eşitlemesi dış HMS kullanılırken çalışmaz.
  • Dış Hive Meta Veri Deposu veritabanı olarak yalnızca Azure SQL Veritabanı ve MySQL için Azure Veritabanı desteklenir. Yalnızca SQL yetkilendirmesi desteklenir.
  • Şu anda Spark yalnızca dış Hive tablolarında ve işlem dışı/ACID tarafından yönetilmeyen Hive tablolarında çalışır. Hive ACID/işlemsel tabloları desteklemez.
  • Apache Ranger tümleştirmesi desteklenmez.

Sorun giderme

Blob Depolama'da depolanan verilerle hive tablosunu sorgularken aşağıdaki hataya bakın

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.

Bağlı hizmet aracılığıyla depolama hesabınızda anahtar kimlik doğrulaması kullanırken Spark oturumu için belirteci almak için ek bir adım uygulamanız gerekir. Sorguyu çalıştırmadan önce Spark oturumunuzu yapılandırmak için aşağıdaki kodu çalıştırın. Bunu neden yapmanız gerektiği hakkında daha fazla bilgiyi burada bulabilirsiniz.

%%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. Nesil hesabında depolanan bir tabloyu sorgularken aşağıdaki hataya bakın

Operation failed: "This request is not authorized to perform this operation using this permission.", 403, HEAD

Bunun nedeni, Spark sorgusunu çalıştıran kullanıcının temel alınan depolama hesabında yeterli erişime sahip olmamasıdır. Spark sorguları çalıştıran kullanıcının ADLS 2. Nesil depolama hesabında Depolama Blob Verileri Katkıda Bulunanı rolüne sahip olduğundan emin olun. Bu adım, bağlı hizmet oluşturulduktan sonra gerçekleştirilebilir.

HMS arka uç şemasının/sürümünün değiştirilmesini önlemek için aşağıdaki hive yapılandırmaları varsayılan olarak sistem tarafından ayarlanır:

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 sürümünüz veya 1.2.2ise1.2.1, Hive'da yalnızca 1.2.0 adresine dönmeniz spark.hadoop.hive.metastore.schema.verification truedurumunda gerektiren bir sorun vardır. Önerimiz, HMS sürümünüzü 1.2.0olarak değiştirebilir veya geçici çözüm olarak aşağıdaki iki yapılandırmanın üzerine yazabilirsiniz:

spark.hadoop.hive.metastore.schema.verification false 
spark.hadoop.hive.synapse.externalmetastore.schema.usedefault false

HMS sürümünüzü geçirmeniz gerekiyorsa hive şema aracını kullanmanızı öneririz. HMS HDInsight kümeleri tarafından kullanıldıysa HDI tarafından sağlanan sürümü kullanmanızı öneririz.

OSS HMS 3.1 için HMS şema değişikliği

Synapse, HDI'den gelen işlemlerle sorunsuz bir şekilde çalışmayı hedefler. Ancak HDI 4.0'daki HMS 3.1, OSS HMS 3.1 ile tam olarak uyumlu değildir. Bu nedenle, HDI tarafından sağlanmamışsa lütfen aşağıdakileri HMS 3.1'inize el ile uygulayın.

-- HIVE-19416
ALTER TABLE TBLS ADD WRITE_ID bigint NOT NULL DEFAULT(0);
ALTER TABLE PARTITIONS ADD WRITE_ID bigint NOT NULL DEFAULT(0);

Meta veri depoyu HDInsight 4.0 Spark kümesiyle paylaşırken tabloları göremiyorum

Hive kataloğunu HDInsight 4.0'daki bir spark kümesiyle paylaşmak istiyorsanız Synapse spark'taki özelliğinizin spark.hadoop.metastore.catalog.default HDInsight spark'taki değerle uyumlu olduğundan emin olun. HDI Spark için varsayılan değer spark, Synapse Spark için ise varsayılan değer hive şeklindedir.

Hive Meta Veri Deposu'nu HDInsight 4.0 Hive kümesiyle paylaşırken tabloları başarıyla listeleyebilirim, ancak tabloyu sorgularken yalnızca boş sonuç elde ederim

Sınırlamalarda belirtildiği gibi Synapse Spark havuzu yalnızca dış hive tablolarını ve işlem dışı/ACID ile yönetilen tabloları destekler; şu anda Hive ACID/işlem tablolarını desteklemez. HDInsight 4.0 Hive kümelerinde, tüm yönetilen tablolar varsayılan olarak ACID/işlem tabloları olarak oluşturulur, bu nedenle bu tabloları sorgularken boş sonuçlar alırsınız.

Akıllı önbellek etkinken dış meta veri deposu kullanıldığında aşağıdaki hataya bakın

java.lang.ClassNotFoundException: Class com.microsoft.vegas.vfs.SecureVegasFileSystem not found

bu sorunu, öğesinin spark.sql.hive.metastore.jarssonuna ekleyerek /usr/hdp/current/hadoop-client/* kolayca düzeltebilirsiniz.

Eg: 
spark.sql.hive.metastore.jars":"/opt/hive-metastore/lib-2.3/*:/usr/hdp/current/hadoop-client/lib/*:/usr/hdp/current/hadoop-client/*