利用 AWS Batch 和 EC2 Spot 实例以更低的成本大规模运行批处理作业

在本教程中,您将学会如何在由 Amazon EC2 Spot 实例支持的计算环境中使用 AWS Batch 运行批处理作业。AWS Batch 是一组批处理管理功能,可根据所提交批处理作业的量和特定资源需求,来动态预配最佳数量和类型的计算资源(例如,CPU 优化型、内存优化型和/或加速型计算实例)。AWS Batch 与 EC2 Spot 实例原生集成,这意味着,与按需型实例定价相比,可以节省高达 90% 的计算成本。

前期准备

如果您使用的是新的 AWS 账户或从未使用过 EC2 Spot 实例的账户,则需要在您的账户上设置一组 IAM 角色:AmazonEC2SpotFleetRoleAWSServiceRoleForEC2Spot AWSServiceRoleForEC2SpotFleet。如果您的 AWS 账户上没有这些角色,请按照此处的说明创建这些角色。

本教程还需要使用您 AWS 账户的默认 VPC。如果您的账户没有默认 VPC,则可以使用自己的 VPC。对后一种情况,请确保您的子网满足此处所述的要求。此外,还建议您的 VPC 有一个子网映射到正在使用的 AWS 区域的每个可用区。可以在推出 AWS Batch 的任何 AWS 区域中运行本教程(可以在此处找到列表)。

关于本教程
时间 10 分钟
成本 低于 1 美元
使用场景 计算
产品 AWS Batch、EC2 Spot 实例
级别 200
上次更新时间 2020 年 2 月 10 日

步骤 1:创建 EC2 Spot 实例支持的计算环境

1.1 — 打开浏览器并前往 AWS Batch 控制台。如果您已经拥有 AWS 账户,请登录该控制台。否则,请创建一个新 AWS 账户以开始入手。

1.2 — 我们将使用标准 Batch 控制台。如果您看到显示 Get started(开始使用)的页面,请点击 Get started(开始使用)。否则请跳至步骤 2。

1.3 — 点击 Skip wizard(跳过向导)。在本教程中,我们将使用标准 Batch 控制台。

您现在将看到 AWS Batch 控制台。

1.4 — 计算环境是 AWS Batch 将用于放置作业的一组计算资源。要创建计算环境,请点击 AWS Batch 控制台左侧的 compute environments(计算环境)部分,然后点击 create environment(创建环境)按钮,打开计算环境创建向导。

1.5 — 在 Compute environment type(计算环境类型)中,保留默认选择 Managed(托管)。这将创建一个由 AWS Batch 管理的计算环境,该环境将在调度批处理作业和需要计算容量时自动横向扩展和缩减。

然后,设置 Compute environment name(计算环境名称),例如 spot-compute-environment

Service role(服务角色)下拉列表中,选择 AWSBatchServiceRole(如果您的账户中存在该角色),否则选择 Create new role(创建新角色)。这是一个 IAM 角色,AWS Batch 将使用该角色代表您管理资源。

Instance role(实例角色)中,选择 ecsInstanceRole IAM 角色(如果您的账户中存在该角色),否则选择 Create new role(创建新角色)进行创建。这是一个 IAM 角色,将附加到 EC2 实例,代表您进行 AWS API 调用(AWS Batch 使用 Amazon ECS 创建计算环境)。

然后,在 EC2 key pair(EC2 密钥对)部分中,(可选)选择 EC2 密钥对(如果您希望能够通过 SSH 访问 AWS Batch 将创建的 EC2 实例)。

1.6 — 现在,向下滚动到 Configure your compute resources(配置您的计算资源)部分。

Provisioning model(预配模型)中选择 Spot ,将 maximum price(最高价格)留空(这将使用设置为按需型实例价格的实例的最高价格,但您将始终支付当前价格)。

