使用脚本操作自定义基于 Linux 的 HDInsight 群集

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

Important

只有基于 Linux 的 HDInsight 群集能够在运行中的群集上使用脚本操作。

Linux 是 HDInsight 3.4 或更高版本上使用的唯一操作系统。 有关详细信息,请参阅 HDInsight 在 Windows 上停用

还可以将脚本操作作为 HDInsight 应用程序发布到 Azure 应用商店。 本文档中的某些示例演示如何使用 PowerShell 和 .NET SDK 的脚本操作命令来安装 HDInsight 应用程序。

权限

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

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

访问控制

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

另外,如果用户创建的是 HDInsight 群集,至少对 Azure 订阅具有 参与者 访问权限的用户必须之前已注册 HDInsight 的提供程序。 对订阅具有参与者访问权限的用户首次在订阅上创建资源时,会进行提供程序注册。 不使用 REST 注册提供程序创建资源也可完成该操作。

有关使用访问管理的详细信息,请参阅以下文档:

了解脚本操作

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

  • 必须存储在可从 HDInsight 群集访问的 URI 上。 下面是可能的存储位置:

    • Azure 存储帐户 中的 blob 是 HDInsight 群集的主要存储帐户或其他存储帐户。 在创建群集期间,已将这两种存储帐户的访问权限都授予 HDInsight。

    • 一项公共文件共享服务,例如 Azure Blob、GitHub、OneDrive、Dropbox,等等。

      有关示例 URI,请参阅脚本操作脚本示例部分。

      Warning

      HDInsight 仅支持通用 Azure 存储帐户。 它目前不支Blob 存储帐户类型。

  • 可以限制为 只对特定的节点类型运行,例如头节点或辅助角色节点。

  • 可以是持久化即席

    持久化脚本用于自定义通过缩放操作添加到群集的新工作节点。 进行缩放操作时,持久化脚本还可以将更改应用于其他节点类型,如头节点。

    Important

    持久化脚本操作必须有唯一的名称。

    即席脚本不会持久保存。 它们不会应用于运行脚本后添加到群集中的辅助角色节点。 以后可将即席脚本升级为持久化脚本,或将持久化脚本降级为即席脚本。

    Important

    创建群集期间使用的脚本操作自动持久保存下来。

    即使明确指出应予保存,也不会持久保存失败的脚本。

  • 可以接受脚本在执行期间使用的 参数

  • 在群集节点上 以 root 级权限 运行。

  • 可以通过 Azure 门户Azure PowerShellAzure CLI v1.0HDInsight .NET SDK 使用

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

Important

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

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

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

  • 该脚本自动持久保存
  • 脚本 失败 可能会导致群集创建过程失败。

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

群集创建过程中的 HDInsight 群集自定义和阶段

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

Note

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

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

Important

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

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

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

在运行中群集上运行的脚本发生失败并不会自动导致群集更改为失败状态。 脚本完成后,群集应该恢复“正在运行”状态。

Important

即使群集处于“正在运行”状态,失败的脚本也可能已损坏。 例如,脚本可以删除群集所需的文件。

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

将脚本应用到群集时,如果脚本运行成功,群集状态将从“正在运行”更改为“已接受”,再更改为“HDInsight 配置”,最后回到“正在运行”。 脚本状态记录在脚本操作历史记录中,可以使用此信息来确定脚本是成功还是失败。 例如,可以使用 Get-AzureRmHDInsightScriptActionHistory PowerShell cmdlet 来查看脚本的状态。 此命令返回类似于以下文本的信息:

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

Important

如果在创建群集后更改群集用户 (admin) 的密码,针对此群集运行的脚本操作可能会失败。 如果任何持久性脚本操作以辅助角色节点为目标,则缩放群集时,这些脚本可能会失败。

脚本操作脚本示例

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

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

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

Name 脚本
添加 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 群集上安装并使用 Hue
安装 Presto https://raw.githubusercontent.com/hdinsight/presto-hdinsight/master/installpresto.sh 。 请参阅在 HDInsight 群集上安装并使用 Presto
安装 Solr https://hdiconfigactions.blob.core.windows.net/linuxsolrconfigactionv01/solr-installer-v01.sh 。 请参阅在 HDInsight 群集上安装并使用 Solr
安装 Giraph https://hdiconfigactions.blob.core.windows.net/linuxgiraphconfigactionv01/giraph-installer-v01.sh 。 请参阅在 HDInsight 群集上安装并使用 Giraph
预加载 Hive 库 https://hdiconfigactions.blob.core.windows.net/linuxsetupcustomhivelibsv01/setup-customhivelibs-v01.sh 。 请参阅在 HDInsight 群集上添加 Hive 库
安装或更新 Mono https://hdiconfigactions.blob.core.windows.net/install-mono/install-mono.bash 。 请参阅在 HDInsight 上安装或更新 Mono

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

