使用 .NET SDK 管理 HDInsight 中的 Hadoop 群集

Note

本文涉及的 SDK 和工具是在 Microsoft Corporation 运行的 Azure 服务中使用的,而在中国, Azure 是由 21Vianet 运行的。 请根据需要参阅中国区 Azure 应用程序开发说明

了解如何使用 HDInsight.NET SDK 管理 HDInsight 群集。

先决条件

在开始本文前,你必须具有以下项:

连接到 Azure HDInsight

需要以下 Nuget 包:

Install-Package Microsoft.Rest.ClientRuntime.Azure.Authentication -Pre
Install-Package Microsoft.Azure.Management.ResourceManager -Pre
Install-Package Microsoft.Azure.Management.HDInsight

以下代码示例演示如何先连接到 Azure,然后管理 Azure 订阅下面的 HDInsight 群集。

using System;
using Microsoft.Azure;
using Microsoft.Azure.Management.HDInsight;
using Microsoft.Azure.Management.HDInsight.Models;
using Microsoft.Azure.Management.ResourceManager;
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using Microsoft.Rest;
using Microsoft.Rest.Azure.Authentication;

namespace HDInsightManagement
{
    class Program
    {
        private static HDInsightManagementClient _hdiManagementClient;
        // Replace with your AAD tenant ID if necessary
        private const string TenantId = UserTokenProvider.CommonTenantId; 
        private const string SubscriptionId = "<Your Azure Subscription ID>";
        // This is the GUID for the PowerShell client. Used for interactive logins in this example.
        private const string ClientId = "1950a258-227b-4e31-a9cf-717495945fc2";
        private static Uri BaseUri = new Uri("https://management.chinacloudapi.cn/");

        static void Main(string[] args)
        {
            // Authenticate and get a token
            var authToken = Authenticate(TenantId, ClientId, SubscriptionId);
            // Flag subscription for HDInsight, if it isn't already.
            EnableHDInsight(authToken);
            // Get an HDInsight management client
            _hdiManagementClient = new HDInsightManagementClient(authToken, BaseUri);

            // insert code here

            System.Console.WriteLine("Press ENTER to continue");
            System.Console.ReadLine();
        }

        /// <summary>
        /// Authenticate to an Azure subscription and retrieve an authentication token
        /// </summary>
        static TokenCloudCredentials Authenticate(string TenantId, string ClientId, string SubscriptionId)
        {
            var authContext = new AuthenticationContext("https://login.chinacloudapi.cn/" + TenantId);
            var tokenAuthResult = authContext.AcquireToken("https://management.core.chinacloudapi.cn/", 
                ClientId, 
                new Uri("urn:ietf:wg:oauth:2.0:oob"), 
                PromptBehavior.Always, 
                UserIdentifier.AnyUser);
            return new TokenCloudCredentials(SubscriptionId, tokenAuthResult.AccessToken);
        }
        /// <summary>
        /// Marks your subscription as one that can use HDInsight, if it has not already been marked as such.
        /// </summary>
        /// <remarks>This is essentially a one-time action; if you have already done something with HDInsight
        /// on your subscription, then this isn't needed at all and will do nothing.</remarks>
        /// <param name="authToken">An authentication token for your Azure subscription</param>
        static void EnableHDInsight(TokenCloudCredentials authToken)
        {
            // Create a client for the Resource manager and set the subscription ID
            var resourceManagementClient = new ResourceManagementClient(BaseUri, new TokenCredentials(authToken.Token));
            resourceManagementClient.SubscriptionId = SubscriptionId;
            // Register the HDInsight provider
            var rpResult = resourceManagementClient.Providers.Register("Microsoft.HDInsight");
        }
    }
}

运行此程序时,将看到提示。 若不想看到提示,请参阅创建非交互式身份验证 .NET HDInsight 应用程序

创建群集

请参阅使用 .NET SDK 在 HDInsight 中创建基于 Linux 的群集

列出群集

以下代码片段列出了群集和一些属性:

var results = _hdiManagementClient.Clusters.List();
foreach (var name in results.Clusters) {
    Console.WriteLine("Cluster Name: " + name.Name);
    Console.WriteLine("\t Cluster type: " + name.Properties.ClusterDefinition.ClusterType);
    Console.WriteLine("\t Cluster location: " + name.Location);
    Console.WriteLine("\t Cluster version: " + name.Properties.ClusterVersion);
}

删除群集

使用以下代码片段以同步或异步方式删除群集:

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

缩放群集

使用群集缩放功能,可更改 Azure HDInsight 中运行的群集使用的辅助节点数,而无需重新创建群集。

