إدارة أنظمة مجموعات HDInsight باستخدام واجهة المستخدم على الويب لـ Apache Ambari

تعلم كيفية استخدام Apache Ambari REST API لإدارة ورصد مجموعات Apache Hadoop clusters في Azure HDInsight.

ماذا يُقصد بـ Apache Ambari

يعمل Apache Ambari على تبسيط إدارة ومراقبة نظام مجموعة HDInsight من خلال توفير واجهة مستخدم ويب سهلة الاستخدام وواجهة برمجة التطبيقات REST. تُوفر Ambari افتراضيُا مع مجموعات HDInsight المستندة إلى Linux.

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

معرّف الموارد الأساسي لواجهة Ambari REST API

معرف المورد الموحد الأساسي (URI) لـAPI Ambari REST على HDInsight هو https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters/CLUSTERNAME، حيث هو اسم الكتلة الخاصة CLUSTERNAME بك. أسماء الكتل في URIs حساسة لحالة الأحرف. في حين أن اسم المجموعة في جزء اسم المجال المؤهل بالكامل (FQDN) من URI (CLUSTERNAME.azurehdinsight.net) غير حساس لحالة الأحرف، فإن التكرارات الأخرى في URI حساسة لحالة الأحرف.

المصادقة

يتطلب الاتصال ب Ambari على HDInsight HTTPS. استخدم اسم حساب المسؤول (الافتراضي هو المسؤول) وكلمة المرور المقدمة في أثناء إنشاء نظام المجموعة.

بالنسبة لمجموعات حزمة أمان المؤسسة، بدلاً من admin، استخدم اسم مستخدم مؤهل بالكامل مثل username@domain.onmicrosoft.com.

أمثلة

الإعداد (الاحتفاظ ببيانات الاعتماد)

احتفظ ببيانات الاعتماد الخاصة بك لتجنب إعادة إدخالها لكل مثال. سيتم الاحتفاظ باسم النظام مجموعة في خطوة منفصلة.

أ. Bash
قم بتحرير النص أدناه عن طريق استبدال PASSWORD بكلمة مرورك الفعلية. ثم إدخال الأمر.

export password='PASSWORD'

ب. PowerShell

$creds = Get-Credential -UserName "admin" -Message "Enter the HDInsight login"

استخراج اسم الكتلة المغلفة بشكل صحيح

قد تختلف الأحرف الفعلية لاسم نظام المجموعة عن المتوقع، استناداً إلى كيفية إنشاء نظام المجموعة. سوف تظهر الخطوات هنا الغلاف الفعلي، ثم تخزينه في متغير لجميع الأمثلة اللاحقة.

قم بتحرير البرامج النصية أدناه لاستبدال CLUSTERNAME باسم المجموعة الخاصة بك. ثم إدخال الأمر. (اسم نظام المجموعة لـ FQDN غير حساس لحالة الأحرف.)

export clusterName=$(curl -u admin:$password -sS -G "https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters" | jq -r '.items[].Clusters.cluster_name')
echo $clusterName
# 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

تحليل بيانات JSON

يستخدم المثال التالي jq أو ConvertFrom-Json لتحليل مستند استجابة JSON وعرض أسماء المضيفين فقطhealth_report.

curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName" \
| jq '.Clusters.health_report'
$resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName" `
    -Credential $creds -UseBasicParsing
$respObj = ConvertFrom-Json $resp.Content
$respObj.Clusters.health_report

الحصول على FQDN عقد نظام المجموعة

قد تحتاج إلى معرفة اسم المجال المؤهل بالكامل (FQDN) لعقدة نظام مجموعة. يمكنك بسهولة استرداد FQDN لعقد مختلفة في الكتلة باستخدام الأمثلة التالية:

جميع العقد

curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/hosts" \
| jq -r '.items[].Hosts.host_name'
$resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/hosts" `
    -Credential $creds -UseBasicParsing
$respObj = ConvertFrom-Json $resp.Content
$respObj.items.Hosts.host_name

عقد رئيسية

curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/HDFS/components/NAMENODE" \
| jq -r '.host_components[].HostRoles.host_name'
$resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/HDFS/components/NAMENODE" `
    -Credential $creds -UseBasicParsing
$respObj = ConvertFrom-Json $resp.Content
$respObj.host_components.HostRoles.host_name

