Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Azure Synapse Analytics memungkinkan kumpulan Spark Apache di ruang kerja yang sama untuk berbagi metastore yang kompatibel dengan HMS (Apache Hive Metastore Service) terkelola sebagai katalog mereka. Saat pelanggan ingin berbagi objek katalog dengan mesin komputasi lain di luar ruang kerja, seperti kluster HDInsight Apache Hive dan Spark, mereka lebih memilih untuk terhubung ke Metastore Apache Hive eksternal. Pada artikel ini, Anda akan mempelajari cara menghubungkan Synapse Spark ke Apache Hive Metastore eksternal.
Versi metastore Apache Hive yang didukung
Fitur ini bekerja dengan Spark 2.4 dan Spark 3.0. Tabel berikut menunjukkan versi layanan metastore Apache Hive (HMS) yang didukung untuk setiap versi Spark.
Versi Spark | HMS 1.2.X | HMS 2.1.X | HMS 2.3.x | HMS 3.1.X |
---|---|---|---|---|
2.4 | Ya | Ya | Ya | Tidak |
3 | Ya | Ya | Ya | Ya |
Catatan
Anda dapat menggunakan metastore Apache Hive eksternal yang ada dari kluster HDInsight, baik kluster 3.6 maupun 4.0. Lihat menggunakan penyimpanan metadata eksternal di Azure HDInsight. Ikuti langkah-langkah berikut untuk menyiapkan layanan tertaut ke metastore Apache Hive eksternal dan penyimpanan katalog yang mendasar di ruang kerja Synapse, dan konfigurasikan kumpulan Spark untuk menggunakan metastore Apache Hive eksternal yang ditautkan.
Menyiapkan layanan tertaut metastore Apache Hive
Catatan
Hanya Azure SQL Database yang didukung sebagai metastore Apache Hive eksternal. Ikuti langkah-langkah untuk menyiapkan layanan tertaut ke metastore Apache Hive eksternal di ruang kerja Synapse.
Buka Synapse Studio, buka Kelola > Layanan tertaut di sebelah kiri, klik Baru untuk membuat layanan tertaut baru.
Pilih Azure SQL Database, klik Lanjutkan.
Berikan Nama layanan tertaut. Catat nama layanan tertaut, info ini digunakan untuk segera mengonfigurasi Spark.
Anda dapat memilih Azure SQL Database untuk metastore Apache Hive eksternal dari daftar langganan Azure, atau memasukkan info secara manual.
Saat ini kami hanya mendukung autentikasi SQL sebagai jenis Autentikasi. Berikan Nama pengguna dan Kata sandi untuk menyiapkan sambungan.
Uji koneksi untuk memverifikasi nama pengguna dan kata sandi.
Klik Buat untuk membuat layanan tertaut.
Menguji koneksi dan mendapatkan versi metastore di notebook
Beberapa pengaturan aturan keamanan jaringan dapat memblokir akses dari kumpulan Spark ke Database metastore Apache Hive eksternal. Sebelum Anda mengonfigurasi kumpulan Spark, jalankan kode berikut di notebook kumpulan Spark apa pun untuk menguji koneksi ke DB metastore Apache Hive eksternal.
Anda juga bisa mendapatkan versi metastore Apache Hive Anda dari hasil keluaran. Versi metastore Apache Hive digunakan dalam konfigurasi Spark.
%%spark
import java.sql.DriverManager
/** this 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")
}
Konfigurasikan Spark untuk menggunakan metastore Apache Hive eksternal
Setelah berhasil membuat layanan tertaut ke metastore Apache Hive eksternal, Anda perlu menyiapkan beberapa konfigurasi di Spark untuk menggunakan metastore Apache Hive eksternal. Anda berdua dapat mengatur konfigurasi di tingkat kumpulan Spark, atau di tingkat sesi Spark.
Berikut konfigurasi dan penjelasannya:
Catatan
Versi metastore Apache Hive Default adalah 2.3. Anda tidak perlu menyetel spark.sql.hive.metastore.version
dan spark.sql.hive.metastore.jars
jika versi metastore Apache Hive Anda adalah 2.3. Hanya spark.hadoop.hive.synapse.externalmetastore.linkedservice.name
yang diperlukan.
Konfigurasi Spark | Deskripsi |
---|---|
spark.sql.hive.metastore.version |
Versi yang didukung:
|
spark.sql.hive.metastore.jars |
|
spark.hadoop.hive.synapse.externalmetastore.linkedservice.name |
Nama layanan tertaut Anda yang dibuat ke Azure SQL Database. |
Konfigurasikan kumpulan Spark
Saat Anda membuat kumpulan Spark, di bawah tab Pengaturan tambahan, letakkan konfigurasi di bawah ini dalam file teks dan unggah di bagian konfigurasi Apache Spark. Anda juga dapat menggunakan menu konteks untuk kumpulan Spark yang ada. Pilih konfigurasi Apache Spark untuk menambahkan konfigurasi ini.
Perbarui versi metastore dan nama layanan tertaut, dan simpan konfigurasi di bawah ini dalam file teks untuk konfigurasi kumpulan Spark:
spark.sql.hive.metastore.version <your hms version, Make sure you use the first 2 parts without the third part>
spark.hadoop.hive.synapse.externalmetastore.linkedservice.name <your linked service name to Azure SQL DB>
spark.sql.hive.metastore.jars /opt/hive-metastore/lib-<your hms version, 2 parts>/*:/usr/hdp/current/hadoop-client/lib/*
Berikut adalah contoh untuk metastore versi 2.1 dengan layanan tertaut bernama HiveCatalog21:
spark.sql.hive.metastore.version 2.1
spark.hadoop.hive.synapse.externalmetastore.linkedservice.name HiveCatalog21
spark.sql.hive.metastore.jars /opt/hive-metastore/lib-2.1/*:/usr/hdp/current/hadoop-client/lib/*
Konfigurasikan sesi Spark
Jika Anda tidak ingin mengkonfigurasi kumpulan Spark Anda, Anda juga dapat mengkonfigurasi sesi Spark di buku catatan menggunakan perintah ajaib %%configure. Ini kodenya. Konfigurasi yang sama juga dapat diterapkan ke tugas batch Spark.
%%configure -f
{
"conf":{
"spark.sql.hive.metastore.version":"<your linked service name to Azure SQL DB>",
"spark.hadoop.hive.synapse.externalmetastore.linkedservice.name":"<your linked service name to Azure SQL DB>",
"spark.sql.hive.metastore.jars":"/opt/hive-metastore/lib-<your hms version, 2 parts>/*:/usr/hdp/current/hadoop-client/lib/*"
}
}
Jalankan kueri untuk memverifikasi koneksi
Setelah semua pengaturan ini, coba cantumkan objek katalog dengan menjalankan kueri di bawah ini di buku catatan Spark untuk memeriksa konektivitas ke Metastore Apache Hive eksternal.
spark.sql("show databases").show()
Siapkan koneksi penyimpanan
Layanan tertaut ke database metastore Apache Hive hanya menyediakan akses ke metadata katalog Apache Hive. Untuk membuat kueri tabel yang ada, Anda perlu menyiapkan koneksi ke akun penyimpanan yang juga menyimpan data dasar untuk tabel Apache Hive Anda.
Siapkan koneksi ke ADLS Gen 2
Akun penyimpanan utama ruang kerja
Jika data dasar tabel Apache Hive Anda disimpan di akun penyimpanan utama ruang kerja, Anda tidak perlu melakukan pengaturan tambahan. Ini berfungsi selama Anda mengikuti instruksi penyiapan penyimpanan selama pembuatan ruang kerja.
Akun ADLS Gen 2 lainnya
Jika data dasar katalog Apache Hive Anda disimpan di akun ADLS Gen 2 lain, Anda perlu memastikan bahwa pengguna yang menjalankan kueri Spark memiliki peran Kontributor Data Blob Penyimpanan di akun penyimpanan ADLS Gen2.
Menyiapkan koneksi ke Penyimpanan Blob
Jika data yang mendasar dari tabel Apache Hive Anda disimpan di akun penyimpanan Azure Blob, siapkan koneksi dengan mengikuti langkah-langkah di bawah ini:
Buka Synapse Studio, buka Data > tab Tautan > Tambahkan tombol >Sambungkan ke data eksternal.
Pilih Azure Blob Storage dan klik Lanjutkan.
Berikan Nama layanan tertaut. Catat nama layanan tertaut, info ini akan segera digunakan dalam konfigurasi sesi Spark.
Pilih akun Azure Blob Storage. Pastikan metode Autentikasi adalah Kunci akun. Saat ini kumpulan Spark hanya dapat mengakses akun Blob Storage melalui kunci akun.
Uji koneksi dan klik Buat.
Setelah membuat layanan tertaut ke akun Blob Storage, saat Anda menjalankan kueri Spark, pastikan Anda menjalankan kode Spark di bawah ini di notebook untuk mendapatkan akses ke akun Blob Storage untuk sesi Spark. Pelajari lebih lanjut tentang mengapa Anda perlu melakukan ini di sini.
%%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)
Setelah menyiapkan koneksi penyimpanan, Anda dapat mengkueri tabel yang ada di Metastore Apache Hive.
Pembatasan yang diketahui
- Penjelajah objek Synapse Studio terus menampilkan objek di metastore Synapse terkelola alih-alih HMS eksternal, kami meningkatkan pengalaman.
- SQL <-> sinkronisasi spark tidak berfungsi saat menggunakan HMS eksternal.
- Hanya Azure SQL Database yang didukung sebagai database Metastore Apache Hive eksternal. Hanya otorisasi SQL yang didukung.
- Saat ini Spark hanya berfungsi tabel Apache Hive eksternal dan tabel Apache Hive yang dikelola non-transaksi/non-ACID. Hal itu tidak mendukung Apache Hive ACID/tabel transaksi saat ini.
- Integrasi Apache Ranger tidak didukung mulai sekarang.
Pemecahan Masalah
Lihat kesalahan di bawah ini saat mengkueri tabel Apache Hive dengan data yang disimpan di Blob Storage
Py4JJavaError : An error occurred while calling o241.load. : org.apache.hadoop.fs.azure.AzureException: org.apache.hadoop.fs.azure.AzureException: No credentials found for account demohdicatalohdistorage.blob.core.windows.net in the configuration, and its container demohdicatalog-2021-07-15t23-42-51-077z isn't accessible using anonymous credentials. Please check if the container exists first. If it isn't publicly available, you have to provide account credentials.
Saat Anda menggunakan autentikasi kunci ke akun penyimpanan Anda melalui layanan tertaut, Anda perlu mengambil langkah tambahan untuk mendapatkan token untuk sesi Spark. Jalankan kode di bawah ini untuk mengonfigurasi sesi Spark Anda sebelum menjalankan kueri. Pelajari lebih lanjut tentang mengapa Anda perlu melakukan ini di sini.
%%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)
Lihat kesalahan di bawah ini saat mengkueri tabel yang disimpan di akun ADLS Gen2
Py4JJavaError : An error occurred while calling o305.load. : Operation failed: "This request isn't authorized to perform this operation using this permission.", 403, HEAD
Hal ini bisa terjadi karena pengguna yang menjalankan kueri Spark tidak memiliki cukup akses ke akun penyimpanan yang mendasarinya. Pastikan pengguna yang menjalankan kueri Spark memiliki peran Kontributor Data Blob Penyimpanan di akun penyimpanan ADLS Gen2. Langkah ini dapat dilakukan nanti setelah membuat layanan tertaut.
Pengaturan terkait skema HMS
Untuk menghindari perubahan skema/versi backend HMS, konfigurasi apache hive berikut diatur oleh sistem secara default:
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
Jika versi HMS Anda adalah 1.2.1 atau 1.2.2, ada masalah di Apache Hive yang mengklaim hanya membutuhkan 1.2.0 jika Anda mengubah spark.hadoop.hive.metastore.schema.verification menjadi true. Saran kami adalah Anda dapat memodifikasi versi HMS Anda menjadi 1.2.0, atau menimpa dua konfigurasi di bawah ini untuk mengatasinya:
spark.hadoop.hive.metastore.schema.verification false
spark.hadoop.hive.synapse.externalmetastore.schema.usedefault false
Jika Anda perlu memigrasikan versi HMS, sebaiknya gunakan alat skema hive. Jika HMS telah digunakan oleh kluster HDInsight, sebaiknya gunakan versi yang disediakan HDI.
Saat berbagi metastore dengan kluster HDInsight 4.0 Spark, saya tidak dapat melihat tabel
Jika Anda ingin berbagi katalog Apache Hive dengan kluster spark di HDInsight 4.0, pastikan properti spark.hadoop.metastore.catalog.default
Anda di Synapse spark selaras dengan nilai dalam spark HDInsight. Nilai defaultnya adalah Spark
.
Saat berbagi metastore Apache Hive dengan kluster Apache Hive HDInsight 4.0, saya dapat membuat daftar tabel dengan sukses, tetapi hanya mendapatkan hasil kosong ketika saya mengkueri tabel
Seperti yang disebutkan dalam batasan, kumpulan Spark Synapse hanya mendukung tabel Apache Hive eksternal dan tabel yang dikelola non-transaksional/ACID, saat ini tidak mendukung ACID/tabel transaksi Apache Hive. Secara default di kluster Apache Hive HDInsight 4.0, semua tabel terkelola dibuat sebagai ACID/tabel transaksi secara default, itulah sebabnya Anda mendapatkan hasil kosong saat mengkueri tabel tersebut.