容器!利器!批量计算AWS Batch

AWS Batch 服务近期已在 AWS 中国区域上线运行。 AWS Batch 已在全球范围内 广泛服务于基因测序、数字媒体渲染、科学研究、金融服务等高性能计算(HPC)的 业务场景中。本文通过一个只需五个步骤的动手实践来示例如何利用 AWS Batch 快速 搭建 HPC 集群, 以帮助您快速上手运用 AWS Batch 服务

-- D.C

aws batch文档

AWS Batch 基本介绍

一句话理解:把分析流程打包成docker,批量提交到aws,不用去管开什么机器,batch会帮你搞定,跑完自动释放资源,随用随开,用完就关。

AWS Batch 让开发人员、科学家和工程师能够轻松高效地在 AWS 上运行成千上万个批 处理计算作业。 AWS Batch 可根据提交的批处理作业的卷和特定资源需求动态预置最 佳的计算资源(如 CPU 或内存优化实例)数量和类型。借助 AWS Batch,您无需安装 和管理运行您的作业所使用的批处理计算软件或服务器集群,从而使您能够专注于分 析结果和解决问题。 AWS Batch 有着丰富的功能特性,支持动态计算资源预置和扩 展,支持精细作业定义和权限控制, 支持紧密耦合型的 HPC 工作负载,可以基于优先 级来进行任务安排,具有集成的监控和日志记录。

AWS Batch 具有的优势包括:

应用场景(基因)

生命科学中 DNA 测序场景——生物信息学家进行基因组序列的二级分析时,利用 AWS Batch 服务来简化并加速测序分析的处理过程, 以批量处理的方式将原始 DNA 读数装配成完整基因组序列, 同时减少测序分析的数据偏差。

workflow

Let's do it 利用 AWS Batch 搭建高性能集群

你够格了么:

本实验利用 Batch 搭建一个简单抓取脚本运行的 Demo, 原理如下图流程所示。

workflow

上图中几个aws服务简单解释下:

具体操作步骤:

准备处理任务的 Docker 镜像。

本实验需要启动一个 EC2 实例来制作 Docker 镜像。 在中国区域实验时选择宁夏区域, 启动 EC2 环境时选取 Amazon Linux 2 类型的 AMI,如下图所示。 实例类型选择 t2.micro。

ami

[高能]一大波命令行来袭

ssh -i yourkey.pem ec2-user@your-ec2-public-ip

aws configure

sudo yum update -y
sudo yum install docker

sudo service docker start

wget https://github.com/awslabs/aws-batch-helpers/archive/master.zip
unzip master.zip

vim aws-batch-helpers-master/fetch-and-run/Dockerfile

文件内容如下所示:

FROM amazonlinux:latest   # 指定操作系统镜像
RUN yum -y install unzip aws-cli  # 安装aws 命令行工具
ADD fetch_and_run.sh /usr/local/bin/fetch_and_run.sh  # 把 fetch_and_run.sh 脚本拷贝至/usr/local/bin 路径下
WORKDIR /tmp # 指定工作目录
USER nobody  # 指定user
ENTRYPOINT ["/usr/local/bin/fetch_and_run.sh"]  # 指定容器运行的入口是调用/usr/local/bin/fetch_and_run.sh 脚本

vim aws-batch-helpers-master/fetch-and-run/fetch_and_run.sh

将 fetch_and_run_script()函数的第一句改成如下并保存退出编辑(修改中国区的S3地址):

aws s3 cp "${BATCH_FILE_S3_URL}" - > "${TMPFILE}" --endpoint "https://s3.cn-northwest-1.amazonaws.com.cn" || error_exit "Failed to download S3 script."

sudo usermod -a -G docker ec2-user

Docker 镜像传入 ECR 存储库

ecrbuild

ecr

ssh -i yourkey.pem ec2-user@your-ec2-public-ip
cd aws-batch-helpers-master/fetch-and-run
$(aws ecr get-login --no-include-email --region cn-northwest-1)
docker build -t awsbatch/fetch_and_run .

正常编译完成的输出信息如下:

