Dış Apache Hive meta veri deposu (eski)

Bu makalede, mevcut dış Apache Hive meta veri depolarına bağlanmak için Azure Databricks kümelerinin nasıl ayarlanacağı açıklanır. Önerilen meta veri deposu kurulumu ve küme yapılandırma gereksinimleri hakkında bilgi sağlar ve ardından kümeleri bir dış meta veri deposuna bağlanacak şekilde yapılandırma yönergelerini sağlar. Databricks Runtime'da bulunan Hive kitaplığı sürümleri için ilgili Databricks Runtime sürüm sürüm notlarına bakın.

Önemli

  • SQL Server, Hive 2.0 ve üzeri için temel meta veri deposu veritabanı olarak çalışsa da, bu makaledeki örneklerde Azure SQL Veritabanı kullanılır.
  • HDInsight ile Hive meta veri deposu uyumluluğu hakkında bilgi için bkz . Azure HDInsight'ta dış meta veri depolarını kullanma.
  • dış meta veri deposu olarak MySQL için Azure Veritabanı kullanıyorsanız, sunucu tarafı veritabanı yapılandırmasında lower_case_table_names özelliğin değerini 1 (varsayılan) yerine 2 olarak değiştirmeniz gerekir. Ayrıntılar için bkz . Tanımlayıcı Büyük/Küçük Harf Duyarlılığı.

Not

Dış meta veri depolarını kullanmak eski bir veri idare modelidir. Databricks, Unity Kataloğu'na yükseltmenizi önerir. Unity Kataloğu, hesabınızdaki birden çok çalışma alanında veri erişimini yönetmek ve denetlemek için merkezi bir yer sağlayarak verilerinizin güvenliğini ve idaresini basitleştirir. Bkz. Unity Kataloğu nedir?.

Hive meta veri deposu kurulumu

Bir küme içinde çalışan meta veri deposu istemcisi, JDBC kullanarak temel alınan meta veri deposu veritabanınıza doğrudan bağlanır.

Bir kümeden meta veri deposuna ağ bağlantısını test etmek için not defteri içinde aşağıdaki komutu çalıştırabilirsiniz:

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

burada:

  • <DNS name>Azure SQL Veritabanı sunucu adıdır.
  • <port> , veritabanının bağlantı noktasıdır.

Küme yapılandırmaları

Bir kümeyi dış meta veri deposuna bağlamak için iki yapılandırma seçeneği kümesi ayarlamanız gerekir:

  • Spark seçenekleri Spark'ı Hive meta veri deposu sürümü ve meta veri deposu istemcisi için JAR'ler ile yapılandırır.
  • Hive seçenekleri , meta veri deposu istemcisini dış meta veri deposuna bağlanacak şekilde yapılandırıyor.

Spark yapılandırma seçenekleri

Hive meta veri deponuzun sürümüne ve spark.sql.hive.metastore.jars aşağıdaki gibi ayarlayınspark.sql.hive.metastore.version:

  • Hive 0.13: ayarlamayın spark.sql.hive.metastore.jars.

    Not

    Hive 1.2.0 ve 1.2.1, Databricks Runtime 7.0 ve üzeri sürümlerin yerleşik meta veri deposu değildir. Hive 1.2.0 veya 1.2.1'i Databricks Runtime 7.0 ve üzeri sürümlerle kullanmak istiyorsanız, Meta veri deposu jar'larını indirme bölümünde açıklanan yordamı izleyin ve bunlara işaret edin.

  • Hive 2.3.7 (Databricks Runtime 7.0 - 9.x) veya Hive 2.3.9 (Databricks Runtime 10.0 ve üzeri): olarak builtinayarlanırspark.sql.hive.metastore.jars.

  • Diğer tüm Hive sürümleri için Azure Databricks, meta veri deposu JAR'lerini indirmenizi ve meta veri deposu jar'larını indirme ve bunlara işaret etme bölümünde açıklanan yordamı kullanarak yapılandırmayı spark.sql.hive.metastore.jars indirilen JAR'lere işaret etmek üzere ayarlamanızı önerir.