对于 Allowed instance types(允许的实例类型)和 Allocation strategy(分配策略),保留默认值,即分别为 optimal(最优)和 SPOT_CAPACITY_OPTIMIZED (按 Spot 容量优化)。这些设置将使 AWS Batch 从 m4、r4 和 c4 实例系列以及最深的 Spot 容量池中为您的作业选择最佳实例类型,从而降低作业运行时 Spot 实例中断的可能性(因为 EC2 需要针对按需型实例的需求激增申请容量时会发生中断)。如果作业需要,可以添加额外的实例系列或特定类型,包括 GPU 实例系列(P2 和 P3);AWS Batch 将根据您的作业需求选择最佳实例集,同时享受相较于按需型实例定价 Spot 实例提供的 90% 折扣。

1.7 — 将 Configure your compute resources(配置您的计算资源)中的其余设置保留为默认值。然后,向下滚动到 Networking(网络)部分。默认情况下,AWS Batch 将选择您的默认 VPC。如果您的账户没有默认 VPC,或者您想在特定的 VPC 上部署 Batch 计算环境,请在此处选择该 VPC 以及要使用的子网。如果您不使用默认 VPC,请确保您的 VPC 配置符合此处规定的网络要求。

向下滚动到页面的最底部,然后点击 create(创建)按钮,创建计算环境。

1.8 — 您新创建的计算环境将显示在控制台上。

步骤 2:创建作业队列

2.1 — 现在我们已经创建了一个执行作业的计算环境,我们需要一个与之相关的作业队列,这样提交的作业就可以在 Spot 计算环境中进行调度。

在 AWS Batch 控制台上,前往 Job queues(作业队列),然后点击 Create queue(创建队列)按钮。

2.2 — 设置 Queue name(队列名称)(例如 my-batch-job-queue),将 Priority(优先级)设置为 10,然后在 Connected compute environments for this queue(此队列的连接的计算环境)上,从列表中选择 spot-compute-environment

然后,点击 Create job queue(创建作业队列)按钮。

步骤 3:创建作业定义

3.1 — 目前,我们已经创建了一个计算环境和一个与其连接的作业队列,因此现在可以为我们的作业创建一个作业定义。作业定义指定了作业将运行的方式。

AWS Batch 在 Docker 容器中运行作业,作业定义对各种属性进行了定义,例如,用于作业的 Docker 镜像、作业所需的 vCPU 数量和内存量、容器属性、环境变量...

前往控制台的 Job definitions(作业定义)页面,然后点击 Create(创建)按钮。

3.2 — 在 Job definition name(作业定义名称)中,为作业命名(例如 my-first-batch-job)。Job attempts(作业尝试次数)定义了 AWS Batch 将尝试执行作业的次数。尽管平均只有不到 5% 的 Spot 实例被中断,但如果 EC2 需要恢复容量,就可能会发生中断。为了最大限度地延长正常运行时间,请将作业尝试次数设置为 2 或更高值,以便运行作业的实例中断或失败时,AWS Batch 会重试执行。也可以选择定义 Execution timeout(执行超时)值。

3.3 — 将 Parameters(参数)部分留空(可点击此处详细了解作业定义参数)。

然后,在 Environment(环境)部分中,将 Job role(作业角色)留空(可以使用此参数为您的作业分配 IAM 角色,以便您的作业可以对 AWS 服务进行 API 调用);将 Container image(容器镜像)设置为 amazonlinux,在 Command(命令)部分中,点击 JSON 页签,并将以下内容粘贴到文本框中:["sh", "-c", "echo \"Hello world from job $AWS_BATCH_JOB_ID \"This is run attempt $AWS_BATCH_JOB_ATTEMPT"]。为此作业分配 1 个 vCPU 和 256 MB 内存。

此示例作业将在 amazonlinux 容器镜像上运行,并将输出 Hello world 信息,其中包括 AWS Batch 分配的作业 ID 和执行尝试次数。这些数据由 AWS Batch 以环境变量的形式提供,您可以在作业中使用。此外,您还可以将其他环境变量传递给您的作业。要了解有关此功能的更多信息,请查看此处的文档。

3.4 — 将其余设置保留为默认值,然后向下滚动到最底部,点击 Create job definition(创建作业定义)按钮。

步骤 4:执行作业并查看结果

4.1 — 现在我们都设置好了,前往 Jobs(作业)页面,然后点击 Submit job(提交作业)按钮。

