在 Batch 池中预配 Linux 计算节点

可以使用 Azure Batch 在 Linux 和 Windows 虚拟机上运行并行计算工作负荷。 本文详细介绍如何使用 Batch PythonBatch .NET 客户端库在 Batch 服务中创建 Linux 计算节点池。

Note

在 2017 年 7 月 5 日以后创建的所有 Batch 池都支持应用程序包。 在 2016 年 3 月 10 日和 2017 年 7 月 5 日期间创建的 Batch 池也支持应用程序包,但前提是该池是使用云服务配置创建的。 在 2016 年 3 月 10 日以前创建的 Batch 池不支持应用程序包。 若要详细了解如何使用应用程序包将应用程序部署到 Batch 节点,请参阅使用 Batch 应用程序包将应用程序部署到计算节点

虚拟机配置

在 Batch 中创建计算节点池时,可以使用两个选项来选择节点大小和操作系统:“云服务配置”和“虚拟机配置”。

“云服务配置”提供 Windows 计算节点。 Sizes for Cloud Services(云服务的大小)中列出了可用的计算节点大小,Azure Guest OS releases and SDK compatibility matrix(Azure 来宾 OS 版本和 SDK 兼容性对照表)中列出了可用的操作系统。 创建包含 Azure 云服务节点的池时,需指定上述文章中所述的节点大小和 OS 系列。 对于 Windows 计算节点池,最常使用的是云服务。

“虚拟机配置”为计算节点提供 Linux 和 Windows 映像。 Sizes for virtual machines in Azure(Azure 中虚拟机的大小)(Linux) 和 Sizes for virtual machines in Azure(Azure 中虚拟机的大小)(Windows) 中列出了可用的计算节点大小。 创建包含虚拟机配置节点的池时,必须指定节点的大小、虚拟机映像引用,以及要在节点上安装的 Batch 节点代理 SKU。

虚拟机映像引用

Batch 服务使用虚拟机规模集提供虚拟机配置中的计算节点。 可指定 Azure 市场中的一个映像,或者提供一个准备好的自定义映像。 有关自定义映像的详细信息,请参阅使用自定义映像创建池

配置虚拟机映像引用时,需指定虚拟机映像的属性。 创建虚拟机映像引用时,需提供以下属性:

映像引用属性 示例
Publisher Canonical
产品/服务 UbuntuServer
SKU 14.04.4-LTS
版本 最新

Tip

可以在 Navigate and select Linux virtual machine images in Azure with CLI or PowerShell(使用 CLI 或 PowerShell 在 Azure 中导航和选择 Linux 虚拟机映像)中详细了解这些属性,以及如何列出市场映像。 请注意,目前并非所有市场映像都与 Batch 兼容。 有关详细信息,请参阅 节点代理 SKU

节点代理 SKU

Batch 节点代理是一个程序,它在池中的每个节点上运行,并在节点与 Batch 服务之间提供命令和控制接口。 节点代理对于不同操作系统有不同的实现(称为 SKU)。 从根本上讲,在创建虚拟机配置时,需要先指定虚拟机映像引用,并指定要在其上安装映像的代理节点。 通常,每个节点代理 SKU 与多个虚拟机映像兼容。 下面是节点代理 SKU 的几个示例:

  • batch.node.ubuntu 14.04
  • batch.node.centos 7
  • batch.node.windows amd64

Important

并非市场中的所有可用虚拟机映像都与当前可用的 Batch 节点代理兼容。 使用 Batch SDK 列出可用的节点代理 SKU 及其兼容的虚拟机映像。 有关详细信息以及如何在运行时检索有效映像列表的示例,请参阅本文后半部分的虚拟机映像列表

创建 Linux 池:Batch Python

以下代码片段示范如何使用 用于 Python 的 Azure Batch 客户端库 创建 Ubuntu Server 计算节点池。 有关 Batch Python 模块的参考文档可在“阅读文档”上的 azure.batch 包处找到。

