教程:使用 Array Job 索引控制 Job 差异化 - Amazon Batch
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

教程:使用 Array Job 索引控制 Job 差异化

本教程介绍如何使用 AWS_BATCH_JOB_ARRAY_INDEX 环境变量(所分配的每个子作业)来区分子作业。该示例的工作原理是使用子作业的索引数量,以读取文件中的特定行并用作业的容器内的命令替换与该行号关联的参数。最终,您可以拥有多个运行同一 Docker 映像和命令参数的 Amazon Batch 作业,但结果由于数组作业索引被用作修饰符而不同。

在本教程中,您将创建一个文本文件,该文件包含了彩虹的所有颜色,并且每种颜色单独占一行。然后,您将为 Docker 容器创建一个入口点脚本,该脚本会将索引转换为可用于颜色文件中的行号的值(索引从 0 开始,但行号从 1 开始)。创建一个 Dockerfile,该文件会将颜色和索引文件复制到容器映像并将该映像的 ENTRYPOINT 设置为入口点脚本。Dockerfile 和资源将生成为一个 Docker 映像并被推送到 Amazon ECR。然后,您应注册使用新容器映像的作业定义,提交具有该作业定义的 Amazon Batch 数组作业并查看结果。

Prerequisites

本教程包含以下先决条件:

  • 一个 Amazon Batch 计算环境。有关更多信息,请参阅创建计算环境

  • 一个 Amazon Batch 作业队列和关联的计算环境。有关更多信息,请参阅创建作业队列

  • 在本地系统上安装的 Amazon CLI。有关更多信息,请参阅 Amazon Command Line Interface 用户指南中的安装 Amazon Command Line Interface

  • 在本地系统上安装的 Docker。有关更多信息,请参阅 Docker 文档中的关于 Docker CE

第 1 步:构建容器映像

尽管您可以在命令参数内的作业定义中使用 AWS_BATCH_JOB_ARRAY_INDEX,但创建在入口点脚本中使用变量的容器映像更方便、更高效。本节介绍如何创建此类容器映像。

构建 Docker 容器映像

  1. 创建要用作 Docker 映像工作区的新目录并导航到该目录。

  2. 在工作区目录中创建一个名为 colors.txt 的文件,并将下面的内容粘贴到其中。

    red orange yellow green blue indigo violet
  3. 在工作区目录中创建一个名为 print-color.sh 的文件,并将下面的内容粘贴到其中。

    注意

    LINE 变量被设置为 AWS_BATCH_JOB_ARRAY_INDEX + 1,因为数组索引从 0 开始,但行号从 1 开始。COLOR 变量被设置为与其行号关联的 colors.txt 中的颜色。

    #!/bin/sh LINE=$((AWS_BATCH_JOB_ARRAY_INDEX + 1)) COLOR=$(sed -n ${LINE}p /tmp/colors.txt) echo My favorite color of the rainbow is $COLOR.
  4. 在工作区目录中创建一个名为 Dockerfile 的文件,并将下面的内容粘贴到其中。此 Dockerfile 会将以前的文件复制到您的容器并设置要在容器启动时运行的入口点脚本。

    FROM busybox COPY print-color.sh /tmp/print-color.sh COPY colors.txt /tmp/colors.txt RUN chmod +x /tmp/print-color.sh ENTRYPOINT /tmp/print-color.sh
  5. 生成 Docker 映像:

    docker build -t print-color .
  6. 使用以下脚本测试容器。此脚本在本地将 AWS_BATCH_JOB_ARRAY_INDEX 变量设置为 0,然后递增它以模拟具有 7 个子级的数组作业的行为。

    AWS_BATCH_JOB_ARRAY_INDEX=0 while [ $AWS_BATCH_JOB_ARRAY_INDEX -le 6 ] do docker run -e AWS_BATCH_JOB_ARRAY_INDEX=$AWS_BATCH_JOB_ARRAY_INDEX print-color AWS_BATCH_JOB_ARRAY_INDEX=$((AWS_BATCH_JOB_ARRAY_INDEX + 1)) done

    输出:

    My favorite color of the rainbow is red.
    My favorite color of the rainbow is orange.
    My favorite color of the rainbow is yellow.
    My favorite color of the rainbow is green.
    My favorite color of the rainbow is blue.
    My favorite color of the rainbow is indigo.
    My favorite color of the rainbow is violet.

