تشغيل استعلامات Apache Hive باستخدام Apache Hadoop في HDInsight مستخدمًا REST
تعرف على كيفية استخدام واجهة برمجة تطبيقات WebHCat REST لتشغيل استعلامات Apache Hive باستخدام Apache Hadoop على مجموعة Azure HDInsight.
المتطلبات الأساسية
نظام مجموعة Apache Hadoop على HDInsight. راجع بدء استخدام HDInsight على Linux.
عميل REST. يستخدم هذا المستند Invoke-WebRequest في Windows PowerShell وCurl في Bash.
إذا كنت تستخدم Bash، فستحتاج أيضاً إلى jq، وهو معالج JSON لسطر الأوامر. راجع https://stedolan.github.io/jq/.
URI الأساسي لواجهة برمجة تطبيقات REST
معرف الموارد المنتظم الأساسي (URI) لواجهة برمجة تطبيقات REST على HDInsight هو https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters/CLUSTERNAME
، حيث CLUSTERNAME
هو اسم المجموعة الخاصة بك. أسماء الكتل في URIs حساسة لحالة الأحرف. في حين أن اسم المجموعة في جزء اسم المجال المؤهل بالكامل (FQDN) من URI (CLUSTERNAME.azurehdinsight.net
) غير حساس لحالة الأحرف، فإن التكرارات الأخرى في URI حساسة لحالة الأحرف.
المصادقة
عند استخدام Curl أو أي اتصال REST آخر مع WebHCat، يجب عليك مصادقة الطلبات من خلال توفير اسم المستخدم وكلمة المرور لمسؤول مجموعة HDInsight. يتم تأمين واجهة برمجة تطبيقات REST عبر المصادقة الأساسية. للمساعدة في ضمان إرسال بيانات الاعتماد الخاصة بك بشكل آمن إلى الخادم، قم دائماً بتقديم الطلبات باستخدام Secure HTTP (HTTPS).
الإعداد (الاحتفاظ بأوراق الاعتماد)
احتفظ ببيانات الاعتماد الخاصة بك لتجنب إعادة إدخالها لكل مثال. سيتم الاحتفاظ باسم النظام مجموعة في خطوة منفصلة.
أ. Bash
قم بتحرير النص أدناه عن طريق استبدال PASSWORD
بكلمة مرورك الفعلية. ثم إدخال الأمر.
export PASSWORD='PASSWORD'
ب. PowerShell نفذ التعليمات البرمجية أدناه وأدخل بيانات الاعتماد الخاصة بك في النافذة المنبثقة:
$creds = Get-Credential -UserName "admin" -Message "Enter the HDInsight login"
استخراج اسم الكتلة المغلفة بشكل صحيح
قد تختلف الأحرف الفعلية لاسم نظام المجموعة عن المتوقع، استنادًا إلى كيفية إنشاء نظام المجموعة. ستُظهر الخطوات هنا الغلاف الفعلي، ثم تخزنه في متغير لجميع الأمثلة اللاحقة.
قم بتحرير البرامج النصية أدناه لاستبدال CLUSTERNAME
باسم المجموعة الخاصة بك. ثم إدخال الأمر. (اسم نظام المجموعة لـ FQDN غير حساس لحالة الأحرف.)
export CLUSTER_NAME=$(curl -u admin:$PASSWORD -sS -G "https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters" | jq -r '.items[].Clusters.cluster_name')
echo $CLUSTER_NAME
# Identify properly cased cluster name
$resp = Invoke-WebRequest -Uri "https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters" `
-Credential $creds -UseBasicParsing
$clusterName = (ConvertFrom-Json $resp.Content).items.Clusters.cluster_name;
# Show cluster name
$clusterName
تشغيل استعلام الخلية
للتحقق من أنه يمكنك الاتصال بمجموعة HDInsight الخاصة بك، استخدم أحد الأوامر التالية:
curl -u admin:$PASSWORD -G https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/status
$resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/status" ` -Credential $creds ` -UseBasicParsing $resp.Content
تتلقى رداً مشابهاً للنص التالي:
{"status":"ok","version":"v1"}
المعلمات المستخدمة مع هذا الأمر هي كما يلي:
-u
- اسم المستخدم وكلمة المرور المستخدمين لمصادقة الطلب.-G
- يشير إلى أن هذا الطلب هو عملية GET.
بداية عنوان URL،
https://$CLUSTERNAME.azurehdinsight.net/templeton/v1
، واحدة لجميع الطلبات. يشير المسار،/status
، إلى أن الطلب يتمثل في إرجاع حالة WebHCat (المعروفة أيضاً باسم Templeton) للخادم. يمكنك أيضاً طلب إصدار Apache Hive باستخدام الأمر التالي:curl -u admin:$PASSWORD -G https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/version/hive
$resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/version/hive" ` -Credential $creds ` -UseBasicParsing $resp.Content
يُرجع هذا الطلب رداً مشابهاً للنص التالي:
{"module":"hive","version":"1.2.1000.2.6.5.3008-11"}
استخدم ما يلي لإنشاء جدول باسم log4jLogs:
JOB_ID=$(curl -s -u admin:$PASSWORD -d user.name=admin -d execute="DROP+TABLE+log4jLogs;CREATE+EXTERNAL+TABLE+log4jLogs(t1+string,t2+string,t3+string,t4+string,t5+string,t6+string,t7+string)+ROW+FORMAT+DELIMITED+FIELDS+TERMINATED+BY+' '+STORED+AS+TEXTFILE+LOCATION+'/example/data/';SELECT+t4+AS+sev,COUNT(*)+AS+count+FROM+log4jLogs+WHERE+t4+=+'[ERROR]'+AND+INPUT__FILE__NAME+LIKE+'%25.log'+GROUP+BY+t4;" -d statusdir="/example/rest" https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/hive | jq -r .id) echo $JOB_ID
$reqParams = @{"user.name"="admin";"execute"="DROP TABLE log4jLogs;CREATE EXTERNAL TABLE log4jLogs(t1 string, t2 string, t3 string, t4 string, t5 string, t6 string, t7 string) ROW FORMAT DELIMITED BY ' ' STORED AS TEXTFILE LOCATION '/example/data/;SELECT t4 AS sev,COUNT(*) AS count FROM log4jLogs WHERE t4 = '[ERROR]' GROUP BY t4;";"statusdir"="/example/rest"} $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/hive" ` -Credential $creds ` -Body $reqParams ` -Method POST ` -UseBasicParsing $jobID = (ConvertFrom-Json $resp.Content).id $jobID
يستخدم هذا الطلب طريقة POST، والتي ترسل البيانات كجزء من الطلب إلى REST API. يتم إرسال قيم البيانات التالية مع الطلب:
user.name
- المستخدم الذي يقوم بتشغيل الأمر.execute
- عبارات HiveQL المطلوب تنفيذها.statusdir
- الدليل الذي تمت كتابة حالة هذه الوظيفة إليه.
تؤدي هذه العبارات الإجراءات التالية:
DROP TABLE
- إذا كان الجدول موجوداً بالفعل، فسيتم حذفه.CREATE EXTERNAL TABLE
- إنشاء جدول "خارجي" جديد في الخلية. تخزن الجداول الخارجية تعريف الجدول فقط في الخلية. يتم ترك البيانات في الموقع الأصلي.إشعار
يجب استخدام الجداول الخارجية عندما تتوقع إجراء تحديث للبيانات الأساسية بواسطة مصدر خارجي. على سبيل المثال، عملية تحميل بيانات مؤتمتة أو عملية MapReduce أخرى.
إسقاط جدول خارجي لا يؤدي إلى حذف البيانات، فقط يُحذف تعريف الجدول.
ROW FORMAT
- كيف يتم تنسيق البيانات. الحقول في كل سجل مفصولة بمسافة.STORED AS TEXTFILE LOCATION
- مكان تخزين البيانات (المثال / دليل البيانات) وتخزينها كنص.SELECT
- تحديد عدد كل الصفوف حيث يحتوي العمود t4 على القيمة [خطأ]. تعرض هذه العبارة قيمة 3 حيث توجد ثلاثة صفوف تحتوي على هذه القيمة.إشعار
لاحظ أنه يتم استبدال المسافات بين عبارات HiveQL بالحرف
+
عند استخدامها مع Curl. لا يجب استبدال القيم المقتبسة التي تحتوي على مسافة، مثل المحدد، بـ+
.يُرجع هذا الأمر معرّف الوظيفة الذي يمكن استخدامه للتحقق من حالة الوظيفة.
للتحقق من حالة الوظيفة، استخدم الأمر التالي:
curl -u admin:$PASSWORD -d user.name=admin -G https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/jobs/$jobid | jq .status.state
$reqParams=@{"user.name"="admin"} $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/jobs/$jobID" ` -Credential $creds ` -Body $reqParams ` -UseBasicParsing # ConvertFrom-JSON can't handle duplicate names with different case # So change one to prevent the error $fixDup=$resp.Content.Replace("jobID","job_ID") (ConvertFrom-Json $fixDup).status.state
If the job has finished, the state is SUCCEEDED.
بمجرد تغير حالة المهمة إلى ناجحة، يمكنك استرداد نتائج المهمة من تخزين Azure Blob. تحتوي المعلمة
statusdir
التي تم تمريرها مع الاستعلام على موقع ملف الإخراج ؛ في هذه الحالة،/example/rest
. يخزن هذا العنوان الإخراج في الدليلexample/curl
في التخزين الافتراضي للمجموعات.يمكنك سرد هذه الملفات وتنزيلها باستخدام Azure CLI. لمزيد من المعلومات، راجع استخدام Azure CLI مع Azure Storage.
الخطوات التالية
للحصول على معلومات حول الطرق الأخرى التي يمكنك من خلالها العمل مع Hadoop على HDInsight:
لمزيد من المعلومات حول واجهة برمجة تطبيقات REST المستخدمة في هذا المستند، راجع مستند مرجع WebHCat .