Metastore Apache Hive eksternal (warisan)

Artikel ini menjelaskan cara menyiapkan kluster Azure Databricks agar tersambung ke metastore Apache Hive eksternal yang sudah ada. Artikel ini memberikan informasi mengenai penyiapan metastore yang direkomendasikan dan persyaratan konfigurasi kluster, yang diikuti dengan instruksi untuk mengonfigurasi kluster agar tersambung ke metastore eksternal. Untuk versi pustaka Apache Hive yang disertakan dalam Databricks Runtime, lihat catatan rilis versi Databricks Runtime yang relevan.

Penting

  • Meskipun SQL Server berfungsi sebagai database metastore yang mendasar untuk Apache Hive 2.0 ke atas, contoh-contoh yang tercantum dalam artikel ini menggunakan database Azure SQL.
  • Untuk informasi tentang kompatibilitas metastore Apache Hive dengan HDInsight, lihat Menggunakan penyimpanan metadata eksternal di Azure HDInsight.
  • Jika Anda menggunakan Azure Database for MySQL sebagai metastore eksternal, Anda harus mengubah nilai properti lower_case_table_names dari 1 (default) menjadi 2 dalam konfigurasi database sisi server. Untuk detailnya, lihat Sensitivitas Kasus Pengidentifikasi.

Catatan

Menggunakan metastores eksternal adalah model tata kelola data warisan. Databricks merekomendasikan agar Anda meningkatkan ke Unity Catalog. Unity Catalog menyederhanakan keamanan dan tata kelola data Anda dengan menyediakan tempat terpusat untuk mengelola dan mengaudit akses data di beberapa ruang kerja di akun Anda. Lihat Apakah itu Katalog Unity?.

Penyiapan metastore Apache Hive

Klien metastore yang berjalan di dalam kluster tersambung ke database metastore yang mendasari milik Anda secara langsung dengan menggunakan JDBC.

Untuk menguji konektivitas jaringan dari kluster ke metastore, Anda dapat menjalankan perintah berikut di dalam buku catatan:

%sh
nc -vz <DNS name> <port>

lokasi

  • <DNS name> adalah nama server Azure SQL Database.
  • <port> adalah port database.

Konfigurasi klaster

Anda harus mengatur dua set opsi konfigurasi untuk menyambungkan kluster ke metastore eksternal:

  • Opsi Spark mengonfigurasi Spark dengan versi metastore Apache Hive dan JAR untuk klien metastore.
  • Opsi Apache Hive mengonfigurasi klien metastore untuk menyambungkan ke metastore eksternal.

Opsi konfigurasi Spark

Atur spark.sql.hive.metastore.version ke versi metastore Apache Hive Anda dan spark.sql.hive.metastore.jars sebagai berikut:

  • Apache Hive 0.13: jangan atur spark.sql.hive.metastore.jars.

    Catatan

    Apache Hive 1.2.0 dan 1.2.1 bukanlah metastore bawaan di Runtime bahasa umum Databricks 7.0 ke atas. Jika Anda ingin menggunakan Apache Hive 1.2.0 atau 1.2.1 dengan Runtime bahasa umum Databricks 7.0 ke atas, ikuti prosedur yang dijelaskan dalam Mengunduh jar metastore dan mengarahkan ke hasil unduhan.

  • Apache Hive 2.3.7 (Databricks Runtime 7.0 - 9.x) atau Apache Hive 2.3.9 (Databricks Runtime 10.0 dan yang lebih baru): atur spark.sql.hive.metastore.jars ke builtin.

  • Untuk versi Apache Hive yang lain, Azure Databricks merekomendasikan agar Anda mengunduh JAR metastore dan mengatur konfigurasi spark.sql.hive.metastore.jars supaya mengarahkan ke JAR yang telah diunduh dengan menggunakan prosedur yang dijelaskan di Mengunduh jar metastore dan mengarahkan ke hasil unduhan.