Sending build context to Docker daemon 373.8 kB
Step 1/6 : FROM amazonlinux:latest
latest: Pulling from library/amazonlinux
c9141092a50d: Pull complete
Digest: sha256:2010c88ac1****…
Status: Downloaded newer image for amazonlinux:latest
---> 8ae6f52035b5
Step 2/6 : RUN yum -y install unzip aws-cli
---> Running in e49cba995ea6
Loaded plugins: ovl, priorities
Resolving Dependencies
--> Running transaction check
---> Package aws-cli.noarch 0:1.11.29-1.45.amzn1 will be installed
<< removed for brevity >>
Complete!

输入命令验证下镜像信息:

$ docker images
REPOSITORY  TAG IMAGE ID  CREATED
awsbatch/fetch_and_run  latest  9aa226c28efc  19 seconds ago
amazonlinux latest  8ae6f52035b5  5 weeks ago

继续输入以下命令给镜像添加标签:

docker tag awsbatch/fetch_and_run:latest 112233445566.dkr.ecr.cn-northwest-1.amazonaws.com/awsbatch/fetch_and_run:latest

执行 docker 镜像推送命令:

docker push 112233445566.dkr.ecr.cn-northwest-1.amazonaws.com/awsbatch/fetch_and_run:latest

待提示信息中 pushed 完成后可在 ECR 存储库中查看到镜像的信息,拷贝记录下该 URI名称。

images

上传作业脚本至 S3 存储并配置对应 IAM 权限, 拷贝以下代码存入本地文件命名为 myjob.sh。

#!/bin/bash
date
echo "Args: $@"
env
echo "This is my simple test job!."
echo "jobId: $AWS_BATCH_JOB_ID"
echo "jobQueue: $AWS_BATCH_JQ_NAME"
echo "computeEnvironment: $AWS_BATCH_CE_NAME"
sleep $1
date
echo "bye bye!!"

输入以下命令上传脚本至已事先创建好的 S3 存储桶。

aws s3 cp myjob.sh s3://testbucket/myjob.sh

由于镜像 fetch_and_run 作为 Batch 作业执行过程中要访问 S3 下载任务脚本,所以需要给 Batch 中的容器配置一个能读取 S3 存储桶的 IAM 权限角色。控制台搜索“IAM”并打开IAM,分别点击角色->创建角色。受信任实体选“AWS 产品”,并在服务中选择 “Elastic Container Service”:

iam

然后在随之出现的使用案例列表里,选择“Elastic Container Service Task”一项,点击下一步权限。

policy

在 Attach 权限策略页中的搜索栏中输入 AmazonS3ReadOnlyAccess 搜索并选取该权限策略,点击下一步标签填写(可选)标签内容,再点击下一步审核,在角色名称中填入 batchJobRole 后,点击创建角色按钮。

Batch 服务的作业配置。

Batch 的作业配置依次包括:

batch1

batch2

batch3

提交 Batch 任务并查看执行状态。(是时候展现真正的实力了)

在 Batch 控制台选择 Jobs 页面点击“提交任务”按钮。 Jobname 栏输入指定的 Job 名称, Job definition 中选择前一步设置好的作业定义defFetchRun:1(冒号后是版本号), Job queue 一栏选取前一步设好的作业队列名称queFetchRun。 Command 命令里面输入“myjob.sh 60”,设置好的信息如下图所示。

run

在环境变量一栏中添加环境变量的键值对:

Key=BATCH_FILE_TYPE, Value=script
Key=BATCH_FILE_S3_URL, Value=s3://testbucket/myjob.sh

runme

任务提交后在 Batch 控制台可以查看其最新状态,任务会经历 submitted、 pending、runnable、 starting、 running 各个状态。任务执行完成后会在 succeeded 一页下,如下图所示:

done

点击作业 ID 链接的详情页面中可点击“CloudWatch 日志” 的链接查看详细日志信息,其中就可以看到 myjob.sh 中 echo 输出的信息内容。如下图所示:

log

(可选)如果需要批量提交更多数量的作业任务,可在提交任务参数页面中的Job Type 中选择 Array 类型并填入一个测试数量值,同样可在 CloudWatch 中查看批量任务执行的情况,并在 EC2 的资源列表里可以看对应的实例扩展情况。

回收资源

动手实验完成后记得回收释放相应资源,释放的资源包括: