تشغيل وظائف MapReduce مع Apache Hadoop على HDInsight باستخدام REST

تعلم كيفية استخدام واجهة برمجة تطبيقات Apache Hive WebHCat REST لتشغيل مهام MapReduce على نظام مجموعة HDInsight. يُستخدم Curl لإظهار كيفية التفاعل مع HDInsight باستخدام طلبات HTTP البسيطة لتشغيل مهام MapReduce.

ملاحظة

إذا كنت معتاداً بالفعل على استخدام خوادم Hadoop المستندة إلى نظام Linux، ولكنك مبتدئ على HDInsight، فراجع مستند ما تحتاج إلى معرفته عن Apache Hadoop المستند إلى نظام Linux على HDInsight.

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

إما:

  • Windows PowerShell أو،
  • Curl مع jq

تشغيل مهمة MapReduce

ملاحظة

عندما تستخدم Curl أو أي اتصال REST آخر مع WebHCat، يجب عليك مصادقة الطلبات من خلال توفير اسم المستخدم وكلمة المرور لمسؤول نظام مجموعة HDInsight. يجب استخدام اسم نظام المجموعة كجزء من معرف الموارد المنتظم المستخدم لإرسال الطلبات إلى الخادم.

يتم تأمين واجهة برمجة تطبيقات REST باستخدام مصادقة الوصول الأساسية. يجب عليك دائماً تقديم الطلبات باستخدام HTTPS لضمان إرسال بيانات الاعتماد الخاصة بك بشكل آمن إلى الخادم.

Curl

  1. لسهولة الاستخدام، قم بتعيين المتغيرات أدناه. يستند هذا المثال إلى بيئة Windows، يمكنك المراجعة حسب الحاجة للبيئة الخاصة بك.

    set CLUSTERNAME=
    set PASSWORD=
    
  2. من سطر الأوامر، استخدم الأمر التالي للتحقق من أنه يمكنك الاتصال بنظام مجموعة HDInsight:

    curl -u admin:%PASSWORD% -G https://%CLUSTERNAME%.azurehdinsight.net/templeton/v1/status
    

    المعلمات المستخدمة مع هذا الأمر هي كما يلي:

    • -u: يشير إلى اسم المستخدم وكلمة المرور المستخدمة لمصادقة الطلب
    • -G: يشير إلى أن هذه العملية هي طلب GET

    بداية معرف الموارد المنتظم، https://CLUSTERNAME.azurehdinsight.net/templeton/v1، هي نفسها لجميع الطلبات.

    ستتلقى رداً مشابهاً لـ JSON التالي:

    {"version":"v1","status":"ok"}
    
  3. لإرسال مهمة MapReduce، استخدم الأمر التالي. قم بتعديل المسار إلى jq حسب الحاجة.

    curl -u admin:%PASSWORD% -d user.name=admin ^
    -d jar=/example/jars/hadoop-mapreduce-examples.jar ^
    -d class=wordcount -d arg=/example/data/gutenberg/davinci.txt -d arg=/example/data/output ^
    https://%CLUSTERNAME%.azurehdinsight.net/templeton/v1/mapreduce/jar | ^
    C:\HDI\jq-win64.exe .id
    

    تخبر نهاية معرف الموارد المنتظم (/mapreduce/jar) WebHCat أن هذا الطلب يبدأ بمهمة MapReduce من فئة في ملف jar. المعلمات المستخدمة مع هذا الأمر هي كما يلي:

    • -d: لا يتم استخدام -G، لذا فإن الطلب يستخدم بشكل افتراضي أسلوب POST. -d يحدد قيم البيانات التي يتم إرسالها مع الطلب.
      • user.name: المستخدم الذي يقوم بتشغيل الأمر
      • jar: موقع ملف jar الذي يحتوي على الفئة التي سيتم تشغيلها
      • class: الفئة التي تحتوي على منطق MapReduce
      • arg: الوسيطات التي سيتم تمريرها إلى مهمة MapReduce. في هذه الحالة، ملف نص الإدخال والدليل اللذان يتم استخدامهما للإخراج

    يجب أن يقوم هذا الأمر بإرجاع معرّف مهمة يمكن استخدامه للتحقق من حالة المهمة: job_1415651640909_0026.

  4. للتحقق من حالة المهمة، استخدم الأمر التالي. استبدل القيمة JOBID بالقيمة الفعلية التي تم إرجاعها في الخطوة السابقة. راجع موقع jq حسب الحاجة.

    set JOBID=job_1415651640909_0026
    
    curl -G -u admin:%PASSWORD% -d user.name=admin https://%CLUSTERNAME%.azurehdinsight.net/templeton/v1/jobs/%JOBID% | ^
    C:\HDI\jq-win64.exe .status.state
    

PowerShell

  1. لسهولة الاستخدام، قم بتعيين المتغيرات أدناه. استبدل CLUSTERNAME باسم نظام المجموعة الفعلي. قم بتنفيذ الأمر وإدخال كلمة مرور تسجيل الدخول لنظام المجموعة عند مطالبتك.

    $clusterName="CLUSTERNAME"
    $creds = Get-Credential -UserName admin -Message "Enter the cluster login password"
    
  2. استخدم الأمر التالي للتحقق من أنه يمكنك الاتصال بنظام مجموعة HDInsight الخاصة بك:

    $resp = Invoke-WebRequest -Uri "https://$clustername.azurehdinsight.net/templeton/v1/status" `
        -Credential $creds `
        -UseBasicParsing
    $resp.Content
    

    ستتلقى رداً مشابهاً لـ JSON التالي:

    {"version":"v1","status":"ok"}
    
  3. لإرسال مهمة MapReduce، استخدم الأمر التالي:

    $reqParams = @{}
    $reqParams."user.name" = "admin"
    $reqParams.jar = "/example/jars/hadoop-mapreduce-examples.jar"
    $reqParams.class = "wordcount"
    $reqParams.arg = @()
    $reqParams.arg += "/example/data/gutenberg/davinci.txt"
    $reqparams.arg += "/example/data/output"
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/mapreduce/jar" `
       -Credential $creds `
       -Body $reqParams `
       -Method POST `
       -UseBasicParsing
    $jobID = (ConvertFrom-Json $resp.Content).id
    $jobID
    

    تخبر نهاية معرف الموارد المنتظم (/mapreduce/jar) WebHCat أن هذا الطلب يبدأ بمهمة MapReduce من فئة في ملف jar. المعلمات المستخدمة مع هذا الأمر هي كما يلي:

    • user.name: المستخدم الذي يقوم بتشغيل الأمر
    • jar: موقع ملف jar الذي يحتوي على الفئة التي سيتم تشغيلها
    • class: الفئة التي تحتوي على منطق MapReduce
    • arg: الوسيطات التي سيتم تمريرها إلى مهمة MapReduce. في هذه الحالة، ملف نص الإدخال والدليل اللذان يتم استخدامهما للإخراج

    يجب أن يقوم هذا الأمر بإرجاع معرّف مهمة يمكن استخدامه للتحقق من حالة المهمة: job_1415651640909_0026.

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

    $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
    

كلتا الطريقتين

  1. إذا اكتملت المهمة، تكون الحالة التي تم إرجاعها هي SUCCEEDED.

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

يمكنك سرد هذه الملفات وتنزيلها باستخدام Azure CLI. لمزيد من المعلومات حول استخدام Azure CLI للعمل مع تخزين Azure Blob، راجع التشغيل السريع: إنشاء الكائنات الثنائية كبيرة الحجم وتنزيلها وسردها باستخدام Azure CLI.

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

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

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