Mengunduh jar metastore dan mengarahkan ke hasil unduhan

  1. Buat kluster dengan spark.sql.hive.metastore.jars yang diatur ke maven dan spark.sql.hive.metastore.version agar sesuai dengan versi metastore Anda.

  2. Saat kluster berjalan, cari log driver dan temukan baris seperti berikut:

    17/11/18 22:41:19 INFO IsolatedClientLoader: Downloaded metastore jars to <path>
    

    Direktori <path> adalah lokasi JAR yang telah diunduh di node driver kluster.

    Atau, Anda dapat menjalankan kode berikut di buku catatan Scala untuk mencetak lokasi JAR tersebut:

    import com.typesafe.config.ConfigFactory
    val path = ConfigFactory.load().getString("java.io.tmpdir")
    
    println(s"\nHive JARs are downloaded to the path: $path \n")
    
  3. Jalankan %sh cp -r <path> /dbfs/hive_metastore_jar (mengganti <path> dengan info kluster Anda) untuk menyalin direktori ini ke direktori di akar DBFS yang dipanggil hive_metastore_jar melalui klien DBFS di simpul driver.

  4. Buat skrip init yang menyalin /dbfs/hive_metastore_jar ke sistem file lokal simpul, pastikan untuk membuat skrip init tidur beberapa detik sebelum mengakses klien DBFS. Tindakan ini memastikan bahwa klien sudah siap.

  5. Atur spark.sql.hive.metastore.jars untuk menggunakan direktori ini. Jika skrip init Anda menyalin /dbfs/hive_metastore_jar ke /databricks/hive_metastore_jars/, atur spark.sql.hive.metastore.jars ke /databricks/hive_metastore_jars/*. Lokasi harus menyertakan /* berikutnya.

  6. Mulai ulang kluster.

Opsi konfigurasi Apache Hive

Bagian ini menjelaskan opsi khusus untuk Apache Hive.

Untuk menyambungkan ke metastore eksternal dengan menggunakan mode lokal, atur opsi konfigurasi Apache Hive berikut:

# 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

lokasi

  • <mssql-connection-string> adalah string koneksi JDBC (yang bisa Anda dapatkan di portal Azure). Anda tidak perlu menyertakan nama pengguna dan kata sandi dalam string koneksi, karena akan diatur oleh javax.jdo.option.ConnectionUserName dan javax.jdo.option.ConnectionDriverName.
  • <mssql-username>dan <mssql-password> menentukan nama pengguna dan kata sandi akun Azure SQL Database Anda yang memiliki akses baca/tulis ke database.

Catatan

Untuk lingkungan produksi, kami sarankan agar Anda mengatur hive.metastore.schema.verification menjadi true. Tindakan ini mencegah klien metastore Apache Hive memodifikasi skema database metastore secara implisit saat versi klien metastore tidak cocok dengan versi database metastore. Saat mengaktifkan pengaturan ini untuk versi klien metastore yang lebih rendah dari Apache Hive 1.2.0, pastikan bahwa klien metastore memiliki izin tulis ke database metastore (untuk mencegah masalah yang dijelaskan dalam HIVE-9749).

  • Untuk metastore Apache Hive 1.2.0 dan yang lebih tinggi, atur hive.metastore.schema.verification.record.version ke true untuk mengaktifkan hive.metastore.schema.verification.
  • Untuk metastore Apache Hive 2.1.1 dan versi yang lebih tinggi, atur hive.metastore.schema.verification.record.version ke true seperti saat diatur menjadi false secara default.

Menyiapkan metastore eksternal dengan menggunakan antarmuka pengguna

Cara menyiapkan metastore eksternal dengan menggunakan antarmuka pengguna Azure Databricks:

  1. Klik tombol Kluster di bar samping.

  2. Klik Buat Kluster.

  3. Masukkan opsi konfigurasi Spark berikut:

    # 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>
    
  4. Lanjutkan konfigurasi kluster Anda, ikuti instruksi dalam Referensi konfigurasi komputasi.

  5. Klik Buat Kluster untuk membuat kluster.

Menyiapkan metastore eksternal dengan menggunakan skrip init

Skrip Init memungkinkan Anda tersambung ke metastore Apache Hive yang sudah ada tanpa mengatur konfigurasi yang diperlukan secara manual.

  1. Buat direktori dasar tempat Anda ingin menyimpan skrip init jika direktori tersebut tidak ada. Contoh berikut menggunakan dbfs:/databricks/scripts.
  2. Jalankan cuplikan kode berikut di buku catatan. Cuplikan kode akan membuat skrip init /databricks/scripts/external-metastore.sh di Sistem File Databricks (DBFS). Atau, Anda dapat menggunakan operasi put DBFS REST API untuk membuat skrip init. Skrip init ini menulis opsi konfigurasi yang diperlukan ke file konfigurasi bernama 00-custom-spark.conf dalam format seperti JSON di /databricks/driver/conf/ dalam setiap node kluster kapan pun kluster dengan nama yang ditentukan sebagai <cluster-name> mulai. Azure Databricks menyediakan konfigurasi Spark default dalam file /databricks/driver/conf/spark-branch.conf. File konfigurasi dalam direktori /databricks/driver/conf berlaku dalam urutan abjad terbalik. Jika Anda ingin mengubah nama file 00-custom-spark.conf, pastikan bahwa file tersebut terus berlaku sebelum file 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
)
  1. Konfigurasikan kluster Anda dengan skrip init.
  2. Mulai ulang kluster.

Pemecahan Masalah

Kluster tidak memulai (karena pengaturan skrip init yang salah)

Jika skrip init untuk menyiapkan metastore eksternal menyebabkan pembuatan kluster gagal, konfigurasikan skrip init untuk mencatat, dan debug skrip init menggunakan log.

Kesalahan dalam pernyataan SQL: InvocationTargetException

  • Pola pesan kesalahan dalam jejak tumpukan pengecualian penuh:

    Caused by: javax.jdo.JDOFatalDataStoreException: Unable to open a test connection to the given database. JDBC url = [...]
    

    Informasi sambungan JDBC metastore eksternal salah dikonfigurasi. Verifikasikan nama host, port, nama pengguna, kata sandi, dan nama kelas driver JDBC yang dikonfigurasi. Selain itu, pastikan juga bahwa nama pengguna memiliki izin yang tepat untuk mengakses database metastore.

  • Pola pesan kesalahan dalam jejak tumpukan pengecualian penuh:

    Required table missing : "`DBS`" in Catalog "" Schema "". DataNucleus requires this table to perform its persistence operations. [...]
    

    Database metastore eksternal tidak diinsialisasi dengan benar. Verifikasi bahwa Anda telah membuat database metastore dan memasukkan nama database yang benar dalam string koneksi JDBC. Kemudian, mulai kluster baru dengan dua opsi konfigurasi Spark berikut:

    datanucleus.schema.autoCreateTables true
    datanucleus.fixedDatastore false
    

    Dengan cara ini, pustaka klien Apache Hive akan mencoba membuat dan menginisialisasi tabel dalam database metastore secara otomatis saat Apache Hive mencoba mengaksesnya tetapi tidak ada tabel yang dimaksud.

Kesalahan dalam pernyataan SQL: AnalysisException: Tidak dapat membuat instans org.apache.hadoop.hive.metastore.HiveMetastoreClient

Pesan kesalahan dalam stacktrace pengecualian penuh:

The specified datastore driver (driver name) was not found in the CLASSPATH

Kluster dikonfigurasi agar menggunakan driver JDBC yang salah.

Mengatur datanucleus.autoCreateSchema ke true tidak berfungsi seperti yang diharapkan

Secara default, Databricks juga mengatur datanucleus.fixedDatastore ke true, sehingga mencegah perubahan struktural yang tidak disengaja pada database metastore. Oleh karena itu, pustaka klien Apache Hive tidak dapat membuat tabel metastore bahkan jika Anda mengatur datanucleus.autoCreateSchema menjadi true. Secara umum, strategi ini lebih aman untuk digunakan dalam lingkungan produksi karena mencegah database metastore ditingkatkan secara tidak sengaja.

Jika Anda ingin menggunakan datanucleus.autoCreateSchema untuk membantu menginisialisasi database metastore, pastikan bahwa Anda mengatur datanucleus.fixedDatastore menjadi false. Selain itu, Anda mungkin ingin membalik kedua bendera setelah menginisialisasi database metastore guna memberikan perlindungan yang lebih baik terhadap lingkungan produksi Anda.