إنشاء أنظمة مجموعات Apache Hadoop باستخدام واجهة برمجة تطبيقات REST في Azure

تعرف على كيفية إنشاء مجموعة HDInsight باستخدام قالب Azure Resource Manager وواجهة برمجة تطبيقات Azure REST.

تسمح لك واجهة Azure REST API بتنفيذ عمليات الإدارة على الخدمات المستضافة في النظام الأساسي Azure، بما في ذلك إنشاء موارد جديدة مثل مجموعات HDInsight.

إشعار

تستخدم الخطوات الواردة في هذا المستند الأداة المساعدة curl (https://curl.haxx.se/) للاتصال بواجهة برمجة تطبيقات Azure REST.

إنشاء قالب

قوالب Azure Resource Manager هي مستندات JSON تصف مجموعة موارد وجميع الموارد الموجودة فيها (مثل HDInsight.) يتيح لك هذا الأسلوب -المستند إلى القالب- تحديد الموارد التي تحتاجها لـ HDInsight في قالب واحد.

مستند JSON التالي عبارة عن دمج لملفات القالب والمَعلمات من https://github.com/Azure/azure-quickstart-templates/tree/master/quickstarts/microsoft.hdinsight/hdinsight-linux-ssh-password/azuredeploy.json، ما يؤدي إلى إنشاء مجموعة قائمة على Linux باستخدام كلمة مرور لتأمين حساب مستخدم SSH.

{
    "properties": {
        "template": {
            "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
            "contentVersion": "1.0.0.0",
            "parameters": {
                "clusterType": {
                    "type": "string",
                    "allowedValues": ["hadoop",
                    "hbase",
                    "spark"],
                    "metadata": {
                        "description": "The type of the HDInsight cluster to create."
                    }
                },
                "clusterName": {
                    "type": "string",
                    "metadata": {
                        "description": "The name of the HDInsight cluster to create."
                    }
                },
                "clusterLoginUserName": {
                    "type": "string",
                    "metadata": {
                        "description": "These credentials can be used to submit jobs to the cluster and to log into cluster dashboards."
                    }
                },
                "clusterLoginPassword": {
                    "type": "securestring",
                    "metadata": {
                        "description": "The password must be at least 10 characters in length and must contain at least one digit, one non-alphanumeric character, and one upper or lower case letter."
                    }
                },
                "sshUserName": {
                    "type": "string",
                    "metadata": {
                        "description": "These credentials can be used to remotely access the cluster."
                    }
                },
                "sshPassword": {
                    "type": "securestring",
                    "metadata": {
                        "description": "The password must be at least 10 characters in length and must contain at least one digit, one non-alphanumeric character, and one upper or lower case letter."
                    }
                },
                "clusterStorageAccountName": {
                    "type": "string",
                    "metadata": {
                        "description": "The name of the storage account to be created and be used as the cluster's storage."
                    }
                },
                "clusterWorkerNodeCount": {
                    "type": "int",
                    "defaultValue": 4,
                    "metadata": {
                        "description": "The number of nodes in the HDInsight cluster."
                    }
                }
            },
            "variables": {
                "defaultApiVersion": "2015-05-01-preview",
                "clusterApiVersion": "2015-03-01-preview"
            },
            "resources": [{
                "name": "[parameters('clusterStorageAccountName')]",
                "type": "Microsoft.Storage/storageAccounts",
                "location": "[resourceGroup().location]",
                "apiVersion": "[variables('defaultApiVersion')]",
                "dependsOn": [],
                "tags": {

                },
                "properties": {
                    "accountType": "Standard_LRS"
                }
            },
            {
                "name": "[parameters('clusterName')]",
                "type": "Microsoft.HDInsight/clusters",
                "location": "[resourceGroup().location]",
                "apiVersion": "[variables('clusterApiVersion')]",
                "dependsOn": ["[concat('Microsoft.Storage/storageAccounts/',parameters('clusterStorageAccountName'))]"],
                "tags": {

                },
                "properties": {
                    "clusterVersion": "3.6",
                    "osType": "Linux",
                    "clusterDefinition": {
                        "kind": "[parameters('clusterType')]",
                        "configurations": {
                            "gateway": {
                                "restAuthCredential.isEnabled": true,
                                "restAuthCredential.username": "[parameters('clusterLoginUserName')]",
                                "restAuthCredential.password": "[parameters('clusterLoginPassword')]"
                            }
                        }
                    },
                    "storageProfile": {
                        "storageaccounts": [{
                            "name": "[concat(parameters('clusterStorageAccountName'),'.blob.core.windows.net')]",
                            "isDefault": true,
                            "container": "[parameters('clusterName')]",
                            "key": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('clusterStorageAccountName')), variables('defaultApiVersion')).key1]"
                        }]
                    },
                    "computeProfile": {
                        "roles": [{
                            "name": "headnode",
                            "targetInstanceCount": "2",
                            "hardwareProfile": {
                                "vmSize": "{}" 
                            },
                            "osProfile": {
                                "linuxOperatingSystemProfile": {
                                    "username": "[parameters('sshUserName')]",
                                    "password": "[parameters('sshPassword')]"
                                }
                            }
                        },
                        {
                            "name": "workernode",
                            "targetInstanceCount": "[parameters('clusterWorkerNodeCount')]",
                            "hardwareProfile": {
                                "vmSize": "{}"
                            },
                            "osProfile": {
                                "linuxOperatingSystemProfile": {
                                    "username": "[parameters('sshUserName')]",
                                    "password": "[parameters('sshPassword')]"
                                }
                            }
                        }]
                    }
                }
            }],
            "outputs": {
                "cluster": {
                    "type": "object",
                    "value": "[reference(resourceId('Microsoft.HDInsight/clusters',parameters('clusterName')))]"
                }
            }
        },
        "mode": "incremental",
        "Parameters": {
            "clusterName": {
                "value": "newclustername"
            },
            "clusterType": {
                "value": "hadoop"
            },
            "clusterStorageAccountName": {
                "value": "newstoragename"
            },
            "clusterLoginUserName": {
                "value": "admin"
            },
            "clusterLoginPassword": {
                "value": "changeme"
            },
            "sshUserName": {
                "value": "sshuser"
            },
            "sshPassword": {
                "value": "changeme"
            }
        }
    }
}

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