本部分举例说明在创建 HDInsight 群集时,可通过哪些不同的方式使用脚本操作。

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

  1. 根据在 HDInsight 中创建 Hadoop 群集中的说明开始创建群集。 到达“群集摘要”部分时停止。

  2. 从“群集摘要”部分中选择“高级设置”的编辑链接。

    “高级设置”链接

  3. 从“高级设置”部分中选择“脚本操作”。 从“脚本操作”部分中选择“+ 提交新项”

    提交新脚本操作

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

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

    下表描述窗体中的元素:

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

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

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

    多个脚本操作

    添加完脚本后,使用“选择”按钮,然后使用“下一步”按钮返回到“群集摘要”部分。

  6. 要创建群集,请从“群集摘要”部分中选择“创建”。

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

可通过 Azure 资源管理器模板使用脚本操作。 有关示例,请参阅 https://azure.microsoft.com/resources/templates/hdinsight-linux-run-script-action/

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

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

有关如何部署模板的信息,请参阅以下文档:

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

本部分使用 Add-AzureRmHDInsightScriptAction cmdlet 来调用脚本,以自定义群集。 在继续前,确保已安装并配置 Azure PowerShell。 有关配置工作站以运行 HDInsight PowerShell cmdlet 的信息,请参阅 Install and configure Azure PowerShell(安装和配置 Azure PowerShell)。

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

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

# 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 的操作。 有关代码示例,请参阅使用 .NET SDK 在 HDInsight 中创建基于 Linux 的群集

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

本部分介绍如何将脚本操作应用到正在运行的群集。

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

  1. Azure 门户中,选择 HDInsight 群集。

  2. 从 HDInsight 群集概述中,选择“脚本操作”磁贴。

    脚本操作磁贴

    Note

    也可以从“设置”部分中依次选择“所有设置”和“脚本操作”。

  3. 从“脚本操作”部分顶部选择“提交新项”。

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

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

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

    下表描述窗体中的元素:

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

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

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

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

在继续前,确保已安装并配置 Azure PowerShell。 有关配置工作站以运行 HDInsight PowerShell cmdlet 的信息,请参阅 Install and configure Azure PowerShell(安装和配置 Azure PowerShell)。

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

# 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.0

Important

HDInsight 需要 Azure CLI 1.0。 目前 Azure CLI 2.0 未提供针对使用 HDInsight 的命令。

  1. 要切换到 Azure 资源管理器模式,请在命令行中使用以下命令:

    azure config mode arm
    
  2. 使用以下命令向 Azure 订阅进行身份验证。

        azure login -e AzureChinaCloud
    
  3. 使用以下命令将脚本操作应用到正在运行的群集

    azure hdinsight script-action create <clustername> -g <resourcegroupname> -n <scriptname> -u <scriptURI> -t <nodetypes>
    

    如果省略此命令的参数,系统会提示用户指定参数。 如果以 -u 指定的脚本接受参数,可以使用 -p 参数来指定参数。

    有效的节点类型为 headnodeworkernodezookeeper。 如果应将脚本应用到多个节点类型,请指定“;”分隔的类型。 例如, -n headnode;workernode

    若要持久保存脚本,请添加 --persistOnSuccess。 以后也可以使用 azure hdinsight script-action persisted set 来持久保存脚本。

    作业完成后,应会显示类似于以下文本的输出:

     info:    Executing command hdinsight script-action create
     + Executing Script Action on HDInsight cluster
     data:    Operation Info
     data:    ---------------
     data:    Operation status:
     data:    Operation ID:  b707b10e-e633-45c0-baa9-8aed3d348c13
     info:    hdinsight script-action create command OK
    

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

请参阅在运行中的群集上运行脚本操作

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

有关使用 .NET SDK 向群集应用脚本的示例,请参阅 https://github.com/Azure-Samples/hdinsight-dotnet-script-action

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

使用 Azure 门户

  1. Azure 门户中,选择 HDInsight 群集。

  2. 从 HDInsight 群集概述中,选择“脚本操作”磁贴。

    脚本操作磁贴

    Note

    也可以从“设置”部分中依次选择“所有设置”和“脚本操作”。

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

    “脚本操作”部分

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

    脚本操作属性

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

    脚本操作 ... 用法

