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

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

教程:使用阵列作业索引控制作业差异

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

在本教程中,您将创建一个文本文件,该文件包含了彩虹的所有颜色,并且每种颜色单独占一行。然后,您将为 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在命令参数中的作业定义. 但是,我们建议您创建一个在入口点脚本中使用变量的容器映像。本节介绍如何创建此类容器映像。

构建 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 Useristry.

    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数组作业

在注册作业定义后,您可以提交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 步:查看阵列作业日志

在你的工作到达之后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. 查看其他子作业的日志。每个作业将分别返回彩虹的一种颜色。