在 Batch 池上装载虚拟文件系统

注意

本文引用了 CentOS,这是一个接近生命周期结束 (EOL) 状态的 Linux 发行版。 请相应地考虑你的使用和规划。

Azure Batch 支持在 Batch 池的 Windows 或 Linux 计算节点上装载云存储或外部文件系统。 计算节点加入池时,会装载虚拟文件系统,其充当该节点上的本地驱动器。 本文展示了如何使用适用于 .NET 的 Batch 管理库在计算节点池上装载虚拟文件系统。

与要求任务从大型共享数据集中获取自己的数据相比,将文件系统装载到池可以更轻松、更高效地访问数据。 考虑具有多个任务的场景,这些任务需要访问一组通用数据(例如渲染电影)。 每个任务每次渲染场景文件中的一个或多个帧。 通过装载包含场景文件的驱动器,每个计算节点都可以更轻松地访问共享数据。

此外,还可以选择基础文件系统以满足性能、吞吐量和每秒输入/输出操作(IOPS)要求。 可以根据并发访问数据的计算节点数独立缩放文件系统。

支持的配置

可以装载以下类型的文件系统:

  • Azure 文件
  • Azure Blob 存储
  • 网络文件系统 (NFS)
  • 通用 Internet 文件系统 (CIFS)

Batch 支持为节点代理针对其各自的发布服务器和产品/服务生成的以下虚拟文件系统类型。

OS 类型 Azure 文件存储共享 Azure Blob 容器 NFS 装载 CIFS 装载
Linux
Windows

注意

2019 年 8 月 8 日或之后创建的 Batch 池支持装载虚拟文件系统。

网络要求

在虚拟网络中使用 Batch 池进行虚拟文件装载时,请记住以下要求并确保所需流量畅通无阻。 有关详细信息,请参阅虚拟网络中的 Batch 池

  • Azure 文件存储共享要求为传入和传出storage服务标记的流量打开 TCP 端口 445。 有关详细信息,请参阅将 Azure 文件共享与 Windows 配合使用

  • Azure Blob 容器要求为传入和传出storage服务标记的流量打开 TCP 端口 443。 虚拟机(VM)必须有权访问https://packages.microsoft.com才能下载blobfusegpg包。 根据配置,可能需要访问其他 URL。

  • 默认情况下,网络文件系统(NFS)需要访问端口 2049。 配置可能有其他要求。 VM 必须有权访问相应的包管理器才能下载 nfs-common包(针对 Debian 或 Ubuntu)。 该 URL 因 OS 版本而异。 根据配置,可能还需要访问其他 URL。

    通过 NFS 装载 Azure Blob 或 Azure 文件存储可能需要满足其他网络要求。 例如,计算节点可能需要使用与存储帐户相同的虚拟网络子网。

  • 常见的 Internet 文件系统(CIFS)需要访问 TCP 端口 445。 VM 必须有权访问相应的包管理器才能下载cifs-utils包。 该 URL 因 OS 版本而异。

装载配置和实现

在池上装载虚拟文件系统可使文件系统用于池中的每个计算节点。 当某个计算节点加入池、重启或重置映像时,将对该文件系统进行配置。

要在池中装载文件系统,请创建与虚拟文件系统匹配的 MountConfiguration对象:AzureBlobFileSystemConfigurationAzureFileShareConfigurationNfsMountConfigurationCifsMountConfiguration

所有装载配置对象都需要以下基本参数。 一些装载配置具有特定文件系统的特定参数,代码示例更详细地呈现了这些参数。

  • 存储帐户的帐户名称或源

  • 相对装载路径或源,文件系统装载在计算节点上的位置,相对于可通过AZ_BATCH_NODE_MOUNTS_DIR访问的标准\fsmounts目录。

    确切的\fsmounts目录位置因节点 OS 而异。 例如,Ubuntu 节点上的位置映射到mnt\batch\tasks\fsmounts

  • 装载选项或 BlobFuse 选项,描述了用于装载文件系统的特定参数。

创建池和MountConfiguration对象后,将对象分配给MountConfigurationList属性。 当节点加入池、重启或重置映像时,将对该文件系统进行装载。

