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

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

教程:使用数组作业索引控制作业差异化

本教程介绍如何使用 AWS_BATCH_JOB_ARRAY_INDEX 环境变量来区分子作业。每个子作业都分配给这个变量。该示例使用子作业的索引号来读取文件中的特定行。然后,它将与该行号关联的参数替换为作业容器内的命令。结果是,你可以有多个运行相同的 Docker 镜像和命令参数的 Amazon Batch 作业。但是,结果有所不同,因为使用数组作业索引作为修饰符。

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

先决条件

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

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

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

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

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

步骤 1:构建容器映像

可以在命令参数中使用作业定义中的 AWS_BATCH_JOB_ARRAY_INDEX。但是,我们建议您创建容器映像,该映像改用 Entrypoint 脚本中的变量。本节介绍如何创建此类容器映像。

构建 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. 用从上一步返回的 Amazon ECR r存储库 URI 标记 print-color 映像。

    $ 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:创建并注册作业定义

现在,您的 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 阵列作业

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

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

    注意

    此示例使用本 先决条件 节中提到的作业队列。

    { "jobName": "print-color", "jobQueue": "existing-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:查看数组作业日志

任务达到SUCCEEDED状态后,您可以从任务的容器中查看 CloudWatch 日志。

要在 “日志” 中查看作业的 CloudWatch 日志
  1. 打开 Amazon Batch 控制台,网址为 https://console.aws.amazon.com/batch/

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

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

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

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

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

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