4.2 — 在控制台上,为您的作业输入 Job name 命名(例如 first-batch-job-run),在 Job definition(作业定义)中,选择 my-first-batch-job,并在 Job queue(作业队列)中,保留我们之前创建的队列。将其余设置保留为默认值,然后向下滚动到最底部,点击 Submit job(提交作业)按钮。

4.3 — 目前,您的批处理作业已放置在队列中,AWS Batch 将负责扩缩与队列关联的计算环境上的计算资源;在我们的示例中,从最深的 Spot 容量池中选择最合适的实例类型以运行作业。

转到 Dashboard(控制面板)并不断刷新 Job queues(作业队列)部分,这样您就会看到作业经过不同的状态,直到最终处于 SUCCEDED(成功)状态。如果刷新 Compute environments(计算环境)部分,您还会看到 Batch 如何增加所需 vCPU 数以运行我们的作业。(注意:AWS Batch 大约需要 2 分钟才能启动计算资源并运行作业。您可以自由浏览控制台并熟悉它的操作界面)。

4.4 — 作业最终处于 SUCCEEDED(成功)状态后,点击 SUCCEEDED(成功)下面的数字。您将被重定向到控制台的 Jobs(作业)页面。

4.5 — 点击 Job id(作业 ID),打开其详细信息。

4.6 — 向下滚动一点,直到找到 Attempts(尝试)部分,其中包含一个 View logs(查看日志)链接,可查看您的作业日志。

4.7 — 点击 View logs(查看日志)链接以重定向到 Amazon CloudWatch Logs,查看您的作业日志。此时将打开一个新窗口,对于您的作业日志,您应该会看到类似以下内容的输出。

步骤 5:查看实现的节省

5.1 — 现在,您的作业已经在 AWS Batch 管理的 Spot 实例上执行,量化相较于按需型实例定价所实现的节省将非常有帮助。要查看节省,请转到 EC2 控制台的 Spot Request(Spot 请求)部分,然后点击 savings summary(节省摘要)按钮。将显示使用 Spot 实例所实现的节省总额

步骤 6:删除资源

6.1 — 前往 AWS Batch 控制台的 Job queues(作业队列)页面,然后选择您的队列。之后,点击 Disable(禁用)按钮。

单击循环箭头按钮,刷新控制台,并等待片刻,直到队列状况为 DISABLED(已禁用)(Status(状态)应为 VALID(有效));然后继续并点击 Delete(删除),将其删除。等待队列完全删除(使用循环箭头按钮不断刷新,直到队列从控制台中消失)。

6.2 —转到 Compute environments(计算环境),选择您的计算环境,并点击 Disable(禁用)。使用循环箭头按钮不断刷新控制台,并允许 AWS Batch 禁用计算环境。Status(状态)应为 VALID(有效),State(状况)应为 DISABLED(已禁用)。

然后,选择计算环境,并点击 Delete(删除)按钮,删除该环境。

恭喜您

您现在已经学会如何使用 AWS Batch 在 Amazon EC2 Spot 实例上运行批处理作业。Amazon EC2 Spot 实例非常适合批处理作业,因为这种实例通常具有容错性和实例灵活性。AWS Batch 负责完成管理服务器集群、选择实例类型和根据您的工作负载需求自动扩缩的所有繁重工作,而您可以专注于开发批处理作业,并使用 Spot 实例以很低的成本运行这些作业。

Was this page helpful?

推荐的后续步骤

在 EC2 Spot 实例上运行 AWS Batch

现在您已经学会如何通过 AWS 控制台在 Spot 上运行 AWS Batch,请观看此视频,了解如何通过 AWS CLI 运行。

创建简单的 fetch & run(拉取并运行)AWS Batch 作业

需要复习一下如何设置 Docker 容器吗?请阅读这篇博客,了解如何构建简单的 Docker 容器,您可以使用 AWS Batch 在 Amazon ECS 上运行该容器。

通过选择 AWS Batch 分配策略优化成本、可用性和吞吐量

现在您已经了解了使用 Spot 容量优化型分配模型在 EC2 Spot 实例上运行 AWS Batch 的基本知识,请阅读这篇博客,了解如何组合使用多种 EC2 分配策略来运行您的工作负载。