Batch 代理在 Windows 和 Linux 上以不同的方式实现装载。

  • 在 Linux 上,Batch 会安装 cifs-utils 包。 然后,Batch 发出 mount 命令。

  • 在 Windows 上,Batch 会使用 cmdkey 添加你的 Batch 帐户凭据。 然后,Batch 通过 net use 发出 mount 命令。 例如:

    net use S: \\<storage-account-name>.file.core.chinacloudapi.cn\<fileshare> /u:AZURE\<storage-account-name> <storage-account-key>
    

装载文件系统会创建环境变量AZ_BATCH_NODE_MOUNTS_DIR,该变量指向装载的文件系统和日志文件的位置。 可以使用日志文件进行故障排除和调试。

使用 PowerShell 装载 Azure 文件存储共享

可以使用Azure PowerShell在 Windows 或 Linux Batch 池上装载 Azure 文件存储共享。 以下过程会指导你在 Batch 池上配置并装载 Azure 文件共享文件系统。

重要

池上可装载的文件系统的最大数量为 10。 有关详细信息和其他限制,请参阅Batch 服务配额和限制

先决条件

  • 具有活动订阅的 Azure 帐户。
  • 已安装 Azure PowerShell
  • 具有链接 Azure 存储帐户(包含文件共享)的现有 Batch 帐户。
  1. 登录到 Azure 订阅,将占位符替换为订阅 ID。

    Connect-AzAccount -Environment AzureChinaCloud -Subscription "<subscription-ID>"
    
  2. 获取你的 Batch 帐户的上下文。 将<batch-account-name>占位符替换为 Batch 帐户名称。

    $context = Get-AzBatchAccount -AccountName <batch-account-name>
    
  3. 使用以下设置创建 Batch 池。 将<storage-account-name><storage-account-key><file-share-name>占位符替换为链接到 Batch 帐户的存储帐户中的值。 将<pool-name>占位符替换为池所需的名称。

    以下脚本会创建池(包含 Windows Server 2016 Datacenter,Standard_D2_V2 大小节点),然后将 Azure 文件共享装载到节点的S盘。

    $fileShareConfig = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSAzureFileShareConfiguration" -ArgumentList @("<storage-account-name>", "https://<storage-account-name>.file.core.chinacloudapi.cn/batchfileshare1", "S", "<storage-account-key>")
    
    $mountConfig = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSMountConfiguration" -ArgumentList @($fileShareConfig)
    
    $imageReference = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSImageReference" -ArgumentList @("WindowsServer", "MicrosoftWindowsServer", "2016-Datacenter", "latest")
    
    $configuration = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSVirtualMachineConfiguration" -ArgumentList @($imageReference, "batch.node.windows amd64")
    
    New-AzBatchPool -Id "<pool-name>" -VirtualMachineSize "STANDARD_D2_V2" -VirtualMachineConfiguration $configuration -TargetDedicatedComputeNodes 1 -MountConfiguration @($mountConfig) -BatchContext $context
    
  4. 连接到节点并检查输出文件是否正确。

访问装载的文件

Azure Batch 任务可以使用驱动器的直接路径访问装载的文件,例如:

cmd /c "more S:\folder1\out.txt & timeout /t 90 > NULL"

Azure Batch 代理仅授予对 Azure Batch 任务的访问权限。 如果使用远程桌面协议(RDP)连接到节点,用户帐户无法自动访问装载驱动器。 通过 RDP 连接到节点时,必须添加存储帐户的凭据才能直接访问S盘。

使用cmdkey添加凭据。 将<storage-account-name><storage-account-key>占位符替换为自己的信息。

cmdkey /add:"<storage-account-name>.file.core.chinacloudapi.cn" /user:"Azure\<storage-account-name>" /pass:"<storage-account-key>"

对装载问题进行故障排除

如果装载配置失败,计算节点会失败,且节点状态设置为不可用。 要诊断安装配置失败,请检查ComputeNodeError属性,获取有关错误的详细信息。

要获取日志文件以进行调试,可以使用OutputFiles API 以上传*.log文件。 *.log文件包含有关AZ_BATCH_NODE_MOUNTS_DIR位置上文件系统装载的信息。 对于每个装载,装载日志文件的格式为:<type>-<mountDirOrDrive>.log。 例如,名为test的装载目录上的 CIFS 装载有名为 cifs-test.log的装载日志文件。

调查装载错误

可以通过 RDP 或 SSH 连接到节点,以检查与文件系统装载相关的日志文件。 尝试将 Azure 文件共享装载到 Batch 节点时,可能会显示以下错误消息:

