Azure HDInsight .NET SDK

用于 .NET 2.X 的 Azure HDInsight 库

概述

HDInsight 服务 .NET SDK 提供相关的类来创建、配置、提交和监视 Azure HDInsight 服务所管理的 Hadoop 作业。 此外,它还提供相应的类用于通过 HDInsight 服务管理 Azure 订阅,以及配置与 Azure 订阅所管理的 HDInsight 群集相关联的群集、存储帐户和其他资产。

管理库

作业

使用 Azure HDInsight 客户端 SDK 可创建、管理和监视 Hadoop 群集上的作业。

直接从 Visual Studio 包管理器控制台或使用 .NET Core CLI 安装 NuGet 包

Visual Studio 包管理器

Install-Package Microsoft.Azure.Management.HDInsight.Job
dotnet add package Microsoft.Azure.Management.HDInsight.Job

代码示例

此示例在 Hadoop 群集中运行 Hive 作业。

HDInsightJobManagementClient managementClient = new HDInsightJobManagementClient(clusterUri, credentials);

Dictionary<string, string> defines = new Dictionary<string, string> {
    { "hive.execution.engine", "tez" },
    { "hive.exec.reducers.max", "1" }
};
List<string> arguments = new List<string> { { "argA" }, { "argB" } };
HiveJobSubmissionParameters parameters = new HiveJobSubmissionParameters
{
    Query = "SHOW TABLES",
    Defines = defines,
    Arguments = arguments
};

JobSubmissionResponse jobResponse = managementClient.JobManagement.SubmitHiveJob(parameters);

HDInsight

使用 Azure HDInsight 管理 SDK 可创建、管理、启动、停止和缩放 Hadoop 群集。

直接从 Visual Studio 包管理器控制台或使用 .NET Core CLI 安装 NuGet 包

Visual Studio 包管理器

Install-Package Microsoft.Azure.Management.HDInsight
dotnet add package Microsoft.Azure.Management.HDInsight

代码示例

此示例使用现有的 Azure Blob 存储创建 HDInsight 双节点 Linux Hadoop 群集。

HDInsightManagementClient managementClient = new HDInsightManagementClient(authToken);
// Set parameters for the new cluster
ClusterCreateParameters parameters = new ClusterCreateParameters
{
    ClusterSizeInNodes = 2,
    UserName = "admin",
    Password = "<Enter HTTP User Password>",
    ClusterType = "Hadoop",
    OSType = OSType.Linux,
    Version = "3.5",
    // Use an Azure storage account as the default storage
    DefaultStorageInfo = new AzureStorageInfo("<StorageAccount>", "<StorageKey>", "<BlobContainerName>"),
    Location = "EAST US 2",
    SshUserName = "sshuser",
    SshPassword = "<Enter SSH User Password>",
};

// Create the cluster
managementClient.Clusters.Create("<ExistingResourceGroupName>", "<NewClusterName>", parameters);

示例

查看 Azure SQL 数据库示例的完整列表

HDInsight .NET 管理 SDK 3.X 预览版

概述

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

先决条件

SDK 安装

在 Visual Studio 项目中,依次单击“工具”、“NuGet 包管理器”、“包管理器控制台”打开包管理器控制台。

在包管理器控制台中执行以下命令:

  Install-Package Microsoft.Azure.Management.HDInsight -Version 3.1.0-preview
  Install-Package Microsoft.Azure.Management.Fluent
  Install-Package Microsoft.Azure.Management.ResourceManager.Fluent

身份验证

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

Note

除了以下示例中所示的方法以外,还有其他一些身份验证方法可能更符合你的需要。 此处概述了所有方法:使用用于 .NET 的 Azure 库进行身份验证

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

首先,登录到 Azure。 验证当前使用的是要在其中创建服务主体的订阅。

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": {
    "name": "XXX@XXX.XXX",
    "type": "user"
  }
}

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

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

Important

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

az provider register --namespace Microsoft.HDInsight

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