عقد العامل

curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/HDFS/components/DATANODE" \
| jq -r '.host_components[].HostRoles.host_name'
$resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/HDFS/components/DATANODE" `
    -Credential $creds -UseBasicParsing
$respObj = ConvertFrom-Json $resp.Content
$respObj.host_components.HostRoles.host_name

عقد حارس حديقة الحيوان

curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/ZOOKEEPER/components/ZOOKEEPER_SERVER" \
| jq -r ".host_components[].HostRoles.host_name"
$resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/ZOOKEEPER/components/ZOOKEEPER_SERVER" `
    -Credential $creds -UseBasicParsing
$respObj = ConvertFrom-Json $resp.Content
$respObj.host_components.HostRoles.host_name

الحصول على عنوان IP الداخلي لعقد نظام المجموعة

عناوين IP المرتجعة عن طريق الأمثلة في هذا القسم غير قابلة للوصول مباشرة عبر الإنترنت. يمكن الوصول إليها فقط داخل شبكة Azure الظاهرية التي تحتوي على نظام مجموعة HDInsight.

للحصول على مزيدٍ من المعلومات حول استخدام HDInsight في شبكة افتراضية، راجع المستند تخطيط شبكة افتراضية لـ HDInsight.

للبحث عن عنوان IP يجب أن تعرف اسم المجال المؤهل بالكامل الداخلية (FQDN) عقد نظام المجموعة. بمجرد أن يكون لديك FQDN، يمكنك الحصول على عنوان IP للمضيف. الأمثلة التالية الاستعلام الأول Ambari لـ FQDN من جميع العقد المضيف. ثم الاستعلامات Ambari عن عنوان IP لكل مضيف.