第 2 步:将映像推送到 Amazon ECR

既然您已构建并测试 Docker 容器,您必须将其推送到映像存储库。本示例使用 Amazon ECR,但您也可以选择使用其他注册表,例如 DockerHub。

  1. 创建用于存储您的容器映像的 Amazon ECR 映像存储库。为简便起见,本示例使用了 Amazon CLI,但您也可以使用 Amazon Web Services Management Console。有关更多信息,请参阅 。创建存储库中的Amazon Elastic Container Registry 用户指.

    aws ecr create-repository --repository-name print-color
  2. 为 添加标签print-color用从上一步返回的 Amazon ECR 存储库 URI 标记映像。

    docker tag print-color aws_account_id.dkr.ecr.region.amazonaws.com/print-color
  3. 登录到 Amazon ECR 注册表。有关更多信息,请参阅 。注册表身份验证中的Amazon Elastic Container Registry 用户指.

    aws ecr get-login-password --region region | docker login --username AWS \ --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
  4. 将映像推送至 Amazon ECR:

    docker push aws_account_id.dkr.ecr.region.amazonaws.com/print-color

第 3 步:创建并注册作 Job 定义

既然您的 Docker 映像位于映像注册表中,您可以在 Amazon Batch 作业定义中指定它并在稍后使用它来运行数组作业。为简便起见,本示例使用了 Amazon CLI,但您也可以使用 Amazon Web Services Management Console。有关更多信息,请参阅创建作业定义

创建作业定义

  1. 在工作区目录中创建一个名为 print-color-job-def.json 的文件,并将下面的内容粘贴到其中。将映像存储库 URI 替换为您自己的映像的 URI。

    { "jobDefinitionName": "print-color", "type": "container", "containerProperties": { "image": "aws_account_id.dkr.ecr.region.amazonaws.com/print-color", "resourceRequirements": [ { "type": "MEMORY", "value": "250" }, { "type": "VCPU", "value": "1" } ] } }
  2. 使用 Amazon Batch 注册作业定义:

    aws batch register-job-definition --cli-input-json file://print-color-job-def.json

第 4 步:提交Amazon Batch数组 Job

在注册作业定义后,您可以提交使用新容器映像的 Amazon Batch 数组作业。

提交 Amazon Batch 数组作业

  1. 在工作区目录中创建一个名为 print-color-job.json 的文件,并将下面的内容粘贴到其中。

    注意

    本示例采用由 Amazon Batch 首次运行向导创建的默认作业队列名称。如果您的作业队列名称不同,请将 first-run-job-queue 名称替换为您的作业队列名称。

    { "jobName": "print-color", "jobQueue": "first-run-job-queue", "arrayProperties": { "size": 7 }, "jobDefinition": "print-color" }
  2. 将作业提交到 Amazon Batch 作业队列。记下在输出中返回的作业 ID。

    aws batch submit-job --cli-input-json file://print-color-job.json
  3. 描述作业的状态并等待作业移动到 SUCCEEDED

第 5 步:查看阵列 Job 日志

在你的工作到达之后SUCCEEDED状态,您可以从作业的容器查看 CloudWatch Logs。

在 CloudWatch Logs 中查看作业的日志

  1. 打开Amazon Batch控制台https://console.aws.amazon.com/batch/.

  2. 在左侧导航窗格中,选择 Jobs (作业)

  3. 对于 Job queue(作业队列),选择一个队列。

  4. Status (状态) 部分中,选择 succeeded (已成功)

  5. 要显示数组作业的所有子作业,请选择在上一节中返回的作业 ID。

  6. 要从作业的容器查看日志,请选择其中一个子作业,然后选择 View logs (查看日志)

  7. 查看其他子作业的日志。每个作业将分别返回彩虹的一种颜色。