用于 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_ID
、CLIENT_ID
、CLIENT_SECRET
和 SUBSCRIPTION_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()
注意
下面的监视示例假定你已如上所示初始化了一个名为 extClient
的 ExtensionClient
并设置了其 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()
注意
下面的脚本操作示例假定你已如上所示初始化了一个名为 scriptActionsClient
的 ScriptActionsClient
并设置了其 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()
注意
以下示例假定你已如上所示初始化了一个名为 scriptExecutionHistoryClient
的 ScriptExecutionHistoryClient
并设置了其 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 中的所有函数的参考文档。