此代码片段显式创建 ImageReference,并指定它的每个属性(publisher、offer、SKU、version)。 但是,我们建议在生产代码中使用 list_node_agent_skus 方法在运行时从可用映像和节点代理 SKU 组合中做出决定和选择。

# Import the required modules from the
# Azure Batch Client Library for Python
import azure.batch.batch_service_client as batch
import azure.batch.batch_auth as batchauth
import azure.batch.models as batchmodels

# Specify Batch account credentials
account = "<batch-account-name>"
key = "<batch-account-key>"
batch_url = "<batch-account-url>"

# Pool settings
pool_id = "LinuxNodesSamplePoolPython"
vm_size = "STANDARD_A1"
node_count = 1

# Initialize the Batch client
creds = batchauth.SharedKeyCredentials(account, key)
config = batch.BatchServiceClientConfiguration(creds, base_url = batch_url)
client = batch.BatchServiceClient(config)

# Create the unbound pool
new_pool = batchmodels.PoolAddParameter(id = pool_id, vm_size = vm_size)
new_pool.target_dedicated = node_count

# Configure the start task for the pool
start_task = batchmodels.StartTask()
start_task.run_elevated = True
start_task.command_line = "printenv AZ_BATCH_NODE_STARTUP_DIR"
new_pool.start_task = start_task

# Create an ImageReference which specifies the Marketplace
# virtual machine image to install on the nodes.
ir = batchmodels.ImageReference(
    publisher = "Canonical",
    offer = "UbuntuServer",
    sku = "14.04.2-LTS",
    version = "latest")

# Create the VirtualMachineConfiguration, specifying
# the VM image reference and the Batch node agent to
# be installed on the node.
vmc = batchmodels.VirtualMachineConfiguration(
    image_reference = ir,
    node_agent_sku_id = "batch.node.ubuntu 14.04")

# Assign the virtual machine configuration to the pool
new_pool.virtual_machine_configuration = vmc

# Create pool in the Batch service
client.pool.add(new_pool)

如上所述,我们建议不要显式创建 ImageReference,而是使用 list_node_agent_skus 方法从当前支持的节点代理/应用商店映像组合中动态选择。 以下 Python 代码片段演示如何使用此方法。

# Get the list of node agents from the Batch service
nodeagents = client.account.list_node_agent_skus()

# Obtain the desired node agent
ubuntu1404agent = next(agent for agent in nodeagents if "ubuntu 14.04" in agent.id)

# Pick the first image reference from the list of verified references
ir = ubuntu1404agent.verified_image_references[0]

# Create the VirtualMachineConfiguration, specifying the VM image
# reference and the Batch node agent to be installed on the node.
vmc = batchmodels.VirtualMachineConfiguration(
    image_reference = ir,
    node_agent_sku_id = ubuntu1404agent.id)

创建 Linux 池:Batch .NET

以下代码片段示范如何使用 Batch .NET 客户端库创建 Ubuntu Server 计算节点池。 可以在 docs.microsoft.com 上找到 Batch .NET 参考文档

以下代码片段使用 PoolOperations.ListNodeAgentSkus 方法从当前支持的市场映像和节点代理 SKU 组合列表中做出选择。 这种做法非常有效,因为支持的组合列表可能随着时间改变。 通常情况下,添加支持的组合。

// Pool settings
const string poolId = "LinuxNodesSamplePoolDotNet";
const string vmSize = "STANDARD_A1";
const int nodeCount = 1;

// Obtain a collection of all available node agent SKUs.
// This allows us to select from a list of supported
// VM image/node agent combinations.
List<NodeAgentSku> nodeAgentSkus =
    batchClient.PoolOperations.ListNodeAgentSkus().ToList();

// Define a delegate specifying properties of the VM image
// that we wish to use.
Func<ImageReference, bool> isUbuntu1404 = imageRef =>
    imageRef.Publisher == "Canonical" &&
    imageRef.Offer == "UbuntuServer" &&
    imageRef.Sku.Contains("14.04");