az ad sp create-for-rbac --name <Service Principal Name> --sdk-auth

服务主体信息将以 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.partner.microsoftonline.cn",
  "resourceManagerEndpointUrl": "https://management.chinacloudapi.cn/",
  "activeDirectoryGraphResourceId": "https://graph.chinacloudapi.cn/",
  "sqlManagementEndpointUrl": "https://management.core.chinacloudapi.cn:8443/",
  "galleryEndpointUrl": "https://gallery.chinacloudapi.cn/",
  "managementEndpointUrl": "https://management.core.chinacloudapi.cn/"
}

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

using Microsoft.Azure.Management.HDInsight;
using Microsoft.Azure.Management.HDInsight.Models;
using Microsoft.Azure.Management.ResourceManager.Fluent;

namespace HDI_SDK_Test
{
    class Program
    {
        static void Main(string[] args)
        {
            // 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 = SdkContext.AzureCredentialsFactory
                .FromServicePrincipal(
                CLIENT_ID,
                CLIENT_SECRET,
                TENANT_ID,
                AzureEnvironment.AzureGlobalCloud);

            var client = new HDInsightManagementClient(credentials);
            client.SubscriptionId = SUBSCRIPTION_ID;
        }
    }
}

群集管理

Note

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

创建群集

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

示例

本示例演示如何创建包含 2 个头节点和 1 个工作节点的 Spark 群集。

Note

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

创建资源组

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

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>

以下 .NET 代码片段创建包含 2 个头节点和 1 个工作节点的 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 = new ClusterCreateParametersExtended
{
    Location = location,
    Tags = new Dictionary<string, string>(),
    Properties = new ClusterCreateProperties
    {
        ClusterVersion = "3.6",
        OsType = OSType.Linux,
        ClusterDefinition = new ClusterDefinition
        {
            Kind = "Hadoop",            
            Configurations = new Dictionary<string, Dictionary<string, string>>()
            {                
                { "gateway", new Dictionary<string, string>
                    {
                        { "restAuthCredential.isEnabled", "true" },
                        { "restAuthCredential.username", username},
                        { "restAuthCredential.password", password}
                    }
                }
            }
        },
        Tier = Tier.Standard,
        ComputeProfile = new ComputeProfile
        {
            Roles = new List<Role>{
                new Role
                {
                    Name = "headnode",
                    TargetInstanceCount = 2,
                    HardwareProfile = new HardwareProfile
                    {
                        VmSize = "Large"
                    },
                    OsProfile = new OsProfile
                    {
                        LinuxOperatingSystemProfile = new LinuxOperatingSystemProfile
                        {
                            Username = username,
                            Password = password
                        }
                    }
                },
                new Role
                {
                    Name = "workernode",
                    TargetInstanceCount = 1,
                    HardwareProfile = new HardwareProfile
                    {
                        VmSize = "Large"
                    },
                    OsProfile = new OsProfile
                    {
                        LinuxOperatingSystemProfile = new LinuxOperatingSystemProfile
                        {
                            Username = username,
                            Password = password
                        }
                    }
                },
            }
        },
        StorageProfile = new StorageProfile
        {
            Storageaccounts = new[]
            {
                new StorageAccount
                {
                    Name = storageAccount,
                    Key = storageAccountKey,
                    Container = container,
                    IsDefault = true
                }
            }
        }
    }
};
client.Clusters.Create(
    resourceGroupName,
    clusterName,
    parameters
);

获取群集详细信息

获取给定群集的属性:

client.Clusters.Get("<Resource Group Name>", "<Cluster Name>");

示例

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

var myCluster = client.Clusters.Get("<Resource Group Name>", "<Cluster Name>");
Debug.WriteLine(myCluster.Name); //Prints the name of the cluster
Debug.WriteLine(myCluster.Id) //Prints the resource Id of the cluster

输出应如下所示:

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

Note

存储在变量 myCluster 中的 get 返回值的类型为 Microsoft.Azure.Management.HDInsight.ModelsCluster。 可在此处找到此对象的属性的完整列表。