Note

只支持使用 HDInsight 3.1.3 或更高版本的群集。 如果不确定群集的版本,可以查看“属性”页面。 请参阅 列出并显示群集

更改 HDInsight 支持的每种类型的群集所用数据节点数的影响:

  • Hadoop

    可顺利增加正在运行的 Hadoop 群集中的辅助节点数,而不会影响任何挂起或运行中的作业。 也可在操作进行中提交新作业。 系统会正常处理失败的缩放操作,让群集始终保持正常运行状态。

    减少数据节点数目以缩减 Hadoop 群集时,系统会重新启动群集中的某些服务。 这会导致所有正在运行和挂起的作业在缩放操作完成时失败。 但是,可在操作完成后重新提交这些作业。

  • HBase

    可在 HBase 群集运行时顺利添加或删除节点。 完成缩放操作后的几分钟内,区域服务器将自动平衡。 但也可手动平衡区域服务器,方法是登录到群集的头节点,然后在命令提示符窗口中运行以下命令:

      >pushd %HBASE_HOME%\bin
      >hbase shell
      >balancer
    
  • Storm

    可在 Storm 群集运行时顺利添加或删除数据节点。 但是,缩放操作成功完成后,需要重新平衡拓扑。

    可以使用两种方法来完成重新平衡操作:

    • Storm Web UI
    • 命令行界面 (CLI) 工具

      有关详细信息,请参阅 Apache Storm 文档

      HDInsight 群集上提供了 Storm Web UI:

      HDInsight Storm 缩放重新平衡

      以下是有关如何使用 CLI 命令重新平衡 Storm 拓扑的示例:

      ## Reconfigure the topology "mytopology" to use 5 worker processes,
      ## the spout "blue-spout" to use 3 executors, and
      ## the bolt "yellow-bolt" to use 10 executors
      $ storm rebalance mytopology -n 5 -e blue-spout=3 -e yellow-bolt=10
      

以下代码片段显示如何以同步或异步方式调整群集的大小:

_hdiManagementClient.Clusters.Resize("<Resource Group Name>", "<Cluster Name>", <New Size>);   
_hdiManagementClient.Clusters.ResizeAsync("<Resource Group Name>", "<Cluster Name>", <New Size>);   

授予/撤消访问权限

HDInsight 群集提供以下 HTTP Web 服务(所有这些服务都有 REST 样式的终结点):

  • ODBC
  • JDBC
  • Ambari
  • Oozie
  • Templeton

默认情况下,将授权这些服务进行访问。 你可以撤消/授予访问权限。 若要撤消:

var httpParams = new HttpSettingsParameters
{
    HttpUserEnabled = false,
    HttpUsername = "admin",
    HttpPassword = "*******",
};
_hdiManagementClient.Clusters.ConfigureHttpSettings("<Resource Group Name>, <Cluster Name>, httpParams);

若要授予:

var httpParams = new HttpSettingsParameters
{
    HttpUserEnabled = enable,
    HttpUsername = "admin",
    HttpPassword = "*******",
};
_hdiManagementClient.Clusters.ConfigureHttpSettings("<Resource Group Name>, <Cluster Name>, httpParams);

Note

通过授予/撤消访问权限,你将重置群集用户名和密码。

也可以通过门户完成此操作。 请参阅使用 Azure 门户管理 HDInsight

更新 HTTP 用户凭据

这与授予/撤消 HTTP 访问权限是同一过程。如果已向群集授予 HTTP 访问权限,则必须先撤消该访问权限。 然后再使用新的 HTTP 用户凭据授予访问权限。

查找默认存储帐户

以下代码片段演示如何获取群集的默认存储帐户名称和默认存储帐户密钥。

var results = _hdiManagementClient.Clusters.GetClusterConfigurations(<Resource Group Name>, <Cluster Name>, "core-site");
foreach (var key in results.Configuration.Keys)
{
    Console.WriteLine(String.Format("{0} => {1}", key, results.Configuration[key]));
}

提交作业

提交 MapReduce 作业

请参阅在 HDInsight 中运行 Hadoop MapReduce 示例

提交 Hive 作业

请参阅使用 .NET SDK 运行 Hive 查询

提交 Pig 作业

请参阅使用 .NET SDK 运行 Pig 作业

提交 Sqoop 作业

请参阅将 Sqoop 与 HDInsight 配合使用

提交 Oozie 作业

请参阅在 HDInsight 中将 Oozie 与 Hadoop 配合使用以定义和运行工作流

将数据上传到 Azure Blob 存储

请参阅 将数据上传到 HDInsight

另请参阅