容器!利器!批量计算AWS Batch
AWS Batch 服务近期已在 AWS 中国区域上线运行。 AWS Batch 已在全球范围内 广泛服务于基因测序、数字媒体渲染、科学研究、金融服务等高性能计算(HPC)的 业务场景中。本文通过一个只需五个步骤的动手实践来示例如何利用 AWS Batch 快速 搭建 HPC 集群, 以帮助您快速上手运用 AWS Batch 服务
-- D.C
AWS Batch 基本介绍
一句话理解:把分析流程打包成docker,批量提交到aws,不用去管开什么机器,batch会帮你搞定,跑完自动释放资源,随用随开,用完就关。
AWS Batch 让开发人员、科学家和工程师能够轻松高效地在 AWS 上运行成千上万个批 处理计算作业。 AWS Batch 可根据提交的批处理作业的卷和特定资源需求动态预置最 佳的计算资源(如 CPU 或内存优化实例)数量和类型。借助 AWS Batch,您无需安装 和管理运行您的作业所使用的批处理计算软件或服务器集群,从而使您能够专注于分 析结果和解决问题。 AWS Batch 有着丰富的功能特性,支持动态计算资源预置和扩 展,支持精细作业定义和权限控制, 支持紧密耦合型的 HPC 工作负载,可以基于优先 级来进行任务安排,具有集成的监控和日志记录。
AWS Batch 具有的优势包括:
- 全托管: AWS Batch 可为您管理所有基础设施,从而避免了预置、管理、监控和 扩展您的批处理计算作业所带来的复杂性。
- 与 AWS 原生集成: AWS Batch 已与 AWS 平台原生集成,让您能够利用 AWS 的 扩展、联网和访问管理功能。这便于您轻松运行能够安全地从 AWS 数据存储(如 Amazon S3 和 Amazon DynamoDB)中检索数据并向其写入作业的数据。
- 成本优化: AWS Batch 可根据所提交的批处理作业的数量和资源要求预置计算资 源并优化作业分配。 AWS Batch 能够将计算资源动态扩展至运行您的批处理作业所 需的任何数量,从而使您不必受固定容量集群的限制。 AWS Batch 还可利用 Spot 实例进一步降低批处理作业的费用。
应用场景(基因)
生命科学中 DNA 测序场景——生物信息学家进行基因组序列的二级分析时,利用 AWS Batch 服务来简化并加速测序分析的处理过程, 以批量处理的方式将原始 DNA 读数装配成完整基因组序列, 同时减少测序分析的数据偏差。
Let's do it 利用 AWS Batch 搭建高性能集群
你够格了么:
- 具有一个 AWS 中国区域帐号(或 Global 帐号)。
- 新建了足够权限的 IAM User 并记录了访问密钥(AK) 和秘密密钥(SK) 。
- 掌握 Amazon EC2 启动、 SSH 登录 EC2、创建 S3 存储桶的基本操作。
本实验利用 Batch 搭建一个简单抓取脚本运行的 Demo, 原理如下图流程所示。
- Batch执行的任务是以 Docker 容器方式运行的,容器镜像基于 Amazon ECS 服务来管理。
- 实验中生成的简单镜像里包含一个辅助程序,负责从 S3 存储中下载名为 myjob.sh 的自 定义任务脚本(同时也支持 zip 文件),由 Batch 负责启动 EC2 实例来装载容器具体执 行。
- 实验中的任务脚本会输出打印一些演示信息,在 CloudWatch 的 Log 日志记录中可 以查看验证任务脚本的这些输出信息。当然您也可以根据需求自己改写或丰富 myjob.sh 的脚步执行内容。
上图中几个aws服务简单解释下:
- ECR: 注册保存容器镜像的地方,打好docker之后要推到这里,统一托管。
- ECS: 帮你运行和管理容器的服务
- Batch: 根据你预设的计算资源和队列,帮你提交分析任务到docker,并调度作业队列。
- S3: 存储桶,你可以和本文一样,将代码库放在桶里,跑docker时拉过去,对于要频繁修改代码的人来说是福音,因为你不需要每次都打docker了!
- CloudWatch Log: log日志, 开发调试的时候你就知道她好了:)
- Role: aws始终把安全放在第一位,所以每个服务都有自己的角色,决定她能干什么不能干什么。
具体操作步骤:
准备处理任务的 Docker 镜像。
本实验需要启动一个 EC2 实例来制作 Docker 镜像。 在中国区域实验时选择宁夏区域, 启动 EC2 环境时选取 Amazon Linux 2 类型的 AMI,如下图所示。 实例类型选择 t2.micro。
[高能]一大波命令行来袭:
- EC2 就绪后在本地通过 SSH 方式登录(putty,xshell,gitbash...)
ssh -i yourkey.pem ec2-user@your-ec2-public-ip
- 配置 CLI 的权限,根据命令提示输入 AK 和 SK 密钥值,默认:
aws configure
- 执行一次更新并安装 docker 服务:
sudo yum update -y
sudo yum install docker
- 启动 Docker 服务:
sudo service docker start
- 下载实验包的 github 源码:
wget https://github.com/awslabs/aws-batch-helpers/archive/master.zip
unzip master.zip
- 解压进入路径后查看Dockerfile文件:
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 脚本
- 在中国区实验时需要修改一下 fetch_and_run.sh 脚本内容(Global 区域跳过此步)
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."
- 把 ec2-user 加到 docker 组里(免得后续每次 docker 命令前都要加 sudo) , 执行完退出 SSH
sudo usermod -a -G docker ec2-user
Docker 镜像传入 ECR 存储库
- 进入 ECR 控制台选择“Repositories”页,点击“创建存储库”,填写名称为 “awsbatch/fetch_and_run”后点击创建,如下图所示。
- 创建完成后,在“存储库”列表中选中“awsbatch/fetch_and_run”这一栏,点击右上角“查看推送命令”按钮,即出现如下界面,里面详细列出了推送至 ECR 的步骤。
- 重新 SSH 登录到 EC2 上并进入 fetch-and-run 路径:
ssh -i yourkey.pem ec2-user@your-ec2-public-ip
cd aws-batch-helpers-master/fetch-and-run
- 逐个执行上述第2步“查看推送命令” 图中的四条命令:
$(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名称。
上传作业脚本至 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”:
然后在随之出现的使用案例列表里,选择“Elastic Container Service Task”一项,点击下一步权限。
在 Attach 权限策略页中的搜索栏中输入 AmazonS3ReadOnlyAccess 搜索并选取该权限策略,点击下一步标签填写(可选)标签内容,再点击下一步审核,在角色名称中填入 batchJobRole 后,点击创建角色按钮。
Batch 服务的作业配置。
Batch 的作业配置依次包括:
- 计算环境(Compute Environment)配置: 在 Batch 控制台中选择 Compute Environment 页点击创建。其中计算环境参数组的配置如下图,环境类型选择托管,将由 Batch 来负责管理实例的选择和调度。计算资源参数组可指定需要的实例类型,其中最小 vCPU 数填 1,所需 vCPU 填2,最大 vCPU 填 4, 选择已有 EC2 密钥对, 其他保持默认并点击创建。
- 作业队列 (JobQueue)配置:作业队列的配置是在 Batch 控制台中选择 Job Queue 页点击创建。指定队列名称queFetchRun, Priority 优先级填 1,下方计算环境选择列表里选择刚创建的计算环境配置名称 envFetchRun,选取后会显示其摘要信息,如下图所示。
- 作业定义(Job Definition)的配置: 作业定义配置是在 Batch 控制台中选择 Job Definition 页点击创建。输入 Job 名称,例如 defFetchRun。 Job role 里选取刚创建的 IAM 角色 batchJobRole。 Environment 中的Container image 一栏填入之前创建的 Dock 镜像的 URI 名称,例如112233445566.dkr.ecr.cn-northwest-1.amazonaws.com/awsbatch/fetch_and_run。 此处Command 一栏保持为空, vCPU 填 1, Memory 填 500, Security 中的 User 栏填nobody。全部填写完成后点击创建作业定义。
提交 Batch 任务并查看执行状态。(是时候展现真正的实力了)
在 Batch 控制台选择 Jobs 页面点击“提交任务”按钮。 Jobname 栏输入指定的 Job 名称, Job definition 中选择前一步设置好的作业定义defFetchRun:1(冒号后是版本号), Job queue 一栏选取前一步设好的作业队列名称queFetchRun。 Command 命令里面输入“myjob.sh 60”,设置好的信息如下图所示。
在环境变量一栏中添加环境变量的键值对:
Key=BATCH_FILE_TYPE, Value=script
Key=BATCH_FILE_S3_URL, Value=s3://testbucket/myjob.sh
任务提交后在 Batch 控制台可以查看其最新状态,任务会经历 submitted、 pending、runnable、 starting、 running 各个状态。任务执行完成后会在 succeeded 一页下,如下图所示:
点击作业 ID 链接的详情页面中可点击“CloudWatch 日志” 的链接查看详细日志信息,其中就可以看到 myjob.sh 中 echo 输出的信息内容。如下图所示:
(可选)如果需要批量提交更多数量的作业任务,可在提交任务参数页面中的Job Type 中选择 Array 类型并填入一个测试数量值,同样可在 CloudWatch 中查看批量任务执行的情况,并在 EC2 的资源列表里可以看对应的实例扩展情况。
回收资源
动手实验完成后记得回收释放相应资源,释放的资源包括:
- 禁用并删除 Batch 服务中的作业队列和计算环境中的配置资源。
- 终止制作 Docker 镜像所用的 EC2 实例。
- 删除 ECR 存储库中的 Image 镜像。
- S3 中的任务脚本删除。
- CloudWatch 中的对应日志记录删除。