مخزن بيانات تعريف 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 والإشارة إليها
إنشاء نظام مجموعة مع
spark.sql.hive.metastore.jars
تعيين إلىmaven
وspark.sql.hive.metastore.version
لمطابقة إصدار metastore الخاص بك.عند تشغيل نظام المجموعة، ابحث في سجل برنامج التشغيل وابحث عن سطر كما يلي:
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")
قم بتشغيل
%sh cp -r <path> /dbfs/hive_metastore_jar
(استبدال<path>
مع معلومات نظام المجموعة الخاص بك) لنسخ هذا الدليل إلى دليل في جذر DBFS يسمىhive_metastore_jar
من خلال عميل DBFS في عقدة برنامج التشغيل.إنشاء برنامج نصي init الذي ينسخ
/dbfs/hive_metastore_jar
إلى نظام الملفات المحلي للعقدة، مع التأكد من جعل البرنامج النصي init في وضع السكون بضع ثوان قبل أن يصل إلى عميل DBFS. وهذا يضمن أن العميل جاهز.تعيين
spark.sql.hive.metastore.jars
لاستخدام هذا الدليل. إذا نسخ البرنامج النصي/dbfs/hive_metastore_jar
init الخاص بك إلى/databricks/hive_metastore_jars/
، فقم بتعيينspark.sql.hive.metastore.jars
إلى/databricks/hive_metastore_jars/*
. يجب أن يتضمن الموقع اللاحق/*
.أعد تشغيل نظام المجموعة.
خيارات تكوين الخلية
يصف هذا القسم الخيارات الخاصة ب 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:
انقر فوق الزر Clusters على الشريط الجانبي.
انقر فوق Create Cluster.
أدخل خيارات تكوين 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>
تابع تكوين نظام المجموعة الخاص بك، باتباع الإرشادات الموجودة في مرجع تكوين الحساب.
انقر فوق Create Cluster لإنشاء نظام المجموعة.
إعداد metastore خارجي باستخدام برنامج نصي init
تتيح لك البرامج النصية Init الاتصال ب Hive metastore موجود دون تعيين التكوينات المطلوبة يدويا.
- قم بإنشاء الدليل الأساسي الذي تريد تخزين البرنامج النصي init فيه إذا لم يكن موجودا. يستخدم المثال التالي
dbfs:/databricks/scripts
. - قم بتشغيل القصاصة البرمجية التالية في دفتر ملاحظات. تنشئ القصاصة البرمجية البرنامج النصي
/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
)
- تكوين نظام المجموعة الخاص بك مع البرنامج النصي init.
- أعد تشغيل نظام المجموعة.
استكشاف الأخطاء وإصلاحها
لا تبدأ المجموعات (بسبب إعدادات البرنامج النصي للتثبيت غير الصحيحة)
إذا تسبب برنامج نصي 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 لتوفير حماية أفضل لبيئة الإنتاج الخاصة بك.