使用脚本操作自定义 Azure HDInsight 群集

Azure HDInsight 提供名为脚本操作的配置方法,该方法可以调用自定义脚本来自定义群集。 这些脚本用于安装其他组件以及更改配置设置。 可在创建群集期间或者之后使用脚本操作。

还可以将脚本操作作为 HDInsight 应用程序发布到 Azure 市场。

了解脚本操作

脚本操作是指在 HDInsight 群集的节点上运行的 Bash 脚本。 下面是脚本操作的特征和功能:

  • Bash 脚本 URI(访问文件的位置)必须可从 HDInsight 资源提供程序和群集进行访问。

  • 下面是可能的存储位置:

    • 对于常规(非 ESP)群集:

      • Azure 存储帐户中的一个 Blob,该存储帐户可以是 HDInsight 群集的主存储帐户,也可以是其附加存储帐户。 在创建群集期间,已将这两种存储帐户的访问权限都授予 HDInsight。

        重要

        请勿在此 Azure 存储帐户上轮换存储密钥,因为这会导致对存储在其中的脚本执行后续脚本操作失败。

      • 建议不要将 Data Lake Storage Gen2 用于脚本操作。 Bash 脚本 URI 不支持 abfs://https:// URI 可行,但它们适用于具有公共访问权限且防火墙不限制 HDInsight 资源提供程序的容器,因此不建议使用。

      • 可通过 https:// 路径访问的公共文件共享服务。 例如,Azure Blob、GitHub 或 OneDrive。 有关示例 URI,请参阅脚本操作脚本示例

    • 对于具有 ESP 的群集,支持 wasb://wasbs://http[s]:// URI。

  • 脚本操作可限制为仅在特定节点类型上运行。 例如头节点或工作节点。

  • 脚本操作可以是持久化的,也可以是临时的。

    • 持久化脚本操作必须有唯一的名称。 持久化脚本用于自定义通过缩放操作添加到群集的新工作节点。 进行缩放操作时,持久化脚本还可以将更改应用于其他节点类型, 例如头节点。
    • 临时脚本不是持久化脚本。 创建群集期间使用的脚本操作自动持久保存下来。 它们在运行后不会应用于添加到群集的工作节点。 然后,可以将临时脚本升级为持久化脚本,或将持久化脚本降级为临时脚本 。 即使明确指出应予保存,也不会持久保存失败的脚本。
  • 脚本操作可接受脚本在执行期间使用的参数。

  • 脚本操作在群集节点上以根级别权限运行。

  • 可通过 Azure 门户、Azure PowerShell、Azure CLI 或 HDInsight .NET SDK 使用脚本操作。

  • 删除或修改 VM 上的服务文件的脚本操作可能会影响服务的运行状况和可用性。

群集保留已运行的所有脚本的历史记录。 需要查找要升级或降级的脚本的 ID 时,历史记录很有用。

重要

没有任何自动方式可撤销脚本操作所做的更改。 需要手动还原更改,或提供可还原更改的脚本。

权限

对于已加入域的 HDInsight 群集,对群集使用脚本操作时需要两个 Apache Ambari 权限:

  • AMBARI.RUN_CUSTOM_COMMAND。 默认情况下,Ambari 管理员角色具有此权限。
  • CLUSTER.RUN_CUSTOM_COMMAND。 默认情况下,HDInsight 群集管理员和 Ambari 管理员都具有此权限。

有关处理已加入域的 HDInsight 的权限的详细信息,请参阅使用企业安全性套餐管理 HDInsight 群集

访问控制

如果你不是 Azure 订阅的管理员或所有者,则你的帐户必须对包含 HDInsight 群集的资源组至少拥有 Contributor 访问权限。

至少具有对 Azure 订阅的参与者访问权限的用户必须之前已注册提供程序。 在对订阅具有参与者访问权限的用户创建资源时,会进行提供程序注册。 对于不创建资源的情况,请参阅使用 REST 注册提供程序

获取有关使用访问权限管理的详细信息:

使用脚本操作的方法

你可以选择配置一个脚本操作,让它在第一次创建群集时运行,或在现有群集上运行。

群集创建过程中的脚本操作

在群集创建期间使用的脚本操作与在现有群集上运行的脚本操作稍有不同:

  • 该脚本将自动持久保存。

  • 脚本失败可能会导致群集创建过程失败。

下图演示了在创建过程中运行脚本操作的时间:

群集创建期间的 HDInsight 群集自定义和阶段

在配置 HDInsight 时运行脚本。 脚本在群集中的所有指定节点上并行运行。 它在节点上使用 root 特权运行。

可以执行停止和启动服务(包括 Apache Hadoop 相关服务)等操作。 如果停止服务,请确保 Ambari 及其他 Hadoop 相关服务在脚本完成之前正在运行。 这些所需的服务在群集创建时确定群集的运行状况和状态。

在创建群集期间,可以同时使用多个脚本操作。 这些脚本将按其指定顺序调用。

重要

脚本操作必须在 60 分钟内完成,否则会超时。在群集预配期间,脚本与其他安装和配置进程一同运行。 争用 CPU 时间和网络带宽等资源可能导致完成脚本所需的时间要长于在开发环境中所需的时间。

若要让运行脚本所花费的时间降到最低,请避免从源下载和编译应用程序等任务。 预编译应用程序,并将二进制文件存储在 Azure 存储中。

正在运行的群集上的脚本操作

已在运行的群集上发生的脚本失败并不会自动导致群集更改为失败状态。 脚本完成后,群集应该恢复为“正在运行”状态。 即使群集处于“正在运行”状态,失败的脚本也可能已损坏。 例如,脚本无法删除群集所需的文件。

使用 root 权限运行的脚本操作。 确保先了解脚本的作用,然后再将它应用到群集。

将脚本应用到群集时,群集状态将从“正在运行”更改为“已接受”。 然后,状态将更改为“HDInsight 配置”,最后恢复为“正在运行”,表示脚本成功。 脚本状态记录在脚本操作历史记录中。 此信息告知脚本是成功还是失败。 例如,Get-AzHDInsightScriptActionHistory PowerShell cmdlet 显示脚本的状态。 此命令返回类似于以下文本的信息:

ScriptExecutionId : 635918532516474303
StartTime         : 8/14/2017 7:40:55 PM
EndTime           : 8/14/2017 7:41:05 PM
Status            : Succeeded

重要

如果在创建群集后更改群集用户、管理员和密码,针对此群集运行的脚本操作可能会失败。 如果任何持久性脚本操作以工作节点为目标,则缩放群集时,这些脚本可能失败。

脚本操作脚本示例

可通过以下实用工具使用脚本操作脚本:

  • Azure 门户
  • Azure PowerShell
  • Azure CLI
  • HDInsight .NET SDK

HDInsight 提供了脚本用于在 HDInsight 群集上安装以下组件:

名称 脚本
添加 Azure 存储帐户 https://hdiconfigactions.blob.core.windows.net/linuxaddstorageaccountv01/add-storage-account-v01.sh. 请参阅将其他存储帐户添加到 HDInsight
安装 Hue https://hdiconfigactions.blob.core.windows.net/linuxhueconfigactionv02/install-hue-uber-v02.sh. 请参阅在 HDInsight Hadoop 群集上安装并使用 Hue
预加载 Hive 库 https://hdiconfigactions.blob.core.windows.net/linuxsetupcustomhivelibsv01/setup-customhivelibs-v01.sh. 请参阅创建 HDInsight 群集时添加自定义 Apache Hive 库

群集创建期间的脚本操作

本部分说明了创建 HDInsight 群集时脚本操作的各种用法。

在创建群集期间从 Azure 门户使用脚本操作

  1. 按照使用 Azure 门户在 HDInsight 中创建基于 Linux 的群集中的说明,开始创建群集。 从“配置 + 定价”选项卡中,选择“+ 添加脚本操作”。

    Azure 门户群集脚本操作

  2. 使用“选择脚本”条目选择预制的脚本。 若要使用自定义脚本,请选择“自定义”。 然后提供脚本的“名称”和“Bash 脚本 URI”。

    在“选择脚本”窗体中添加脚本

    下表描述窗体中的元素:

    属性 Value
    选择脚本 要使用自己的脚本,请选择“自定义”。 否则,请从提供的脚本中选择一个。
    名称 指定脚本操作的名称。
    Bash 脚本 URI 指定脚本的 URI。
    头节点/辅助角色/Zookeeper 指定运行脚本的节点:“头节点”、“工作节点”或“ZooKeeper 节点”。
    parameters 根据脚本的需要,请指定参数。

    使用“持久保存此脚本操作”条目,确保在执行缩放操作期间应用该脚本。

  3. 选择“创建”保存脚本。 然后可以使用“+ 提交新项”再添加一个脚本。

    HDInsight 多脚本操作

    添加完脚本后,将返回到“配置 + 定价”选项卡。

  4. 照常完成其余的群集创建步骤。

从 Azure 资源管理器模板使用脚本操作

可通过 Azure 资源管理器模板使用脚本操作。 有关示例,请参阅创建 HDInsight Linux 群集并运行脚本操作

此示例中使用以下代码添加脚本操作:

"scriptActions": [
    {
        "name": "setenvironmentvariable",
        "uri": "[parameters('scriptActionUri')]",
        "parameters": "headnode"
    }
]

获取有关如何部署模板的详细信息:

在创建群集期间从 Azure PowerShell 使用脚本操作

本部分使用 Add-AzHDInsightScriptAction cmdlet 来调用脚本,以自定义群集。 开始之前,请确保安装并配置 Azure PowerShell。 若要使用这些 PowerShell 命令,需要 AZ 模块

以下脚本演示如何在使用 PowerShell 创建群集时应用脚本操作:

  # Login to your Azure subscription
    # Is there an active Azure subscription?
    $sub = Get-AzureRmSubscription -ErrorAction SilentlyContinue
    if(-not($sub))
    {
        Add-AzureRmAccount
    }

    # If you have multiple subscriptions, set the one to use
    # $subscriptionID = "<subscription ID to use>"
    # Select-AzureRmSubscription -SubscriptionId $subscriptionID

    # Get user input/default values
    $resourceGroupName = Read-Host -Prompt "Enter the resource group name"
    $location = Read-Host -Prompt "Enter the Azure region to create resources in"

    # Create the resource group
    New-AzureRmResourceGroup -Name $resourceGroupName -Location $location

    $defaultStorageAccountName = Read-Host -Prompt "Enter the name of the storage account"

    # Create an Azure storae account and container
    New-AzureRmStorageAccount `
        -ResourceGroupName $resourceGroupName `
        -Name $defaultStorageAccountName `
        -Type Standard_LRS `
        -Location $location
    $defaultStorageAccountKey = (Get-AzureRmStorageAccountKey `
                                    -ResourceGroupName $resourceGroupName `
                                    -Name $defaultStorageAccountName)[0].Value
    $defaultStorageContext = New-AzureStorageContext `
                                    -StorageAccountName $defaultStorageAccountName `
                                    -StorageAccountKey $defaultStorageAccountKey

    # Get information for the HDInsight cluster
    $clusterName = Read-Host -Prompt "Enter the name of the HDInsight cluster"
    # Cluster login is used to secure HTTPS services hosted on the cluster
    $httpCredential = Get-Credential -Message "Enter Cluster login credentials" -UserName "admin"
    # SSH user is used to remotely connect to the cluster using SSH clients
    $sshCredential = Get-Credential -Message "Enter SSH user credentials"

    # Default cluster size (# of worker nodes), version, type, and OS
    $clusterSizeInNodes = "4"
    $clusterVersion = "3.5"
    $clusterType = "Hadoop"
    $clusterOS = "Linux"
    # Set the storage container name to the cluster name
    $defaultBlobContainerName = $clusterName

    # Create a blob container. This holds the default data store for the cluster.
    New-AzureStorageContainer `
        -Name $clusterName -Context $defaultStorageContext

    # Create an HDInsight configuration object
    $config = New-AzureRmHDInsightClusterConfig
    # Add the script action
    $scriptActionUri="https://hdiconfigactions.blob.core.windows.net/linuxgiraphconfigactionv01/giraph-installer-v01.sh"
    # Add for the head nodes
    $config = Add-AzureRmHDInsightScriptAction `
        -Config $config `
        -Name "Install Giraph" `
        -NodeType HeadNode `
        -Uri $scriptActionUri
    # Continue adding the script action for any other node types
    # that it must run on.
    $config = Add-AzureRmHDInsightScriptAction `
        -Config $config `
        -Name "Install Giraph" `
        -NodeType WorkerNode `
        -Uri $scriptActionUri

    # Create the cluster using the configuration object
    New-AzureRmHDInsightCluster `
        -Config $config `
        -ResourceGroupName $resourceGroupName `
        -ClusterName $clusterName `
        -Location $location `
        -ClusterSizeInNodes $clusterSizeInNodes `
        -ClusterType $clusterType `
        -OSType $clusterOS `
        -Version $clusterVersion `
        -HttpCredential $httpCredential `
        -DefaultStorageAccountName "$defaultStorageAccountName.blob.core.chinacloudapi.cn" `
        -DefaultStorageAccountKey $defaultStorageAccountKey `
        -DefaultStorageContainer $containerName `
        -SshCredential $sshCredential

创建群集可能需要几分钟时间。

在创建群集期间从 HDInsight .NET SDK 使用脚本操作

HDInsight .NET SDK 提供客户端库,以方便从 .NET 应用程序使用 HDInsight。 有关代码示例,请参阅脚本操作

将脚本操作应用到正在运行的群集

本部分说明如何在正在运行的群集上应用脚本操作。

从 Azure 门户将脚本操作应用到正在运行的群集

  1. 登录到 Azure 门户并找到群集。

  2. 在默认视图中的“设置”下,选择“脚本操作” 。

  3. 在“脚本操作”页顶部,选择“+ 提交新项” 。

    将脚本添加到正在运行的群集

  4. 使用“选择脚本”条目选择预制的脚本。 若要使用自定义脚本,请选择“自定义”。 然后提供脚本的“名称”和“Bash 脚本 URI”。

    在“选择脚本”窗体中添加脚本

    下表描述窗体中的元素:

    属性 Value
    选择脚本 要使用自己的脚本,请选择“自定义”。 否则,请选择提供的脚本。
    名称 指定脚本操作的名称。
    Bash 脚本 URI 指定脚本的 URI。
    头节点/辅助角色/Zookeeper 指定运行脚本的节点:“头节点”、“工作节点”或“ZooKeeper 节点”。
    parameters 根据脚本的需要,请指定参数。

    使用“持久保存此脚本操作”条目,确保在缩放操作中应用了脚本。

  5. 最后,选择“创建”按钮将脚本应用到群集。

从 Azure PowerShell 将脚本操作应用到正在运行的群集

若要使用这些 PowerShell 命令,需要 AZ 模块。 以下示例演示如何将脚本操作应用于正在运行的群集:

以下示例演示如何将脚本操作应用于正在运行的群集:

# Get information for the HDInsight cluster
$clusterName = Read-Host -Prompt "Enter the name of the HDInsight cluster"
$scriptActionName = Read-Host -Prompt "Enter the name of the script action"
$scriptActionUri = Read-Host -Prompt "Enter the URI of the script action"
# The node types that the script action is applied to
$nodeTypes = "headnode", "workernode"

# Apply the script and mark as persistent
Submit-AzureRmHDInsightScriptAction -ClusterName $clusterName `
    -Name $scriptActionName `
    -Uri $scriptActionUri `
    -NodeTypes $nodeTypes `
    -PersistOnSuccess

操作完成后,会收到类似于以下文本的信息:

OperationState  : Succeeded
ErrorMessage    :
Name            : Giraph
Uri             : https://hdiconfigactions.blob.core.windows.net/linuxgiraphconfigactionv01/giraph-installer-v01.sh
Parameters      :
NodeTypes       : {HeadNode, WorkerNode}

从 Azure CLI 将脚本操作应用到正在运行的群集

开始之前,请确保安装并配置 Azure CLI。 确保安装了最新版本。 有关详细信息,请参阅安装 Azure CLI

  1. 对 Azure 订阅进行身份验证:

    az login
    
  2. 将脚本操作应用到正在运行的群集:

    az hdinsight script-action execute --cluster-name CLUSTERNAME --name SCRIPTNAME --resource-group RESOURCEGROUP --roles ROLES
    

    有效角色为 headnodeworkernodezookeepernodeedgenode。 如果应将脚本应用到多个节点类型,请用空格分隔角色。 例如,--roles headnode workernode

    若要持久保存脚本,请添加 --persist-on-success。 以后也可以使用 az hdinsight script-action promote 来持久保存脚本。

使用 REST API 将脚本操作应用到正在运行的群集

请参阅 Azure HDInsight 中的群集 REST API

从 HDInsight .NET SDK 将脚本操作应用到正在运行的群集

有关使用 .NET SDK 将脚本应用到群集的示例,请参阅针对正在运行的基于 Linux 的 HDInsight 群集应用脚本操作

查看历史记录以及升级和降级脚本操作

Azure 门户

  1. 登录到 Azure 门户并找到群集。

  2. 在默认视图中的“设置”下,选择“脚本操作” 。

  3. 此群集的脚本历史记录显示在“脚本操作”部分。 此信息包括持久化脚本的列表。 以下屏幕截图显示已在此群集上运行了 Solr 脚本。 该屏幕截图未显示任何持久化脚本。

    脚本操作

  4. 选择历史记录中的脚本会显示此脚本的“属性”部分。 从屏幕顶部,可重新运行脚本或将它升级。

    脚本操作 - 属性

  5. 还可以使用“脚本操作”部分条目右侧的省略号“...”来执行操作。

    脚本操作 - 省略号

Azure PowerShell

cmdlet 函数
Get-AzHDInsightPersistedScriptAction 检索有关持久化脚本操作的信息。 此 cmdlet 不会撤消脚本执行的操作,而只会删除持久化标志。
Get-AzHDInsightScriptActionHistory 检索已应用到群集的脚本操作的历史记录,或特定脚本的详细信息。
Set-AzHDInsightPersistedScriptAction ad hoc 脚本操作升级为持久化脚本操作。
Remove-AzHDInsightPersistedScriptAction 将持久化脚本操作降级为 ad hoc 脚本操作。

以下示例脚本演示如何使用 cmdlet 来升级再降级脚本。

# Get a history of scripts
Get-AzureRmHDInsightScriptActionHistory -ClusterName mycluster

# From the list, we want to get information on a specific script
Get-AzureRmHDInsightScriptActionHistory -ClusterName mycluster `
    -ScriptExecutionId 635920937765978529

# Promote this to a persisted script
# Note: the script must have a unique name to be promoted
# if the name is not unique, you receive an error
Set-AzureRmHDInsightPersistedScriptAction -ClusterName mycluster `
    -ScriptExecutionId 635920937765978529

# Demote the script back to ad hoc
# Note that demotion uses the unique script name instead of
# execution ID.
Remove-AzureRmHDInsightPersistedScriptAction -ClusterName mycluster `
    -Name "Install Giraph"

Azure CLI

命令 说明
az hdinsight script-action delete 删除对群集的指定持久化脚本操作。 此命令不会撤消脚本执行的操作,而只会删除持久化标志。
az hdinsight script-action execute 在指定的 HDInsight 群集上执行脚本操作。
az hdinsight script-action list 列出指定群集的所有持久化脚本操作。
az hdinsight script-action list-execution-history 列出指定群集的所有脚本的执行历史记录。
az hdinsight script-action promote 将指定的即席脚本执行升级为持久化脚本。
az hdinsight script-action show-execution-details 获取给定脚本执行 ID 的脚本执行详细信息。

HDInsight .NET SDK

有关使用 .NET SDK 从群集中检索脚本历史记录、升级或降级脚本的示例,请参阅针对正在运行的基于 Linux 的 HDInsight 群集应用脚本操作

备注

此示例还演示了如何使用 .NET SDK 安装 HDInsight 应用程序。

后续步骤