مخزن بيانات تعريف Apache Hive الخارجي (قديم)

توضح هذه المقالة كيفية إعداد مجموعات Azure Databricks للاتصال بمخازن Apache Hive metastores الخارجية الموجودة. يوفر معلومات حول إعداد metastore الموصى به ومتطلبات تكوين نظام المجموعة، متبوعا بإرشادات لتكوين المجموعات للاتصال بمخزن بيانات التعريف الخارجي. للحصول على إصدارات مكتبة Hive المضمنة في Databricks Runtime، راجع ملاحظات إصدار Databricks Runtime ذات الصلة.

هام

  • بينما يعمل SQL Server كقاعدة بيانات metastore الأساسية ل Hive 2.0 وما فوق، تستخدم الأمثلة في هذه المقالة قاعدة بيانات Azure SQL.
  • للحصول على معلومات حول توافق Hive metastore مع HDInsight، راجع استخدام مخازن بيانات التعريف الخارجية في Azure HDInsight.
  • إذا كنت تستخدم قاعدة بيانات Azure ل MySQL كمخزن بيانات تعريف خارجي، يجب تغيير قيمة الخاصية lower_case_table_names من 1 (الافتراضي) إلى 2 في تكوين قاعدة البيانات من جانب الخادم. للحصول على التفاصيل، راجع حساسية حالة المعرف.

إشعار

يعد استخدام metastores الخارجية نموذجا قديما لإدارة البيانات. توصي Databricks بالترقية إلى كتالوج Unity. يبسط كتالوج Unity أمان بياناتك وإدارتها من خلال توفير مكان مركزي لإدارة الوصول إلى البيانات وتدقيطها عبر مساحات عمل متعددة في حسابك. راجع ما هو كتالوج Unity؟.

إعداد Hive metastore

يتصل عميل metastore الذي يعمل داخل نظام مجموعة بقاعدة بيانات metastore الأساسية الخاصة بك مباشرة باستخدام JDBC.

لاختبار اتصال الشبكة من نظام مجموعة إلى metastore، يمكنك تشغيل الأمر التالي داخل دفتر ملاحظات:

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

حيث

  • <DNS name> هو اسم خادم قاعدة بيانات Azure SQL.
  • <port> هو منفذ قاعدة البيانات.

تكوينات نظام المجموعة

يجب تعيين مجموعتين من خيارات التكوين لتوصيل نظام مجموعة بمخزن بيانات التعريف الخارجي:

  • تعمل خيارات Spark على تكوين Spark مع إصدار Hive metastore وJARs لعميل metastore.
  • تقوم خيارات Hive بتكوين عميل metastore للاتصال بمخزن metastore الخارجي.

خيارات تكوين Spark

اضبط spark.sql.hive.metastore.version على إصدار Hive metastore الخاص بك وعلى spark.sql.hive.metastore.jars النحو التالي:

  • Hive 0.13: لا تقم بتعيين spark.sql.hive.metastore.jars.

    إشعار

    Hive 1.2.0 و1.2.1 ليست metastore المضمنة في Databricks Runtime 7.0 وما فوق. إذا كنت ترغب في استخدام Hive 1.2.0 أو 1.2.1 مع Databricks Runtime 7.0 وما فوق، فاتبع الإجراء الموضح في تنزيل الجرار metastore وأشر إليها.

  • Hive 2.3.7 (Databricks Runtime 7.0 - 9.x) أو Hive 2.3.9 (Databricks Runtime 10.0 وما فوق): تعيين spark.sql.hive.metastore.jars إلى builtin.

  • بالنسبة لجميع إصدارات Hive الأخرى، توصي Azure Databricks بتنزيل metastore JARs وتعيين التكوين spark.sql.hive.metastore.jars للإشارة إلى JARs التي تم تنزيلها باستخدام الإجراء الموضح في تنزيل الجرار metastore والإشارة إليها.