// Obtain the first node agent SKU in the collection that matches
// Ubuntu Server 14.04. Note that there are one or more image
// references associated with this node agent SKU.
NodeAgentSku ubuntuAgentSku = nodeAgentSkus.First(sku =>
    sku.VerifiedImageReferences.Any(isUbuntu1404));

// Select an ImageReference from those available for node agent.
ImageReference imageReference =
    ubuntuAgentSku.VerifiedImageReferences.First(isUbuntu1404);

// Create the VirtualMachineConfiguration for use when actually
// creating the pool
VirtualMachineConfiguration virtualMachineConfiguration =
    new VirtualMachineConfiguration(imageReference, ubuntuAgentSku.Id);

// Create the unbound pool object using the VirtualMachineConfiguration
// created above
CloudPool pool = batchClient.PoolOperations.CreatePool(
    poolId: poolId,
    virtualMachineSize: vmSize,
    virtualMachineConfiguration: virtualMachineConfiguration,
    targetDedicatedComputeNodes: nodeCount);

// Commit the pool to the Batch service
await pool.CommitAsync();

尽管上述代码片段使用了 PoolOperations.ListNodeAgentSkus 方法动态列出并从支持的映像和节点代理 SKU 组合中做出选择(建议的做法),但也可以显式配置 ImageReference

ImageReference imageReference = new ImageReference(
    publisher: "Canonical",
    offer: "UbuntuServer",
    sku: "14.04.2-LTS",
    version: "latest");

虚拟机映像列表

下表列出了本文上次更新时,与可用 Batch 节点代理兼容的市场虚拟机映像。 请务必注意,此列表并非永久不变,因为可能随时会添加或删除映像和节点代理。 建议 Batch 应用程序和服务始终使用 list_node_agent_skus (Python) 或 ListNodeAgentSkus (Batch .NET),从当前可用的 SKU 中做出决定和选择。

Warning

以下列表可随时更改。 请始终使用 Batch API 中提供的列出节点代理 SKU 方法来列出运行 Batch 作业时兼容的虚拟机和节点代理 SKU。

| 发布者 |

产品 映像 SKU 版本 节点代理 SKU ID
或批处理 rendering-centos73 呈现 最新
或批处理 rendering-windows2016 呈现 最新
Canonical UbuntuServer 16.04-LTS 最新
Canonical UbuntuServer 14.04.5-LTS 最新
Credativ Debian 9 最新
Credativ Debian 8 最新
microsoft-ads linux-data-science-vm linuxdsvm 最新
microsoft-ads standard-data-science-vm standard-data-science-vm 最新
microsoft-azure-batch centos-container 7-4 最新
microsoft-azure-batch centos-container-rdma 7-4 最新
microsoft-azure-batch ubuntu-server-container 16-04-lts 最新
microsoft-azure-batch ubuntu-server-container-rdma 16-04-lts 最新
MicrosoftWindowsServer WindowsServer 2016-Datacenter 最新
MicrosoftWindowsServer WindowsServer 2016-Datacenter-smalldisk 最新
MicrosoftWindowsServer WindowsServer 2016-Datacenter-with-Containers 最新
MicrosoftWindowsServer WindowsServer 2012-R2-Datacenter 最新
MicrosoftWindowsServer WindowsServer 2012-R2-Datacenter-smalldisk 最新
MicrosoftWindowsServer WindowsServer 2012-Datacenter 最新
MicrosoftWindowsServer WindowsServer 2012-Datacenter-smalldisk 最新
MicrosoftWindowsServer WindowsServer 2008-R2-SP1 最新
MicrosoftWindowsServer WindowsServer 2008-R2-SP1-smalldisk 最新
OpenLogic CentOS 7.4 最新
OpenLogic CentOS-HPC 7.4 最新
OpenLogic CentOS-HPC 7.3 最新
OpenLogic CentOS-HPC 7.1 最新
Oracle Oracle-Linux 7.4 最新
SUSE SLES-HPC 12-SP2 最新

使用 SSH 连接到 Linux 节点

