تشغيل استعلامات Apache Hive باستخدام Apache Hadoop في HDInsight باستخدام REST

تعرف على كيفية استخدام واجهة برمجة تطبيقات WebHCat REST لتشغيل استعلامات Apache Hive باستخدام Apache Hadoop على مجموعة Azure HDInsight.

المتطلبات الأساسية

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

تشغيل استعلام Apache Hive

  1. للتحقق من أنه يمكنك الاتصال بمجموعة 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.
  2. بداية عنوان 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"}
    
  3. استخدم ما يلي لإنشاء جدول باسم 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. لا يجب استبدال القيم المقتبسة التي تحتوي على مسافة، مثل المحدد، بـ +.

      يُرجع هذا الأمر معرّف الوظيفة الذي يمكن استخدامه للتحقق من حالة الوظيفة.

  4. للتحقق من حالة الوظيفة، استخدم الأمر التالي:

    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.

  5. بمجرد تغيير حالة الوظيفة إلى SUCCEEDED، يمكنك استرداد نتائج المهمة من موقع تخزين Azure Blob. تحتوي المعلمة statusdir التي تم تمريرها مع الاستعلام على موقع ملف الإخراج؛ في هذه الحالة، /example/rest. يخزن هذا العنوان الإخراج في الدليل example/curl في التخزين الافتراضي للمجموعات.

    يمكنك سرد هذه الملفات وتنزيلها باستخدام Azure CLI. لمزيد من المعلومات حول استخدام Azure CLI مع Azure Storage، راجع مستند استخدام Azure CLI مع Azure Storage.

الخطوات التالية

للحصول على معلومات حول الطرق الأخرى التي يمكنك من خلالها العمل مع Hadoop على HDInsight:

لمزيد من المعلومات حول واجهة برمجة تطبيقات REST المستخدمة في هذا المستند، راجع مستند مرجع WebHCat.