列出群集

列出订阅下的群集

client.Clusters.List();

按资源组列出群集

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

Note

List()ListByResourceGroup() 都返回 IPage<Cluster> 对象。 若要获取下一个页面,可以调用 client.Clusters.ListNext("Next Page Link")。 可以反复执行此调用,直到 NextPageLinknull,如以下示例中所示。

示例

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

var clustersPaged = client.Clusters.List();
while (true)
{
  foreach (var cluster in clustersPaged)
  {
    Debug.WriteLine(cluster.Name);
  
}  if (clustersPaged.NextPageLink == null)
  {
    break;
  }
  clustersPaged = client.Clusters.ListNext(clustersPaged.NextPageLink);
}

删除群集

删除群集:

client.Clusters.Delete("<Resource Group Name>", "<Cluster Name>");

更新群集标记

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

client.Clusters.Update("<Resource Group Name>", "<Cluster Name>", new ClusterPatchParameters(<Dictionary of Tags>));

示例

client.Clusters.Update("<Resource Group Name>", "<Cluster Name>", new ClusterPatchParameters(new Dictionary<string, string> { { "tag1Name", "tag1Value" }, { "tag2Name", "tag2Value" } }));

调整群集大小

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

client.Clusters.Resize("<Resource Group Name>", "<Cluster Name>", <Num of Worker Nodes (int)>)

脚本操作

HDInsight 提供一个称为“脚本操作”的配置方法,该方法可调用用于自定义群集的自定义脚本。

Note

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

执行脚本操作

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

var scriptAction1 = new RuntimeScriptAction("<Script Name>", "<URL To Script>", <List<string> of roles>); //valid roles are "headnode", "workernode", "zookeepernode", and "edgenode"

client.Clusters.ExecuteScriptActions("<Resource Group Name>", "<Cluster Name>", new List<RuntimeScriptAction> { scriptAction1 }, <persistOnSuccess (bool)>); //add more RuntimeScriptActions to the list to execute multiple scripts

删除脚本操作

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

client.ScriptActions.Delete("<Resource Group Name>", "<Cluster Name>", "<Script Name>");

列出持久化脚本操作

Note

ListPersistedScripts()List() 返回 IPage<RuntimeScriptActionDetail> 对象。 若要获取下一个页面,可以调用 client.ScriptActions.ListPersistedScriptsNext("Next Page Link")client.ScriptExecutionHistory.ListNext("Next Page Link")。 可以反复执行此调用,直到 NextPageLinknull,如以下示例中所示。

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

client.ScriptActions.ListPersistedScripts("<Resource Group Name>", "<Cluster Name>");

示例

var scriptsPaged = client.ScriptActions.ListPersistedScripts("<Resource Group Name>", "<Cluster Name>");
while (true)
{
    foreach (var script in scriptsPaged)
    {
        Debug.WriteLine(script.Name); //There are other properties of RuntimeScriptActionDetail besides Name, such as Status, Operation, StartTime, EndTime, etc. See reference documentation.
    }
    if (scriptsPaged.NextPageLink == null)
    {
        break;
    }
    scriptsPaged = client.ScriptActions.ListPersistedScriptsNext(scriptsPaged.NextPageLink);
}

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

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

client.script_execution_history.list("<Resource Group Name>", "<Cluster Name>");

示例

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

var scriptExecutionsPaged = client.ScriptExecutionHistory.List("<Resource Group Name>", "<Cluster Name>");
while (true)
{
    foreach (var script in scriptExecutionsPaged)
    {
        Debug.WriteLine(script.Name); //There are other properties of RuntimeScriptActionDetail besides Name, such as Status, Operation, StartTime, EndTime, etc. See reference documentation.

    }
    if (scriptExecutionsPaged.NextPageLink == null)
    {
        break;
    }
    scriptExecutionsPaged = client.ScriptExecutionHistory.ListNext(scriptExecutionsPaged.NextPageLink);
}