使用 Azure PowerShell

使用以下 cmdlet... 可以...
Get-AzureRmHDInsightPersistedScriptAction 检索有关持久化脚本操作的信息
Get-AzureRmHDInsightScriptActionHistory 检索已应用到群集的脚本操作的历史记录,或特定脚本的详细信息
Set-AzureRmHDInsightPersistedScriptAction 将即席脚本操作升级为持久化脚本操作
Remove-AzureRmHDInsightPersistedScriptAction 将持久化脚本操作降级为即席脚本操作

Important

使用 Remove-AzureRmHDInsightPersistedScriptAction 不会撤消脚本执行的操作。 此 cmdlet 只会删除持久化标志。

以下示例脚本演示如何使用 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

使用以下 cmdlet... 可以...
azure hdinsight script-action persisted list <clustername> 检索持久化脚本操作的列表
azure hdinsight script-action persisted show <clustername> <scriptname> 检索有关特定持久化脚本操作的信息
azure hdinsight script-action history list <clustername> 检索已应用到群集的脚本操作的历史记录
azure hdinsight script-action history show <clustername> <scriptname> 检索有关特定脚本操作的信息
azure hdinsight script action persisted set <clustername> <scriptexecutionid> 将即席脚本操作升级为持久化脚本操作
azure hdinsight script-action persisted delete <clustername> <scriptname> 将持久化脚本操作降级为即席脚本操作

Important

使用 azure hdinsight script-action persisted delete 不会撤消脚本执行的操作。 此 cmdlet 只会删除持久化标志。

使用 HDInsight .NET SDK

有关使用 .NET SDK 从群集中检索脚本历史记录、升级或降级脚本的示例,请参阅 https://github.com/Azure-Samples/hdinsight-dotnet-script-action

Note

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

支持 HDInsight 群集上使用的开源软件

Azure HDInsight 服务使用围绕 Hadoop 形成的开源技术生态系统。 Azure 为开源技术提供一般级别的支持。 有关详细信息,请参阅 Azure 支持常见问题解答网站上的支持范围部分。 HDInsight 服务为内置组件提供附加的支持级别。

HDInsight 服务中有两种类型的开放源代码组件:

  • 内置组件 - 这些组件预先安装在 HDInsight 群集上,并提供在群集的核心功能。 例如,Yarn ResourceManager、Hive 查询语言 (HiveQL) 及 Mahout 库均属于此类别。 HDInsight 提供的 Hadoop 群集版本有哪些新功能中提供了群集组件的完整列表。
  • 自定义组件 - 作为群集用户,可以安装,或者在工作负荷中使用由社区提供的或自己创建的任何组件。

Warning

完全支持通过 HDInsight 群集提供的组件。 Azure 支持部门将帮助找出并解决与这些组件相关的问题。

自定义组件可获得合理范围的支持,有助于进一步解决问题。 Azure 支持部门也许能够解决问题,也可能要求参与可用的开放源代码技术渠道,获取该技术的深入专业知识。 有许多可以使用的社区站点,例如:HDInsight 的 MSDN 论坛Azure CSDN。 此外,Apache 项目在 http://apache.org 上提供了项目站点,例如 Hadoop

HDInsight 服务提供多种方式来使用自定义组件。 不论在群集上使用组件或安装组件的方式为何,均适用相同级别的支持。 以下列表描述了在 HDInsight 群集上使用自定义组件的最常见方式:

  1. 作业提交 - Hadoop 或其他类型的作业可以提交到执行或使用自定义组件的群集。

  2. 群集自定义 - 在群集创建期间,可指定安装在群集节点上的其他设置和自定义组件。

  3. 示例 - 对于常见的自定义组件,Microsoft 和其他用户可能会提供演示如何在 HDInsight 群集上使用这些组件的示例。 我们不针对这些示例提供支持。

故障排除

可以使用 Ambari web UI 查看脚本操作记录的信息。 如果在创建群集期间脚本失败,则与该群集关联的默认存储帐户中也会提供日志。 本部分提供有关如何使用这两个选项检索日志的信息。

使用 Ambari Web UI

  1. 在浏览器中,导航到 https://CLUSTERNAME.azurehdinsight.cn。 将 CLUSTERNAME 替换为 HDInsight 群集的名称。

    出现提示时,为群集输入管理员帐户名 (admin) 和密码。 可能需要在 Web 窗体中重新输入管理员凭据。

  2. 从页面顶部栏中选择“操作”条目 。 将显示通过 Ambari 在群集上执行的当前操作和以前操作的列表。

    选中了“操作”的 Ambari Web UI 栏

  3. 查找“操作”列中包含 run_customscriptaction 的条目。 这些条目是在运行脚本操作时创建的。

    操作的屏幕截图

    若要查看 STDOUT 和 STDERR 输出,请选择 run\customscriptaction 条目,然后通过链接向下钻取。 当脚本运行时,会生成此输出,并且可能包含有用信息。