Meta veri deposu jar'larını indirin ve üzerine gelin

  1. meta veri deponuzun sürümüyle spark.sql.hive.metastore.jars eşleşecek ve olarak ayarlanmış mavenspark.sql.hive.metastore.version bir küme oluşturun.

  2. Küme çalışırken sürücü günlüğünde arama yapın ve aşağıdakine benzer bir satır bulun:

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

    Dizin <path> , kümenin sürücü düğümünde indirilen JAR'lerin konumudur.

    Alternatif olarak, JAR'ların konumunu yazdırmak için scala not defterinde aşağıdaki kodu çalıştırabilirsiniz:

    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. Bu dizini sürücü düğümündeki DBFS istemcisi aracılığıyla çağrılan hive_metastore_jar DBFS kökündeki bir dizine kopyalamak için komutunu çalıştırın %sh cp -r <path> /dbfs/hive_metastore_jar (öğesini kümenizin bilgileriyle değiştirerek<path>).

  4. Düğümün yerel dosya sistemine kopyalayan /dbfs/hive_metastore_jar bir init betiği oluşturun ve init betiğinin DBFS istemcisine erişmeden birkaç saniye önce uyku moduna geçmesine emin olun. Bu, istemcinin hazır olmasını sağlar.

  5. Bu dizini kullanmak için spark.sql.hive.metastore.jars ayarını yapın. Init betiğiniz /dbfs/hive_metastore_jar öğesini /databricks/hive_metastore_jars/ konumuna kopyalıyorsa, spark.sql.hive.metastore.jars öğesini /databricks/hive_metastore_jars/* olarak ayarlayın. Konumun sonuna /* eklenmelidir.

  6. Kümeyi yeniden başlatın.

Hive yapılandırma seçenekleri

Bu bölümde Hive'a özgü seçenekler açıklanmaktadır.

Yerel modu kullanarak bir dış meta veri deposuna bağlanmak için aşağıdaki Hive yapılandırma seçeneklerini ayarlayın:

# 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

burada:

  • <mssql-connection-string>JDBC bağlantı dizesi (Azure portalından alabilirsiniz). ve tarafından javax.jdo.option.ConnectionUserNamejavax.jdo.option.ConnectionDriverNameayarlanacağından, bağlantı dizesi kullanıcı adı ve parola eklemeniz gerekmez.
  • <mssql-username>ve <mssql-password> veritabanına okuma/yazma erişimi olan Azure SQL Veritabanı hesabınızın kullanıcı adını ve parolasını belirtin.

Not

Üretim ortamları için olarak ayarlamanızı hive.metastore.schema.verificationtrueöneririz. Bu, meta veri deposu istemci sürümü meta veri deposu veritabanı sürümüyle eşleşmediğinde Hive meta veri deposu istemcisinin meta veri deposu veritabanı şemasını örtük olarak değiştirmesini engeller. Hive 1.2.0'dan düşük meta veri deposu istemci sürümleri için bu ayarı etkinleştirirken meta veri deposu istemcisinin meta veri deposu veritabanına yazma iznine sahip olduğundan emin olun (HIVE-9749'da açıklanan sorunu önlemek için).

  • Hive meta veri deposu 1.2.0 ve üzeri için,'yi etkinleştirmek hive.metastore.schema.verificationiçin true olarak ayarlayınhive.metastore.schema.verification.record.version.
  • Hive meta veri deposu 2.1.1 ve üzeri hive.metastore.schema.verification.record.versiontrue için, varsayılan olarak olarak olarak ayarlanır false .

Kullanıcı arabirimini kullanarak dış meta veri deposu ayarlama

Azure Databricks kullanıcı arabirimini kullanarak dış meta veri deposu ayarlamak için:

  1. Kenar çubuğundaki Kümeler düğmesine tıklayın.

  2. Küme Oluştur'a tıklayın.

  3. Aşağıdaki Spark yapılandırma seçeneklerini girin:

    # 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. İşlem yapılandırma başvurusu başlığındaki yönergeleri izleyerek küme yapılandırmanıza devam edin.

  5. Kümeyi oluşturmak için Küme Oluştur'a tıklayın.

Başlangıç betiğini kullanarak dış meta veri deposu ayarlama

Init betikleri , gerekli yapılandırmaları el ile ayarlamadan mevcut bir Hive meta deposuna bağlanmanızı sağlar.

  1. Init betiğini mevcut değilse içinde depolamak istediğiniz temel dizini oluşturun. Aşağıdaki örnekte kullanılır dbfs:/databricks/scripts.
  2. Not defterinde aşağıdaki kod parçacığını çalıştırın. Kod parçacığı, Databricks Dosya Sistemi'nde (DBFS) init betiğini /databricks/scripts/external-metastore.sh oluşturur. Alternatif olarak, init betiğini oluşturmak için DBFS REST API'sinin put işlemini kullanabilirsiniz. Bu init betiği, adı belirtilen <cluster-name> bir küme başlatıldığında, gerekli yapılandırma seçeneklerini kümenin her düğümü içindeki JSON benzeri biçimde /databricks/driver/conf/ adlı 00-custom-spark.conf bir yapılandırma dosyasına yazar. Azure Databricks, dosyada /databricks/driver/conf/spark-branch.conf varsayılan Spark yapılandırmaları sağlar. Dizindeki /databricks/driver/conf yapılandırma dosyaları ters alfabetik sırada uygulanır. Dosyanın adını 00-custom-spark.conf değiştirmek istiyorsanız, dosyanın dosyadan önce uygulanmaya devam ettiğinden spark-branch.conf emin olun.

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. Kümenizi init betiğiyle yapılandırın.
  2. Kümeyi yeniden başlatın.

Sorun giderme

Kümeler başlatılmıyor (yanlış başlatma betiği ayarları nedeniyle)

Dış meta veri deposunu ayarlamaya yönelik bir init betiği küme oluşturma işleminin başarısız olmasına neden oluyorsa, init betiğini günlüğe kaydedecek şekilde yapılandırın ve günlükleri kullanarak init betiğinin hatalarını ayıkın.

SQL deyiminde hata: InvocationTargetException

  • Tam özel durum yığını izlemesinde hata iletisi deseni:

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

    Dış meta veri deposu JDBC bağlantı bilgileri yanlış yapılandırılmış. Yapılandırılan konak adını, bağlantı noktasını, kullanıcı adını, parolayı ve JDBC sürücü sınıfı adını doğrulayın. Ayrıca, kullanıcı adının meta veri deposu veritabanına erişmek için doğru ayrıcalığı olduğundan emin olun.

  • Tam özel durum yığını izlemesinde hata iletisi deseni:

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

    Dış meta veri deposu veritabanı düzgün başlatılmadı. Meta veri deposu veritabanını oluşturduğunuzu doğrulayın ve JDBC bağlantı dizesi doğru veritabanı adını yazın. Ardından, aşağıdaki iki Spark yapılandırma seçeneğiyle yeni bir küme başlatın:

    datanucleus.schema.autoCreateTables true
    datanucleus.fixedDatastore false
    

    Bu şekilde, Hive istemci kitaplığı meta veri deposu veritabanında tablolar oluşturmaya ve başlatmaya çalışır ve bunlara erişmeye çalıştığında ancak eksik bulur.

SQL deyiminde hata: AnalysisException: org.apache.hadoop.hive.metastore.HiveMetastoreClient örneği oluşturulamıyor

Tam özel durum yığınında hata iletisi:

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

Küme yanlış bir JDBC sürücüsü kullanacak şekilde yapılandırılmış.

datanucleus.autoCreateSchema değerini true olarak ayarlamak beklendiği gibi çalışmıyor

Varsayılan olarak Databricks, meta veri deposu veritabanlarında yanlışlıkla yapılan yapısal değişiklikleri önleyen olarak da ayarlanır datanucleus.fixedDatastoretrue. Bu nedenle, Hive istemci kitaplığı olarak ayarlasanız datanucleus.autoCreateSchematruebile meta veri deposu tabloları oluşturamaz. Meta veri deposu veritabanının yanlışlıkla yükseltilmesini önlediğinden bu strateji genel olarak üretim ortamları için daha güvenlidir.

Meta veri deposu veritabanını başlatmaya yardımcı olmak için kullanmak datanucleus.autoCreateSchema istiyorsanız olarak ayarladığınızdan datanucleus.fixedDatastorefalseemin olun. Ayrıca, üretim ortamınıza daha iyi koruma sağlamak için meta veri deposu veritabanını başlatdıktan sonra her iki bayrağı da çevirmek isteyebilirsiniz.