for HOSTNAME in $(curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/hosts" | jq -r '.items[].Hosts.host_name')
do
    IP=$(curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/hosts/$HOSTNAME" | jq -r '.Hosts.ip')
  echo "$HOSTNAME <--> $IP"
done
$uri = "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/hosts" 
$resp = Invoke-WebRequest -Uri $uri -Credential $creds -UseBasicParsing
$respObj = ConvertFrom-Json $resp.Content
foreach($item in $respObj.items) {
    $hostName = [string]$item.Hosts.host_name
    $hostInfoResp = Invoke-WebRequest -Uri "$uri/$hostName" `
        -Credential $creds -UseBasicParsing
    $hostInfoObj = ConvertFrom-Json $hostInfoResp
    $hostIp = $hostInfoObj.Hosts.ip
    "$hostName <--> $hostIp"
}

الحصول على التخزين الافتراضي

يجب أن تستخدم مجموعات HDInsight حساب تخزين Azure أو Data Lake Storage بصفة مخزن افتراضي. يمكنك استخدام Ambari لاسترداد هذه المعلومات بعد إنشاء الكتلة. على سبيل المثال، إذا كنت تريد قراءة/كتابة البيانات إلى الحاوية خارج HDInsight.

استرداد الأمثلة التالية تكوين التخزين الافتراضي من الكتلة:

curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/configurations/service_config_versions?service_name=HDFS&service_config_version=1" \
| jq -r '.items[].configurations[].properties["fs.defaultFS"] | select(. != null)'
$resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/configurations/service_config_versions?service_name=HDFS&service_config_version=1" `
    -Credential $creds -UseBasicParsing
$respObj = ConvertFrom-Json $resp.Content
$respObj.items.configurations.properties.'fs.defaultFS'

هام

يقوم هذا الأمر بإرجاع التكوين الأول المُطبق على الخادم (service_config_version=1)، والذي يحتوي على هذه المعلومات. إذا قمت باسترداد قيمة مُعدلة بعد إنشاء نظام المجموعة، قد تحتاج إلى سرد إصدارات التكوين واسترداد أحدث واحد.

قيمة الإرجاع مشابهة لأحد الأمثلة التالية:

  • wasbs://CONTAINER@ACCOUNTNAME.blob.core.windows.net - تشير هذه القيمة إلى أن الكتلة تستخدم حساب تخزين Azure للتخزين الافتراضي. القيمة ACCOUNTNAME هي اسم حساب التخزين. الجزء CONTAINER هو اسم حاوية blob في حساب التخزين. الحاوية هي جذر التخزين المتوافق مع HDFS للكتلة.

  • abfs://CONTAINER@ACCOUNTNAME.dfs.core.windows.net - تشير هذه القيمة إلى أن الكتلة تستخدم Azure Data Lake Storage Gen2 للتخزين الافتراضي. القيم ACCOUNTNAME وCONTAINER لها المعاني نفسها كما في تخزين Azure المذكور سابقاً.

  • adl://home - تشير هذه القيمة إلى أن الكتلة تستخدم Azure Data Lake Storage Gen1 للتخزين الافتراضي.

    للبحث عن اسم حساب Data Lake Storage، استخدم الأمثلة التالية:

    curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/configurations/service_config_versions?service_name=HDFS&service_config_version=1" \
    | jq -r '.items[].configurations[].properties["dfs.adls.home.hostname"] | select(. != null)'
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/configurations/service_config_versions?service_name=HDFS&service_config_version=1" `
        -Credential $creds -UseBasicParsing
    $respObj = ConvertFrom-Json $resp.Content
    $respObj.items.configurations.properties.'dfs.adls.home.hostname'
    

    قيمة الإرجاع مشابهة ل ACCOUNTNAME.azuredatalakestore.net، حيث هو اسم حساب ACCOUNTNAME Data Lake Storage.

    للبحث عن الدليل داخل Data Lake Storage التي تحتوي على التخزين للكتلة، استخدم الأمثلة التالية:

    curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/configurations/service_config_versions?service_name=HDFS&service_config_version=1" \
    | jq -r '.items[].configurations[].properties["dfs.adls.home.mountpoint"] | select(. != null)'
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/configurations/service_config_versions?service_name=HDFS&service_config_version=1" `
        -Credential $creds -UseBasicParsing
    $respObj = ConvertFrom-Json $resp.Content
    $respObj.items.configurations.properties.'dfs.adls.home.mountpoint'
    

    قيمة الإرجاع مشابهة لـ /clusters/CLUSTERNAME/. هذه القيمة مسار داخل حساب Data Lake Storage. هذا المسار هو جذر نظام الملفات المتوافق مع HDFS للكتلة.

ملاحظة

كما يقوم Cmdlet Get-AzHDInsightCluster الذي توفره Azure PowerShell بإرجاع معلومات التخزين الخاصة بالكتلة.

الحصول على جميع التكوينات

الحصول على التكوينات المتوفرة للكتلة الخاصة بك.

curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName?fields=Clusters/desired_configs"
$respObj = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName`?fields=Clusters/desired_configs" `
    -Credential $creds -UseBasicParsing
$respObj.Content

هذا المثال يرجع مستند JSON المحتوي على التكوين الحالي للمكونات المثبتة. راجع قيمة العلامة. المثال التالي مقتطف من البيانات المرتجعة من نوع كتلة Spark.

"jupyter-site" : {
  "tag" : "INITIAL",
  "version" : 1
},
"livy2-client-conf" : {
  "tag" : "INITIAL",
  "version" : 1
},
"livy2-conf" : {
  "tag" : "INITIAL",
  "version" : 1
},

الحصول على تكوين لمكون معين

احصل على التكوين للمكون الذي تهتم به. في المثال التالي، استبدال INITIAL بقيمة العلامة المرتجعة من الطلب السابق.

curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/configurations?type=livy2-conf&tag=INITIAL"
$resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/configurations?type=livy2-conf&tag=INITIAL" `
    -Credential $creds -UseBasicParsing
$resp.Content

هذا المثال يرجع مستند JSON المحتوي على التكوين الحالي livy2-conf للمكون.

تحديث التكوين

  1. إنشاء newconfig.json.
    تعديل ثم قم بإدخال الأوامر أدناه:

    • استبدل livy2-conf المكون الجديد.

    • استبدل INITIAL بالقيمة الفعلية المستردة tag من Get all configurations.

      أ. Bash

      curl -u admin:$password -sS -G "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/configurations?type=livy2-conf&tag=INITIAL" \
      | jq --arg newtag $(echo version$(date +%s%N)) '.items[] | del(.href, .version, .Config) | .tag |= $newtag | {"Clusters": {"desired_config": .}}' > newconfig.json
      

      ب. PowerShell
      يستخدم البرنامج النصيjq PowerShell. حرر C:\HD\jq\jq-win64 below to reflect your actual path and version of jq.

      $epoch = Get-Date -Year 1970 -Month 1 -Day 1 -Hour 0 -Minute 0 -Second 0
      $now = Get-Date
      $unixTimeStamp = [math]::truncate($now.ToUniversalTime().Subtract($epoch).TotalMilliSeconds)
      $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/configurations?type=livy2-conf&tag=INITIAL" `
        -Credential $creds -UseBasicParsing
      $resp.Content | C:\HD\jq\jq-win64 --arg newtag "version$unixTimeStamp" '.items[] | del(.href, .version, .Config) | .tag |= $newtag | {"Clusters": {"desired_config": .}}' > newconfig.json
      

      يستخدم JQ لتحويل البيانات المستردة من HDInsight إلى قالب تكوين جديد. وبوجه خاص، هذه الأمثلة القيام بالإجراءات التالية:

    • إنشاء قيمة فريدة تحتوي على السلسلة "الإصدار" والتاريخ، الذي يتم تخزينه في newtag.

    • إنشاء مستند جذر للتكوين الجديد.

    • يحصل على محتويات .items[] الصفيف ويضيفه تحت عنصر desired_config.

    • احذف العناصر hrefو، versionو، Config، حيث لا يلزم إرسال تكوين جديد لهذه العناصر.

    • إضافة tag عنصر بقيمة version#################. يستند الجزء الرقمي إلى التاريخ الحالي. يجب أن يكون لكل تكوين علامة فريدة.

      وأخيراً، تُحفظ البيانات إلى المستند newconfig.json. يجب أن تظهر بنية المستند مشابهة للمثال التالي:

      {
        "Clusters": {
          "desired_config": {
            "tag": "version1552064778014",
            "type": "livy2-conf",
            "properties": {
              "livy.environment": "production",
              "livy.impersonation.enabled": "true",
              "livy.repl.enableHiveContext": "true",
              "livy.server.csrf_protection.enabled": "true",
                ....
            },
          },
        }
      }
      
  2. Edit newconfig.json.
    افتح newconfig.json document ثم قم بتعديل/إضافة قيم في properties object. يغير المثال التالي قيمة "livy.server.csrf_protection.enabled" من "true" إلى "false".

    "livy.server.csrf_protection.enabled": "false",
    

    احفظ الملف بمجرد الانتهاء من إجراء التعديلات.

  3. إرسال newconfig.json.
    استخدم الأوامر التالية لإرسال التكوين المحدث إلى Ambari.

    curl -u admin:$password -sS -H "X-Requested-By: ambari" -X PUT -d @newconfig.json "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName"
    
    $newConfig = Get-Content .\newconfig.json
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName" `
        -Credential $creds -UseBasicParsing `
        -Method PUT `
        -Headers @{"X-Requested-By" = "ambari"} `
        -Body $newConfig
    $resp.Content
    

    هذه الأوامر إرسال محتويات newconfig.js في الملف إلى الكتلة التكوين الجديد. إرجاع الطلب مستند JSON. يجب أن يتطابق عنصر versionTag في هذا المستند مع الإصدار الذي أرسلته، ويحتوي الكائن التكوينات على تغييرات التكوين التي طلبتها.

إعادة تشغيل مكون خدمة

في هذه المرحلة، تشير واجهة مستخدم ويب Ambari إلى أن خدمة Spark تحتاج إلى إعادة التشغيل قبل أن يصبح التكوين الجديد ساري المفعول. استخدم الخطوات التالية لإعادة تشغيل الخدمة.

  1. استخدم ما يلي لتمكين وضع الصيانة لخدمة Spark2:

    curl -u admin:$password -sS -H "X-Requested-By: ambari" \
    -X PUT -d '{"RequestInfo": {"context": "turning on maintenance mode for SPARK2"},"Body": {"ServiceInfo": {"maintenance_state":"ON"}}}' \
    "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/SPARK2"
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/SPARK2" `
        -Credential $creds -UseBasicParsing `
        -Method PUT `
        -Headers @{"X-Requested-By" = "ambari"} `
        -Body '{"RequestInfo": {"context": "turning on maintenance mode for SPARK2"},"Body": {"ServiceInfo": {"maintenance_state":"ON"}}}'
    
  2. التحقق من وضع الصيانة

    هذه الأوامر إرسال مستند JSON إلى الخادم الذي يقوم بتشغيل وضع الصيانة. يمكنك التحقق من أن الخدمة الآن في وضع الصيانة باستخدام الطلب التالي:

    curl -u admin:$password -sS -H "X-Requested-By: ambari" \
    "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/SPARK2" \
    | jq .ServiceInfo.maintenance_state
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/SPARK2" `
        -Credential $creds -UseBasicParsing
    $respObj = ConvertFrom-Json $resp.Content
    $respObj.ServiceInfo.maintenance_state
    

    القيمة المرجعة هي ON.

  3. بعد ذلك، استخدم ما يلي لإيقاف تشغيل خدمة Spark2:

    curl -u admin:$password -sS -H "X-Requested-By: ambari" \
    -X PUT -d '{"RequestInfo":{"context":"_PARSE_.STOP.SPARK2","operation_level":{"level":"SERVICE","cluster_name":"CLUSTERNAME","service_name":"SPARK"}},"Body":{"ServiceInfo":{"state":"INSTALLED"}}}' \
    "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/SPARK2"
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/SPARK2" `
        -Credential $creds -UseBasicParsing `
        -Method PUT `
        -Headers @{"X-Requested-By" = "ambari"} `
        -Body '{"RequestInfo":{"context":"_PARSE_.STOP.SPARK2","operation_level":{"level":"SERVICE","cluster_name":"CLUSTERNAME","service_name":"SPARK"}},"Body":{"ServiceInfo":{"state":"INSTALLED"}}}'
    $resp.Content
    

    الاستجابة مماثلة للمثال التالي:

    {
        "href" : "http://10.0.0.18:8080/api/v1/clusters/CLUSTERNAME/requests/29",
        "Requests" : {
            "id" : 29,
            "status" : "Accepted"
        }
    }
    

    هام

    hrefتستخدم القيمة المرجعة بواسطة URI عنوان IP الداخلي لعقدة نظام المجموعة. لاستخدامه من خارج الكتلة استبدل 10.0.0.18:8080 الجزء مع FQDN الكتلة.

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

    curl -u admin:$password -sS -H "X-Requested-By: ambari" \
    "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/requests/29" \
    | jq .Requests.request_status
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/requests/29" `
        -Credential $creds -UseBasicParsing
    $respObj = ConvertFrom-Json $resp.Content
    $respObj.Requests.request_status
    

    يشير رد من COMPLETED إلى أن الطلب قد انتهى.

  5. بمجرد اكتمال الطلب السابق، استخدم ما يلي لبدء تشغيل خدمة Spark2.

    curl -u admin:$password -sS -H "X-Requested-By: ambari" \
    -X PUT -d '{"RequestInfo":{"context":"_PARSE_.START.SPARK2","operation_level":{"level":"SERVICE","cluster_name":"CLUSTERNAME","service_name":"SPARK"}},"Body":{"ServiceInfo":{"state":"STARTED"}}}' \
    "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/SPARK2"
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/SPARK2" `
        -Credential $creds -UseBasicParsing `
        -Method PUT `
        -Headers @{"X-Requested-By" = "ambari"} `
        -Body '{"RequestInfo":{"context":"_PARSE_.START.SPARK2","operation_level":{"level":"SERVICE","cluster_name":"CLUSTERNAME","service_name":"SPARK"}},"Body":{"ServiceInfo":{"state":"STARTED"}}}'
    $resp.Content
    

    تستخدم الخدمة الآن التكوين الجديد.

  6. وأخيراً، استخدم ما يلي لإيقاف تشغيل وضع الصيانة.

    curl -u admin:$password -sS -H "X-Requested-By: ambari" \
    -X PUT -d '{"RequestInfo": {"context": "turning off maintenance mode for SPARK2"},"Body": {"ServiceInfo": {"maintenance_state":"OFF"}}}' \
    "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/SPARK2"
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/api/v1/clusters/$clusterName/services/SPARK2" `
        -Credential $creds -UseBasicParsing `
        -Method PUT `
        -Headers @{"X-Requested-By" = "ambari"} `
        -Body '{"RequestInfo": {"context": "turning off maintenance mode for SPARK2"},"Body": {"ServiceInfo": {"maintenance_state":"OFF"}}}'
    

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

للحصول على مرجع كامل من API REST، راجع Apache Ambari API Reference V1. راجع أيضاً تخويل المستخدمين لطرق عرض Apache Ambari