在开发期间或进行故障排除时,可能会发现需要登录到池中的节点。 与 Windows 计算节点不同,无法使用远程桌面协议 (RDP) 连接到 Linux 节点。 相反,Batch 服务在每个节点上启用 SSH 访问以建立远程连接。

以下 Python 代码片段会在池中的每个节点上创建一个用户(远程连接时需要)。 然后列显每个节点的安全外壳 (SSH) 连接信息。

import datetime
import getpass
import azure.batch.batch_service_client as batch
import azure.batch.batch_auth as batchauth
import azure.batch.models as batchmodels

# Specify your own account credentials
batch_account_name = ''
batch_account_key = ''
batch_account_url = ''

# Specify the ID of an existing pool containing Linux nodes
# currently in the 'idle' state
pool_id = ''

# Specify the username and prompt for a password
username = 'linuxuser'
password = getpass.getpass()

# Create a BatchClient
credentials = batchauth.SharedKeyCredentials(
    batch_account_name,
    batch_account_key
)
batch_client = batch.BatchServiceClient(
        credentials,
        base_url=batch_account_url
)

# Create the user that will be added to each node in the pool
user = batchmodels.ComputeNodeUser(username)
user.password = password
user.is_admin = True
user.expiry_time = \
    (datetime.datetime.today() + datetime.timedelta(days=30)).isoformat()

# Get the list of nodes in the pool
nodes = batch_client.compute_node.list(pool_id)

# Add the user to each node in the pool and print
# the connection information for the node
for node in nodes:
    # Add the user to the node
    batch_client.compute_node.add_user(pool_id, node.id, user)

    # Obtain SSH login information for the node
    login = batch_client.compute_node.get_remote_login_settings(pool_id,
                                                                node.id)

    # Print the connection info for the node
    print("{0} | {1} | {2} | {3}".format(node.id,
                                         node.state,
                                         login.remote_login_ip_address,
                                         login.remote_login_port))

下面是针对包含四个 Linux 节点的池运行上述代码后的示例输出:

Password:
tvm-1219235766_1-20160414t192511z | ComputeNodeState.idle | 13.91.7.57 | 50000
tvm-1219235766_2-20160414t192511z | ComputeNodeState.idle | 13.91.7.57 | 50003
tvm-1219235766_3-20160414t192511z | ComputeNodeState.idle | 13.91.7.57 | 50002
tvm-1219235766_4-20160414t192511z | ComputeNodeState.idle | 13.91.7.57 | 50001

在节点上创建用户时不需要指定密码,而可以指定 SSH 公钥。 在 Python SDK 中,请在 ComputeNodeUser 上使用 ssh_public_key 参数。 在 .NET 中,请使用 ComputeNodeUser.SshPublicKey 属性。

定价

Azure Batch 构建在 Azure 云服务和 Azure 虚拟机技术基础之上。 Batch 服务本身是免费提供的,这意味着,只需支付 Batch 解决方案使用的计算资源费用。 如果选择“云服务配置”,系统会根据云服务定价结构收费。 如果选择“虚拟机配置”,系统会根据虚拟机定价结构收费。

如果使用应用程序包将应用程序部署到 Batch 节点,系统还会对应用程序包使用的 Azure 存储资源收费。 通常,Azure 存储的成本是最低的。

后续步骤

Batch Python 教程

有关如何配合 Python 使用 Batch 的更深入教程,请参阅 Get started with the Azure Batch Python client(Azure Batch Python 客户端入门)。 该教程随附的代码示例包含一个帮助器函数 get_vm_config_for_distro,用于演示获取虚拟机配置的另一种方法。

Batch Python 代码示例

GitHub 上 azure-batch-samples 存储库中的 Python 代码示例包含演示如何执行常见 Batch 操作(例如创建池、作业和任务)的多个脚本。 Python 示例随附的 README 文件包含有关如何安装所需包的详细信息。

Batch 论坛

MSDN 上的 Azure Batch 论坛是探讨 Batch 服务以及咨询相关问题的一个好地方。 欢迎前往阅读这些“精华”贴子,并发布构建 Batch 解决方案时遇到的问题。