Mount Configuration Error | An error was encountered while configuring specified mount(s)
Message: System error (out of memory, cannot fork, no more loop devices)
MountConfigurationPath: S

如果收到此错误,请通过 RDP 或 SSH 连接到节点以检查相关的日志文件。 Batch 代理在 Windows 和 Linux 上以不同的方式实现 Azure 文件共享装载。 在 Linux 上,Batch 会安装 cifs-utils 包。 然后,Batch 发出 mount 命令。 在 Windows 上,Batch 会使用 cmdkey 添加你的 Batch 帐户凭据。 然后,Batch 通过 net use 发出 mount 命令。 例如:

net use S: \\<storage-account-name>.file.core.chinacloudapi.cn\<fileshare> /u:AZURE\<storage-account-name> <storage-account-key>
  1. 通过 RDP 连接到节点。

  2. D:\batch\tasks\fsmounts上打开日志文件fshare-S.log

  3. 查看错误消息,例如:

    CMDKEY: Credential added successfully.
    System error 86 has occurred.
    
    The specified network password is not correct.
    
  4. 使用Azure 文件共享故障排除工具对问题进行故障排除吧。

如果无法使用 RDP 或 SSH 在节点上检查日志文件,可以将日志上传到 Azure 存储帐户。 可以将此方法用于 Windows 和 Linux 日志。

  1. Azure 门户中,搜索并选择具有池的 Batch 帐户。

  2. 在 Batch 帐户页面,从左侧导航栏中选择“”。

  3. 在“”页面,选择池名称。

  4. 在池页面,从左侧导航栏中选择“节点”。

  5. 在“节点”页面,选择节点名称。

  6. 在节点页面,选择“上传 Batch 日志”。

  7. 在“上传 Batch 日志”窗格中,选择“选取存储容器”。

  8. 在“存储帐户”页面,选择存储帐户。

  9. 在“容器”页面,选择或创建将文件上传到的容器,然后选择“选择”。

  10. 选择“开始上传”。

  11. 上传完成后,下载文件并打开agent-debug.log

  12. 查看错误消息,例如:

    ..20210322T113107.448Z.00000000-0000-0000-0000-000000000000.ERROR.agent.mount.filesystems.basefilesystem.basefilesystem.py.run_cmd_persist_output_async.59.2912.MainThread.3580.Mount command failed with exit code: 2, output:
    
    CMDKEY: Credential added successfully.
    
    System error 86 has occurred.
    
    The specified network password is not correct.
    
  13. 使用Azure 文件共享故障排除工具对问题进行故障排除吧。

使用 PowerShell 手动装载文件共享

如果无法诊断或修复装载错误,可以改用 PowerShell 手动装载文件共享。

  1. 创建一个不使用装载配置的池。 例如:

    $imageReference = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSImageReference" -ArgumentList @("WindowsServer", "MicrosoftWindowsServer", "2016-Datacenter", "latest")
    
    $configuration = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSVirtualMachineConfiguration" -ArgumentList @($imageReference, "batch.node.windows amd64")
    
    New-AzBatchPool -Id "<pool-name>" -VirtualMachineSize "STANDARD_D2_V2" -VirtualMachineConfiguration $configuration -TargetDedicatedComputeNodes 1  -BatchContext $Context
    
  2. 等待节点进入“空闲”状态。

  3. Azure 门户中,搜索并选择具有文件共享的存储帐户。

  4. 在存储帐户页面的菜单中,从左侧导航栏中选择“文件共享”。

  5. 在“文件共享”页面,选择要装载的文件共享。

  6. 在文件共享页面,选择“连接”。

  7. 在“连接”窗格中,选择“Windows”选项卡 。

  8. 对于“驱动器号”,请输入要使用的驱动器。 默认值为Z

  9. 对于“身份验证方法”,请选择连接到文件共享的方式。

  10. 选择“显示脚本”,并复制用于装载文件共享的 PowerShell 脚本。

  11. 通过 RDP 连接到节点。

  12. 运行复制的命令以装载文件共享。

  13. 请注意输出中的任何错误消息。 可以使用此信息来排查任何与网络相关的问题。

示例装载配置

以下代码示例配置演示了如何将各种文件共享系统装载到计算节点池中。

Azure 文件存储共享