هام

يستخدم القالب العدد الافتراضي للعقد العاملة (4) لمجموعة HDInsight. إذا كنت تخطط لأكثر من 32 عقدة عاملة، فيجب عليك تحديد حجم عقدة رئيسية مع ما لا يقل عن 8 مراكز و14 جيجابايت من ذاكرة الوصول العشوائي.

لمزيد من المعلومات حول أحجام العقد والتكاليف المرتبطة بها، راجع تسعير HDInsight.

تسجيل الدخول إلى اشتراك Azure الخاص بك

اتبع الخطوات الموثقة في بدء استخدام Azure CLI واتصل باشتراكك باستخدام الأمر az login.

إنشاء كيان خدمة

إشعار

هذه الخطوات عبارة عن نسخة مختصرة من قسم إنشاء مبدأ الخدمة بكلمة مرور من مستند استخدام Azure CLI لإنشاء مبدأ خدمة للوصول إلى الموارد. تُنشئ هذه الخطوات أساس خدمة، يُستخدم للمصادقة على Azure REST API.

  1. من سطر الأوامر، استخدم الأمر التالي لسرد اشتراكات Azure الخاصة بك.

    az account list --query '[].{Subscription_ID:id,Tenant_ID:tenantId,Name:name}'  --output table
    

    في القائمة، حدد الاشتراك الذي تريد استخدامه ولاحظ عمودي Subscription_ID وTenant_ID. احفظ هذه القيم.

  2. استخدم الأمر التالي لإنشاء تطبيق في معرف Microsoft Entra.

    az ad app create --display-name "exampleapp" --homepage "https://www.contoso.org" --identifier-uris "https://www.contoso.org/example" --password <Your password> --query 'appId'
    

    استبدل قيم --display-name و--homepage و--identifier-uris بالقيم الخاصة بك. قم بتوفير كلمة مرور لإدخال خدمات مجال Active Directory الجديد.

    إشعار

    لا تحتاج القيمتان --home-page و--identifier-uris إلى الإشارة إلى صفحة ويب فعلية مستضافة على الإنترنت. يجب أن تكون فريدة من نوعها.

    القيمة التي تم إرجاعها من هذا الأمر هي معرف التطبيق للتطبيق الجديد. لاحظ هذه القيمة.

  3. استخدم الأمر التالي لإنشاء مبدأ أساسي للخدمة باستخدام معرف التطبيق.

    az ad sp create --id <App ID> --query 'objectId'
    

    القيمة التي تم إرجاعها من هذا الأمر هي معرف الكائن. لاحظ هذه القيمة.

  4. قم بتعيين دور المالك لمدير الخدمة باستخدام قيمة معرف الكائن. استخدم معرّف الاشتراك الذي حصلت عليه سابقاً.

    az role assignment create --assignee <Object ID> --role Owner --scope /subscriptions/<Subscription ID>/
    

