在 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 package 处找到。

此代码片段显式创建 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 呈现 最新 batch.node.centos 7
或批处理 rendering-windows2016 呈现 最新 batch.node.windows amd64
Canonical UbuntuServer 16.04-LTS 最新 batch.node.ubuntu 16.04
Canonical UbuntuServer 14.04.5-LTS 最新 batch.node.ubuntu 14.04
Credativ Debian 9 最新 batch.node.debian 9
Credativ Debian 8 最新 batch.node.debian 8
microsoft-ads linux-data-science-vm linuxdsvm 最新 batch.node.centos 7
microsoft-ads standard-data-science-vm standard-data-science-vm 最新 batch.node.windows amd64
microsoft-azure-batch centos-container 7-4 最新 batch.node.centos 7
microsoft-azure-batch centos-container-rdma 7-4 最新 batch.node.centos 7
microsoft-azure-batch ubuntu-server-container 16-04-lts 最新 batch.node.ubuntu 16.04
microsoft-azure-batch ubuntu-server-container-rdma 16-04-lts 最新 batch.node.ubuntu 16.04
MicrosoftWindowsServer WindowsServer 2016-Datacenter 最新 batch.node.windows amd64
MicrosoftWindowsServer WindowsServer 2016-Datacenter-smalldisk 最新 batch.node.windows amd64
MicrosoftWindowsServer WindowsServer 2016-Datacenter-with-Containers 最新 batch.node.windows amd64
MicrosoftWindowsServer WindowsServer 2012-R2-Datacenter 最新 batch.node.windows amd64
MicrosoftWindowsServer WindowsServer 2012-R2-Datacenter-smalldisk 最新 batch.node.windows amd64
MicrosoftWindowsServer WindowsServer 2012-Datacenter 最新 batch.node.windows amd64
MicrosoftWindowsServer WindowsServer 2012-Datacenter-smalldisk 最新 batch.node.windows amd64
MicrosoftWindowsServer WindowsServer 2008-R2-SP1 最新 batch.node.windows amd64
MicrosoftWindowsServer WindowsServer 2008-R2-SP1-smalldisk 最新 batch.node.windows amd64
OpenLogic CentOS 7.4 最新 batch.node.centos 7
OpenLogic CentOS-HPC 7.4 最新 batch.node.centos 7
OpenLogic CentOS-HPC 7.3 最新 batch.node.centos 7
OpenLogic CentOS-HPC 7.1 最新 batch.node.centos 7
Oracle Oracle-Linux 7.4 最新 batch.node.centos 7
SUSE SLES-HPC 12-SP2 最新 batch.node.opensuse 42.1

使用 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 存储的成本是最低的。

后续步骤

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