从默认的存储帐户访问日志

如果因脚本错误导致群集创建失败,则日志会保存在群集存储帐户中。

  • 存储日志位于 \STORAGE_ACCOUNT_NAME\DEFAULT_CONTAINER_NAME\custom-scriptaction-logs\CLUSTER_NAME\DATE

    操作的屏幕截图

    在此目录下面,日志分别针对头节点、辅助角色节点和 zookeeper 节点进行组织。 下面是一些示例:

    • 头节点 - <uniqueidentifier>AmbariDb-hn0-<generated_value>.chinacloudapp.cn

    • 辅助角色节点 - <uniqueidentifier>AmbariDb-wn0-<generated_value>.chinacloudapp.cn

    • Zookeeper 节点 - <uniqueidentifier>AmbariDb-zk0-<generated_value>.chinacloudapp.cn

  • 相应主机的所有 stdout 和 stderr 将上传到存储帐户。 每个脚本操作各有一个 output-*.txterrors-*.txt。 output-*.txt 文件包含有关在主机上运行的脚本的 URI 信息。 以下文本是此信息的示例:

      'Start downloading script locally: ', u'https://hdiconfigactions.blob.core.windows.net/linuxrconfigactionv01/r-installer-v01.sh'
    
  • 有可能重复创建了同名的脚本操作群集。 在这种情况下,可以根据 DATE 文件夹名称来区分相关的日志。 例如,在不同的日期创建的群集 (mycluster) 的文件夹结构类似于以下日志条目:

    \STORAGE_ACCOUNT_NAME\DEFAULT_CONTAINER_NAME\custom-scriptaction-logs\mycluster\2015-10-04 \STORAGE_ACCOUNT_NAME\DEFAULT_CONTAINER_NAME\custom-scriptaction-logs\mycluster\2015-10-05

  • 如果在同一天创建同名的脚本操作群集,可以使用唯一的前缀来标识相关日志。

  • 如果在临近晚上 00:00(午夜)时创建群集,则日志可能跨越两天。 在这种情况下,会看到同一群集有两个不同的日期文件夹。

  • 将日志上传到默认容器可能需要 5 分钟,特别是对于大型群集。 因此,如果想要访问日志,则不应在脚本操作失败时立即删除群集。

Ambari 监视器

Warning

不要在基于 Linux 的 HDInsight 群集上更改 Ambari 监视器 (hdinsightwatchdog) 的密码。 如果更改此帐户的密码,则无法在 HDInsight 群集上运行新脚本操作。

无法导入名称 BlobService

症状:脚本操作失败。 在 Ambari 中查看该操作时,会显示类似于以下错误的文本:

Traceback (most recent call list):
  File "/var/lib/ambari-agent/cache/custom_actions/scripts/run_customscriptaction.py", line 21, in <module>
    from azure.storage.blob import BlobService
ImportError: cannot import name BlobService

原因:升级随附于 HDInsight 群集的 Python Azure 存储客户端时会出现此错误。 HDInsight 需要 Azure 存储客户端 0.20.0。

解决方法:若要解决此错误,请使用 ssh 手动连接到每个群集节点,并使用以下命令重新安装正确的存储客户端版本:

sudo pip install azure-storage==0.20.0

有关使用 SSH 连接到群集的信息,请参阅将 SSH 与 HDInsight 配合使用

历史记录未显示创建群集期间使用的脚本

如果群集是在 2016 年 3 月 15 日之前创建的,则脚本操作历史记录中可能不显示任何条目。 调整群集大小后,脚本会出现在脚本操作历史记录中。

有两种例外情况:

  • 如果群集是在 2015 年 9 月 1 日之前创建的。 这是脚本操作的推出日期。 在此日期之前创建的群集可能不是使用脚本操作创建的。

  • 如果在创建群集期间使用了多个脚本操作,并将相同的名称、相同的 URI 用于多个脚本,但将不同的参数用于多个脚本。 在这种情况下,会出现以下错误:

    由于现有脚本中的脚本名称有冲突,因此无法在此群集上运行任何新脚本操作。 创建群集时提供的脚本名称全都必须唯一。 现有脚本在重设大小时运行。

后续步骤