用于 Go 的 HDInsight SDK(预览版)

概述

用于 Go 的 HDInsight SDK 提供了用于管理 HDInsight 群集的类和函数。 该 SDK 包含用于创建、删除、更新、列出、调整大小、执行脚本操作,以及监视、获取 HDInsight 群集属性等操作。

注意

还可以从此处获得适用于此 SDK 的GoDoc 参考资料。

如果没有 Azure 订阅,可在开始前创建一个试用帐户

先决条件

SDK 安装

从 GOPATH 位置中,运行 go get github.com/Azure/azure-sdk-for-go/tree/master/services/preview/hdinsight/mgmt/2018-06-01-preview/hdinsight

身份验证

首先需要使用 Azure 订阅对该 SDK 进行身份验证。 请遵循以下示例创建服务主体,然后使用该服务主体进行身份验证。 完成此操作后,你将会获得 ClustersClient 的实例,其中包含可用于执行管理操作的许多函数(以下部分将概述这些函数)。

注意

除了以下示例中所示的方法以外,还有其他一些身份验证方法可能更符合你的需要。 此处概述了所有函数:Azure SDK for Go 中的身份验证函数

使用服务主体的身份验证示例

验证当前使用的是要在其中创建服务主体的订阅。

az account show

订阅信息将显示为 JSON。

{
  "environmentName": "AzureChinaCloud",
  "id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "isDefault": true,
  "name": "XXXXXXX",
  "state": "Enabled",
  "tenantId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "user": {
    "cloudShellID": true,
    "name": "XXX@XXX.XXX",
    "type": "user"
  }
}

如果尚未登录到正确的订阅,请运行以下命令选择正确的订阅:

az account set -s <name or ID of subscription>

重要

如果尚未通过其他功能(例如,通过 Azure 门户创建 HDInsight 群集)注册 HDInsight 资源提供程序,则需要先执行一次此操作,然后才能进行身份验证。 可以通过运行以下命令来执行此操作:

az provider register --namespace Microsoft.HDInsight

接下来,选择服务主体的名称,然后使用以下命令创建服务主体:

az ad sp create-for-rbac --name <Service Principal Name> --sdk-auth --role Contributor --scopes /subscriptions/<subscription id>

服务主体信息将以 JSON 格式显示。

{
  "clientId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "clientSecret": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "subscriptionId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "tenantId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "activeDirectoryEndpointUrl": "https://login.microsoftonline.com",
  "resourceManagerEndpointUrl": "https://management.chinacloudapi.cn/",
  "sqlManagementEndpointUrl": "https://management.core.chinacloudapi.cn:8443/",
  "galleryEndpointUrl": "https://gallery.azure.com/",
  "managementEndpointUrl": "https://management.core.chinacloudapi.cn/"
}

复制以下代码片段,并在 TENANT_IDCLIENT_IDCLIENT_SECRETSUBSCRIPTION_ID 中填写运行创建服务主体的命令后返回的 JSON 中的字符串。

package main

import (
    "context"
    "github.com/Azure/go-autorest/autorest/azure/auth"
    hdi "github.com/Azure/azure-sdk-for-go/services/preview/hdinsight/mgmt/2018-06-01-preview/hdinsight"
    "github.com/Azure/go-autorest/autorest/to"
)