تحميل الجرار metastore والإشارة إليها

  1. إنشاء نظام مجموعة مع spark.sql.hive.metastore.jars تعيين إلى maven و spark.sql.hive.metastore.version لمطابقة إصدار metastore الخاص بك.

  2. عند تشغيل نظام المجموعة، ابحث في سجل برنامج التشغيل وابحث عن سطر كما يلي:

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

    الدليل <path> هو موقع JARs التي تم تنزيلها في عقدة برنامج التشغيل للمجموعة.

    بدلا من ذلك يمكنك تشغيل التعليمات البرمجية التالية في دفتر ملاحظات Scala لطباعة موقع JARs:

    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. قم بتشغيل %sh cp -r <path> /dbfs/hive_metastore_jar (استبدال <path> مع معلومات نظام المجموعة الخاص بك) لنسخ هذا الدليل إلى دليل في جذر DBFS يسمى hive_metastore_jar من خلال عميل DBFS في عقدة برنامج التشغيل.

  4. إنشاء برنامج نصي init الذي ينسخ /dbfs/hive_metastore_jar إلى نظام الملفات المحلي للعقدة، مع التأكد من جعل البرنامج النصي init في وضع السكون بضع ثوان قبل أن يصل إلى عميل DBFS. وهذا يضمن أن العميل جاهز.

  5. تعيين spark.sql.hive.metastore.jars لاستخدام هذا الدليل. إذا نسخ البرنامج النصي /dbfs/hive_metastore_jar init الخاص بك إلى /databricks/hive_metastore_jars/، فقم بتعيين spark.sql.hive.metastore.jars إلى /databricks/hive_metastore_jars/*. يجب أن يتضمن الموقع اللاحق /*.

  6. أعد تشغيل نظام المجموعة.

خيارات تكوين الخلية

يصف هذا القسم الخيارات الخاصة ب Hive.

للاتصال بمخزن بيانات التعريف الخارجي باستخدام الوضع المحلي، قم بتعيين خيارات تكوين Apache Hive التالية:

# 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

حيث

  • <mssql-connection-string>هو سلسلة الاتصال JDBC (التي يمكنك الحصول عليها في مدخل Microsoft Azure). لا تحتاج إلى تضمين اسم المستخدم وكلمة المرور في سلسلة الاتصال، لأنه سيتم تعيينهما بواسطة javax.jdo.option.ConnectionUserName وjavax.jdo.option.ConnectionDriverName.
  • <mssql-username> وحدد <mssql-password> اسم المستخدم وكلمة المرور لحساب قاعدة بيانات Azure SQL الذي لديه حق الوصول للقراءة/الكتابة إلى قاعدة البيانات.

إشعار

بالنسبة لبيئات الإنتاج، نوصي بتعيين hive.metastore.schema.verification إلى true. يمنع هذا عميل Hive metastore من تعديل مخطط قاعدة بيانات metastore ضمنيا عندما لا يتطابق إصدار عميل metastore مع إصدار قاعدة بيانات metastore. عند تمكين هذا الإعداد لإصدارات عميل metastore الأقل من Hive 1.2.0، تأكد من أن عميل metastore لديه إذن الكتابة إلى قاعدة بيانات metastore (لمنع المشكلة الموضحة في HIVE-9749).

  • بالنسبة إلى Hive metastore 1.2.0 والإصدارات الأحدث، قم بتعيين hive.metastore.schema.verification.record.version إلى true لتمكين hive.metastore.schema.verification.
  • بالنسبة إلى Hive metastore 2.1.1 والإصدارات الأحدث، قم بتعيين hive.metastore.schema.verification.record.version إلى true كما يتم تعيينه إلى false افتراضيا.

إعداد metastore خارجي باستخدام واجهة المستخدم

لإعداد metastore خارجي باستخدام واجهة مستخدم Azure Databricks:

  1. انقر فوق الزر Clusters على الشريط الجانبي.

  2. انقر فوق Create Cluster.

  3. أدخل خيارات تكوين Spark التالية:

    # 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. تابع تكوين نظام المجموعة الخاص بك، باتباع الإرشادات الموجودة في مرجع تكوين الحساب.

  5. انقر فوق Create Cluster لإنشاء نظام المجموعة.

إعداد metastore خارجي باستخدام برنامج نصي init

تتيح لك البرامج النصية Init الاتصال ب Hive metastore موجود دون تعيين التكوينات المطلوبة يدويا.

  1. قم بإنشاء الدليل الأساسي الذي تريد تخزين البرنامج النصي init فيه إذا لم يكن موجودا. يستخدم المثال التالي dbfs:/databricks/scripts.
  2. قم بتشغيل القصاصة البرمجية التالية في دفتر ملاحظات. تنشئ القصاصة البرمجية البرنامج النصي /databricks/scripts/external-metastore.sh init في نظام ملفات Databricks (DBFS). بدلا من ذلك، يمكنك استخدام عملية وضع DBFS REST API لإنشاء البرنامج النصي init. يكتب هذا البرنامج النصي init خيارات التكوين المطلوبة إلى ملف تكوين يسمى 00-custom-spark.conf بتنسيق يشبه JSON ضمن /databricks/driver/conf/ داخل كل عقدة من نظام المجموعة، كلما بدأ نظام مجموعة بالاسم المحدد <cluster-name> . يوفر Azure Databricks تكوينات Spark الافتراضية في /databricks/driver/conf/spark-branch.conf الملف. يتم تطبيق ملفات التكوين في /databricks/driver/conf الدليل بترتيب أبجدي عكسي. إذا كنت تريد تغيير اسم 00-custom-spark.conf الملف، فتأكد من استمرار تطبيقه قبل 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. تكوين نظام المجموعة الخاص بك مع البرنامج النصي init.
  2. أعد تشغيل نظام المجموعة.

استكشاف الأخطاء وإصلاحها

لا تبدأ المجموعات (بسبب إعدادات البرنامج النصي للتثبيت غير الصحيحة)

إذا تسبب برنامج نصي init لإعداد metastore الخارجي في فشل إنشاء نظام المجموعة، قم بتكوين البرنامج النصي init لتسجيله، وتصحيح البرنامج النصي init باستخدام السجلات.

خطأ في عبارة SQL: InvocationTargetException

  • نمط رسالة الخطأ في تتبع مكدس الاستثناء الكامل:

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

    تم تكوين معلومات اتصال Metastore JDBC الخارجية بشكل خاطئ. تحقق من اسم المضيف المكون والمنفذ واسم المستخدم وكلمة المرور واسم فئة برنامج تشغيل JDBC. تأكد أيضا من أن اسم المستخدم لديه الامتياز الصحيح للوصول إلى قاعدة بيانات metastore.

  • نمط رسالة الخطأ في تتبع مكدس الاستثناء الكامل:

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

    لم تتم تهيئة قاعدة بيانات metastore الخارجية بشكل صحيح. تحقق من إنشاء قاعدة بيانات metastore ووضع اسم قاعدة البيانات الصحيح في سلسلة الاتصال JDBC. ثم ابدأ مجموعة جديدة مع خياري تكوين Spark التاليين:

    datanucleus.schema.autoCreateTables true
    datanucleus.fixedDatastore false
    

    بهذه الطريقة، ستحاول مكتبة عميل Apache Hive إنشاء الجداول وتهيئتها في قاعدة بيانات metastore تلقائيا عندما تحاول الوصول إليها ولكنها تجدها غير موجودة.

خطأ في عبارة SQL: AnalysisException: غير قادر على إنشاء مثيل org.apache.hadoop.hive.metastore.HiveMetastoreClient

رسالة خطأ في مجموعة الاستثناء الكامل:

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

تم تكوين نظام المجموعة لاستخدام برنامج تشغيل JDBC غير صحيح.

لا يعمل تعيين datanucleus.autoCreateSchema إلى true كما هو متوقع

بشكل افتراضي، يعين datanucleus.fixedDatastore Databricks أيضا على true، مما يمنع أي تغييرات هيكلية عرضية لقواعد بيانات metastore. لذلك، لا يمكن لمكتبة عميل Apache Hive إنشاء جداول metastore حتى إذا قمت بتعيين datanucleus.autoCreateSchema إلى true. هذه الاستراتيجية، بشكل عام، أكثر أمانا لبيئات الإنتاج لأنها تمنع ترقية قاعدة بيانات metastore عن طريق الخطأ.

إذا كنت تريد استخدام datanucleus.autoCreateSchema للمساعدة في تهيئة قاعدة بيانات metastore، فتأكد من تعيين datanucleus.fixedDatastore إلى false. أيضا، قد تحتاج إلى عكس كلتا العلامتين بعد تهيئة قاعدة بيانات metastore لتوفير حماية أفضل لبيئة الإنتاج الخاصة بك.