Azure 文件存储是标准的 Azure 云文件系统产品/服务。 以下配置将名为<file-share-name>的 Azure 文件存储共享装载到S盘。 有关示例中参数的信息,请参阅在 Windows 上装载 SMB Azure 文件共享使用 Azure 门户创建 NFS Azure 文件共享并将其装载到 Linux VM

new PoolAddParameter
{
    Id = poolId,
    MountConfiguration = new[]
    {
        new MountConfiguration
        {
            AzureFileShareConfiguration = new AzureFileShareConfiguration
            {
                AccountName = "<storage-account-name>",
                AzureFileUrl = "https://<storage-account-name>.file.core.chinacloudapi.cn/<file-share-name>",
                AccountKey = "<storage-account-key>",
                RelativeMountPath = "S",
                MountOptions = "-o vers=3.0,dir_mode=0777,file_mode=0777,sec=ntlmssp"
            },
        }
    }
}

Azure Blob 容器

另一种选择是通过BlobFuse使用 Azure Blob 存储。 装载 Blob 文件系统需要帐户密钥、共享访问签名(SAS)密钥,或具有存储帐户访问权限的托管标识。

有关获取这些密钥或标识的信息,请参阅以下文章:

以下配置使用 BlobFuse 选项装载 Blob 文件系统。 出于说明目的,示例显示了AccountKeySasKeyIdentityReference,但实际上只能指定其中一种方法。

new PoolAddParameter
{
    Id = poolId,
    MountConfiguration = new[]
    {
        new MountConfiguration
        {
            AzureBlobFileSystemConfiguration = new AzureBlobFileSystemConfiguration
            {
                AccountName = "<storage-account-name>",
                ContainerName = "<container-name>",
                // Use only one of the following three lines:
                AccountKey = "<storage-account-key>",
                SasKey = "<sas-key>",
                IdentityReference = new ComputeNodeIdentityReference("/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>"),
                RelativeMountPath = "<relative-mount-path>",
                BlobfuseOptions = "-o attr_timeout=240 -o entry_timeout=240 -o negative_timeout=120 "
            },
        }
    }
}

要获得对 BlobFuse 装载目录的默认访问权限,请以管理员身份运行任务。 BlobFuse 在用户空间装载目录,并在创建池时将目录作为根装载。 在 Linux 中,所有管理员任务都是根。 FUSE 参考页面介绍了 FUSE 模块的所有选项。

有关使用 BlobFuse 的更多信息和提示,请参阅以下参考:

NFS

可以将 NFS 共享装载到池节点,从而允许 Batch 访问传统的文件系统。 该设置可以是部署在云中的单个 NFS 服务器,也可以是通过虚拟网络访问的本地 NFS 服务器。 NFS 装载是一种分布式内存中缓存,用于数据密集型高性能计算(HPC)任务。 NFS 装载还支持其他标准的 NFS 兼容接口,例如适用于 Azure Blob 的 NFS适用于 Azure Files 的 NFS

以下示例展示了 NFS 文件系统装载的配置:

new PoolAddParameter
{
    Id = poolId,
    MountConfiguration = new[]
    {
        new MountConfiguration
        {
            NfsMountConfiguration = new NFSMountConfiguration
            {
                Source = "<source>",
                RelativeMountPath = "<relative-mount-path>",
                MountOptions = "options ver=3.0"
            },
        }
    }
}

CIFS

CIFS装载到池节点是提供传统文件系统访问权限的另一种方法。 CIFS 是一种文件共享协议,它提供了一种用于请求网络服务器文件和服务的开放和跨平台的机制。 CIFS 基于用于 Internet 和 Intranet 文件共享的SMB 协议增强版。

以下示例展示了 CIFS 文件装载的配置。

new PoolAddParameter
{
    Id = poolId,
    MountConfiguration = new[]
    {
        new MountConfiguration
        {
            CifsMountConfiguration = new CIFSMountConfiguration
            {
                Username = "<storage-account-name>",
                RelativeMountPath = "<relative-mount-path>",
                Source = "<source>",
                Password = "<storage-account-key>",
                MountOptions = "-o vers=3.0,dir_mode=0777,file_mode=0777,serverino,domain=<domain-name>"
            },
        }
    }
}

注意

查找使用 PowerShell 而不是 C# 的示例? 可在此处找到另一个很好的示例:将 Azure 文件装载到 Azure Batch 池

后续步骤