احصل على رمز المصادقة

استخدم الأمر التالي لاسترداد رمز المصادقة المميز:

curl -X "POST" "https://login.microsoftonline.com/$TENANTID/oauth2/token" \
-H "Cookie: flight-uxoptin=true; stsservicecookie=ests; x-ms-gateway-slice=productionb; stsservicecookie=ests" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "client_id=$APPID" \
--data-urlencode "grant_type=client_credentials" \
--data-urlencode "client_secret=$PASSWORD" \
--data-urlencode "resource=https://management.azure.com/"

عيّن $TENANTID و$APPID و$PASSWORD على القيم التي تم الحصول عليها أو استخدامها سابقاً.

إذا نجح هذا الطلب، فستتلقى استجابة من سلسلة 200 ويحتوي نص الاستجابة على مستند JSON.

يحتوي مستند JSON الذي تم إرجاعه بواسطة هذا الطلب على عنصر يسمى access_token. يتم استخدام قيمة access_token لطلبات المصادقة لواجهة برمجة تطبيقات REST.

{
    "token_type":"Bearer",
    "expires_in":"3599",
    "expires_on":"1463409994",
    "not_before":"1463406094",
    "resource":"https://management.azure.com/","access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik1uQ19WWoNBVGZNNXBPWWlKSE1iYTlnb0VLWSIsImtpZCI6Ik1uQ19WWmNBVGZNNXBPWWlKSE1iYTlnb0VLWSJ9.eyJhdWQiOiJodHRwczovL21hbmFnZW1lbnQuYXp1cmUuY29tLyIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0LzcyZjk4OGJmLTg2ZjEtNDFhZi05MWFiLTJkN2NkMDExZGI2Ny8iLCJpYXQiOjE0NjM0MDYwOTQsIm5iZiI6MTQ2MzQwNjA5NCwiZXhwIjoxNDYzNDA5OTk5LCJhcHBpZCI6IjBlYzcyMzM0LTZkMDMtNDhmYi04OWU1LTU2NTJiODBiZDliYiIsImFwcGlkYWNyIjoiMSIsImlkcCI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0LzcyZjk4OGJmLTg2ZjEtNDFhZi05MWFiLTJkN2NkMDExZGI0Ny8iLCJvaWQiOiJlNjgxZTZiMi1mZThkLTRkZGUtYjZiMS0xNjAyZDQyNWQzOWYiLCJzdWIiOiJlNjgxZTZiMi1mZThkLTRkZGUtYjZiMS0xNjAyZDQyNWQzOWYiLCJ0aWQiOiI3MmY5ODhiZi04NmYxLTQxYWYtOTFhYi0yZDdjZDAxMWRiNDciLCJ2ZXIiOiIxLjAifQ.nJVERbeDHLGHn7ZsbVGBJyHOu2PYhG5dji6F63gu8XN2Cvol3J1HO1uB4H3nCSt9DTu_jMHqAur_NNyobgNM21GojbEZAvd0I9NY0UDumBEvDZfMKneqp7a_cgAU7IYRcTPneSxbD6wo-8gIgfN9KDql98b0uEzixIVIWra2Q1bUUYETYqyaJNdS4RUmlJKNNpENllAyHQLv7hXnap1IuzP-f5CNIbbj9UgXxLiOtW5JhUAwWLZ3-WMhNRpUO2SIB7W7tQ0AbjXw3aUYr7el066J51z5tC1AK9UC-mD_fO_HUP6ZmPzu5gLA6DxkIIYP3grPnRVoUDltHQvwgONDOw"
}