func main() {
    var err error

    // Tenant ID for your Azure Subscription
    var TENANT_ID = ""
    // Your Service Principal App Client ID
    var CLIENT_ID = ""
    // Your Service Principal Client Secret
    var CLIENT_SECRET = ""
    // Azure Subscription ID
    var SUBSCRIPTION_ID = ""

    var credentials = auth.NewClientCredentialsConfig(CLIENT_ID, CLIENT_SECRET, TENANT_ID)
    var client = hdi.NewClustersClient(SUBSCRIPTION_ID)

    client.Authorizer, err = credentials.Authorizer()
    if (err != nil) {
        fmt.Println("Error: ", err)
    }

群集管理

注意

本部分假设你已完成身份验证,已构造 ClusterClient 实例并已将其存储在名为 client 的变量中。 在前面的“身份验证”部分中可以找到有关身份验证和获取 ClusterClient 的说明。

创建群集

可以通过调用 client.Create() 来创建新群集。

示例

本示例演示如何创建包含两个头节点和一个工作器节点的 Apache Spark 群集。

注意

首先需要创建一个资源组和存储帐户,下面将予以介绍。 如果已创建资源组和存储帐户,则可以跳过这些步骤。

创建资源组

可以运行以下命令来创建资源组:

az group create -l <Region Name (i.e. chinaeast)> --n <Resource Group Name>
创建存储帐户

可以运行以下命令来创建存储帐户:

az storage account create -n <Storage Account Name> -g <Existing Resource Group Name> -l <Region Name (i.e. chinaeast)> --sku <SKU i.e. Standard_LRS>

现在,运行以下命令获取存储帐户的密钥(创建群集时需要用到):

az storage account keys list -n <Storage Account Name>

以下 Go 代码片段创建一个包含两个头节点和一个工作器节点的 Spark 群集。 按照注释中所述填写空白变量,并根据具体的需要任意更改其他参数。

// The name for the cluster you are creating
var clusterName = "";
// The name of your existing Resource Group
var resourceGroupName = "";
// Choose a username
var username = "";
// Choose a password
var password = "";
// Replace <> with the name of your storage account
var storageAccount = "<>.blob.core.chinacloudapi.cn";
// Storage account key you obtained above
var storageAccountKey = "";
// Choose a region
var location = "";
var container = "default";

var parameters = hdi.ClusterCreateParametersExtended {
    Location: to.StringPtr(location),
    Tags: make(map[string]*string),
    Properties: &hdi.ClusterCreateProperties {
        ClusterVersion: to.StringPtr("3.6"),
        OsType: hdi.Linux,
        ClusterDefinition: &hdi.ClusterDefinition {
            Kind: to.StringPtr("spark"),
            Configurations: map[string]map[string]interface{}{
                "gateway": {
                    "restAuthCredential.isEnabled": "True",
                    "restAuthCredential.username":  username,
                    "restAuthCredential.password":  password,
                },
            },
        },
        Tier: hdi.Standard,
        ComputeProfile: &hdi.ComputeProfile {
            Roles: &[]hdi.Role {
                hdi.Role {
                    Name: to.StringPtr("headnode"),
                    TargetInstanceCount: to.Int32Ptr(2),
                    HardwareProfile: &hdi.HardwareProfile {
                        VMSize: to.StringPtr("Large"),
                    },
                    OsProfile: &hdi.OsProfile {
                        LinuxOperatingSystemProfile: &hdi.LinuxOperatingSystemProfile {
                            Username: to.StringPtr(username),
                            Password: to.StringPtr(password),
                        },
                    },
                },
                hdi.Role {
                    Name: to.StringPtr("workernode"),
                    TargetInstanceCount: to.Int32Ptr(1),
                    HardwareProfile: &hdi.HardwareProfile {
                        VMSize: to.StringPtr("Large"),
                    },
                    OsProfile: &hdi.OsProfile {
                        LinuxOperatingSystemProfile: &hdi.LinuxOperatingSystemProfile {
                            Username: to.StringPtr(username),
                            Password: to.StringPtr(password),
                        },
                    },
                },
            },
        },
        StorageProfile: &hdi.StorageProfile {
            Storageaccounts: &[]hdi.StorageAccount {
                hdi.StorageAccount {
                    Name: to.StringPtr(storageAccount),
                    Key: to.StringPtr(storageAccountKey),
                    Container: to.StringPtr(container),
                    IsDefault: to.BoolPtr(true),
                },
            },
        },
    },
}
client.Create(context.Background(), resourceGroupName, clusterName, parameters)

获取群集详细信息

获取给定群集的属性:

client.Get(context.Background(), "<Resource Group Name>", "<Cluster Name>")

示例

可使用 get 来确认已成功创建群集。

cluster, err := client.Get(context.Background(), resourceGroupName, clusterName)
if (err != nil) {
    fmt.Println("Error: ", err)
}
fmt.Println(*cluster.Name)
fmt.Println(*cluster.ID

输出应如下所示:

<Cluster Name>
/subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourceGroups/<Resource Group Name>/providers/Microsoft.HDInsight/clusters/<Cluster Name>

列出群集

列出订阅下的群集

client.List()

按资源组列出群集

client.ListByResourceGroup("<Resource Group Name>")

注意

List()ListByResourceGroup() 都返回 ClusterListResultPage 结构。 若要获取下一个页面,可以调用 Next()。 可以反复执行此调用,直到 ClusterListResultPage.NotDone() 返回 false,如以下示例中所示。

示例

以下示例列显当前订阅的所有群集的属性:

page, err := client.List(context.Background())
if (err != nil) {
    fmt.Println("Error: ", err)
}
for (page.NotDone()) {
    for _, cluster := range page.Values() {
        fmt.Println(*cluster.Name)
    }
    err = page.Next();
    if (err != nil) {
        fmt.Println("Error: ", err)
    }
}

删除群集

删除群集:

client.Delete(context.Background(), "<Resource Group Name>", "<Cluster Name>")

更新群集标记

可按如下所示更新给定群集的标记:

client.Update(context.Background(), "<Resource Group Name>", "<Cluster Name>", hdi.ClusterPatchParameters{<map[string]*string} of Tags>)

示例

client.Update(context.Background(), "SDKTestRG", "SDKTest", hdi.ClusterPatchParameters{map[string]*string{"tag1Name" : to.StringPtr("tag1Value"), "tag2Name" : to.StringPtr("tag2Value")}})

调整群集大小

可以通过指定新大小来调整给定群集的工作节点数,如下所示:

client.Resize(context.Background(), "<Resource Group Name>", "<Cluster Name>", hdi.ClusterResizeParameters{<Num of Worker Nodes (int)>})

群集监视

HDInsight 管理 SDK 可用于通过 Operations Management Suite (OMS) 来管理对群集的监视。

与创建 ClusterClient 以用于管理操作类似,你需要创建一个 ExtensionClient 来用于监视操作。 完成上面的“身份验证”部分后,可创建一个 ExtensionClient,如下所示:

extClient := hdi.NewExtensionsClient(SUBSCRIPTION_ID)
extClient.Authorizer, _ = credentials.Authorizer()

注意

下面的监视示例假定你已如上所示初始化了一个名为 extClientExtensionClient 并设置了其 Authorizer

启用 OMS 监视

注意

若要启用 OMS 监视,必须已有一个 Log Analytics 工作区。 如果尚未创建工作区,可在此了解创建方法:在 Azure 门户中创建 Log Analytics 工作区

在群集上启用 OMS 监视:

extClient.EnableMonitoring(context.Background(), "<Resource Group Name", "Cluster Name", hdi.ClusterMonitoringRequest {WorkspaceID: to.StringPtr("<Workspace Id>")})

查看 OMS 监视状态

获取群集上的 OMS 状态:

extClient.GetMonitoringStatus(context.Background(), "<Resource Group Name", "Cluster Name")

禁用 OMS 监视

在群集上禁用 OMS:

extClient.DisableMonitoring(context.Background(), "<Resource Group Name", "Cluster Name")

脚本操作

HDInsight 提供了一个名为脚本操作的配置函数,可用于调用自定义脚本来自定义群集。

注意

有关如何使用脚本操作的详细信息见此处:使用脚本操作自定义基于 Linux 的 HDInsight 群集

执行脚本操作

可按如下所示在给定的群集上执行脚本操作:

var scriptAction1 = hdi.RuntimeScriptAction{Name: to.StringPtr("<Script Name>"), URI: to.StringPtr("<URL To Script>"), Roles: <&[]string of roles>} //valid roles are "headnode", "workernode", "zookeepernode", and "edgenode"
client.ExecuteScriptActions(context.Background(), "<Resource Group Name>", "<Cluster Name>", hdi.ExecuteScriptActionParameters{PersistOnSuccess: to.BoolPtr(true), ScriptActions: &[]hdi.RuntimeScriptAction{scriptAction1}}) //add more RuntimeScriptActions to the list to execute multiple scripts

对于“删除脚本操作”和“列出持久化脚本操作”操作,你需要创建一个 ScriptActionsClient,类似于创建 ClusterClient 以用于管理操作。 完成上面的“身份验证”部分后,可以创建一个 ScriptActionsClient,如下所示:

scriptActionsClient := hdi.NewScriptActionsClient(SUBSCRIPTION_ID)
scriptActionsClient.Authorizer, _ = credentials.Authorizer()

注意

下面的脚本操作示例假定你已如上所示初始化了一个名为 scriptActionsClientScriptActionsClient 并设置了其 Authorizer

删除脚本操作

删除给定群集上指定的持久化脚本操作:

scriptActionsClient.Delete(context.Background(), "<Resource Group Name>", "<Cluster Name>", "<Script Name>")

列出持久化脚本操作

注意

ListByCluster() 返回一个 ScriptActionsListPage 结构。 若要获取下一个页面,可以调用 Next()。 可以反复执行此调用,直到 ClusterListResultPage.NotDone() 返回 false,如以下示例中所示。

列出指定群集的所有持久化脚本操作:

scriptActionsClient.ListByCluster(context.Background(), "<Resource Group Name>", "<Cluster Name>")

示例

page, err := scriptActionsClient.ListByCluster(context.Background(), resourceGroupName, clusterName)
if (err != nil) {
    fmt.Println("Error: ", err)
}
for (page.NotDone()) {
    for _, script := range page.Values() {
        fmt.Println(*script.Name) //There are functions to get other properties of RuntimeScriptActionDetail besides Name, such as Status, Operation, StartTime, EndTime, etc. See reference documentation.
    }
    err = page.Next();
    if (err != nil) {
        fmt.Println("Error: ", err)
    }
}

列出所有脚本的执行历史记录

对于此操作,与创建 ScriptExecutionHistoryClient 以用于管理操作的方式类似,你需要创建一个 ClusterClient。 完成上面的“身份验证”部分后,可以创建一个 ScriptActionsClient,如下所示:

scriptExecutionHistoryClient := hdi.NewScriptExecutionHistoryClient(SUBSCRIPTION_ID)
scriptExecutionHistoryClient.Authorizer, _ = credentials.Authorizer()

注意

以下示例假定你已如上所示初始化了一个名为 scriptExecutionHistoryClientScriptExecutionHistoryClient 并设置了其 Authorizer

列出指定群集的所有脚本的执行历史记录:

scriptExecutionHistoryClient.ListByCluster(context.Background(), "<Resource Group Name>", "<Cluster Name>")

示例

此示例列显以往所有脚本执行活动的所有详细信息。

page, err := scriptExecutionHistoryClient.ListByCluster(context.Background(), resourceGroupName, clusterName)
if (err != nil) {
    fmt.Println("Error: ", err)
}
for (page.NotDone()) {
    for _, script := range page.Values() {
        fmt.Println(*script.Name) //There are functions to get other properties of RuntimeScriptActionDetail besides Name, such as Status, Operation, StartTime, EndTime, etc. See reference documentation.
    }
    err = page.Next();
    if (err != nil) {
        fmt.Println("Error: ", err)
    }
}

后续步骤

探究 GoDoc 参考资料。 GoDoc 提供了 SDK 中的所有函数的参考文档。