إنشاء مجموعة موارد

استخدم ما يلي لإنشاء مجموعة موارد.

  • قم بتعيين $SUBSCRIPTIONID على معرّف الاشتراك الذي تم استلامه أثناء إنشاء مبدأ الخدمة.
  • قم بتعيين $ACCESSTOKEN إلى رمز الوصول الذي تم استلامه في الخطوة السابقة.
  • استبدل DATACENTERLOCATION بمركز البيانات الذي ترغب في إنشاء مجموعة الموارد والموارد فيه. على سبيل المثال، "وسط الولايات المتحدة".
  • عيِّن $RESOURCEGROUPNAME على الاسم الذي ترغب في استخدامه لهذه المجموعة:
curl -X "PUT" "https://management.azure.com/subscriptions/$SUBSCRIPTIONID/resourcegroups/$RESOURCEGROUPNAME?api-version=2015-01-01" \
    -H "Authorization: Bearer $ACCESSTOKEN" \
    -H "Content-Type: application/json" \
    -d $'{
"location": "DATACENTERLOCATION"
}'

إذا نجح هذا الطلب، فستتلقى استجابة من سلسلة 200 ويحتوي نص الاستجابة على مستند JSON يحتوي على معلومات حول المجموعة. يحتوي العنصر "provisioningState" على قيمة "Succeeded".

إنشاء توزيع

استخدم الأمر التالي لنشر القالب على مجموعة الموارد.

  • قم بتعيين $DEPLOYMENTNAME على الاسم الذي ترغب في استخدامه لهذا النشر.
curl -X "PUT" "https://management.azure.com/subscriptions/$SUBSCRIPTIONID/resourcegroups/$RESOURCEGROUPNAME/providers/microsoft.resources/deployments/$DEPLOYMENTNAME?api-version=2015-01-01" \
-H "Authorization: Bearer $ACCESSTOKEN" \
-H "Content-Type: application/json" \
-d "{set your body string to the template and parameters}"

إشعار

إذا قمت بحفظ القالب في ملف، فيمكنك استخدام الأمر التالي بدلاً من -d "{ template and parameters}":

--data-binary "@/path/to/file.json"

إذا نجح هذا الطلب، فستتلقى استجابة سلسلة 200 ويحتوي نص الاستجابة على مستند JSON يحتوي على معلومات حول عملية النشر.

هام

تم تقديم النشر، لكن لم يكتمل. قد يستغرق اكتمال النشر عدة دقائق، عادة حوالي 15 دقيقة.

تحقق من حالة النشر

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

curl -X "GET" "https://management.azure.com/subscriptions/$SUBSCRIPTIONID/resourcegroups/$RESOURCEGROUPNAME/providers/microsoft.resources/deployments/$DEPLOYMENTNAME?api-version=2015-01-01" \
-H "Authorization: Bearer $ACCESSTOKEN" \
-H "Content-Type: application/json"

يقوم هذا الأمر بإرجاع مستند JSON يحتوي على معلومات حول عملية النشر. يحتوي العنصر "provisioningState" على حالة النشر. إذا كان هذا العنصر يحتوي على قيمة "Succeeded"، فهذا يعني أن عملية النشر قد اكتملت بنجاح.

استكشاف الأخطاء وإصلاحها‬

إذا واجهت مشاكل في إنشاء مجموعات HDInsight، راجع متطلبات التحكم بالوصول.

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

الآن بعد أن أنشأت مجموعة HDInsight بنجاح، استخدم ما يلي لمعرفة كيفية العمل مع المجموعة الخاصة بك.

نظام مجموعة Apache Hadoop

نظام مجموعة Apache HBase