亚马逊AWS官方博客

基于 AWS Batch 只需五步搭建一个高性能集群

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

1、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 实例进一步降低批处理作业的费用。

2、AWS Batch应用场景

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

  • 数字媒体中视觉渲染处理的场景——AWS Batch 为内容制作者和后期制作公司提供自动化内容渲染工作负载的工具,协调流程中不同步骤的执行,自动扩展渲染处理的计算核数,并减少资源调度的人工干预。AWS Batch还可利用 Spot 实例来降低渲染成本。

  • 金融服务中交易后期分析的场景——在交易日结束后需要分析一天的交易成本、执行报告和市场表现,对诸多来源的大数据集进行批量处理。AWS Batch 可实现此类工作负载的自动化,以便根据数据在第二天交易周期中做出更好的决策。

3、动手实践:利用AWS Batch搭建高性能集群

本实验利用Batch搭建一个简单抓取脚本运行的Demo,原理如下图流程所示。Batch执行的任务是以Docker容器方式运行的,容器镜像基于Amazon ECS服务来管理。实验中生成的简单镜像里包含一个辅助程序,负责从S3存储中下载名为myjob.sh的自定义任务脚本(同时也支持zip文件),由Batch负责启动EC2实例来装载容器具体执行。实验中的任务脚本会输出打印一些演示信息,在CloudWatch的Log日志记录中可以查看验证任务脚本的这些输出信息。当然您也可以根据需求自己改写或丰富myjob.sh的脚步执行内容。

整个实验的步骤一览:

  • 步骤1 准备处理任务的Docker镜像。
  • 步骤2 Docker镜像传入ECR存储库。
  • 步骤3 上传批作业脚本至S3存储并配置相应IAM权限。
  • 步骤4 Batch服务的作业配置。
  • 步骤5 提交Batch任务并查看执行状态。

整个动手实验时间约需45分钟,实验所需资源的花费<5元(如果有免费体验套餐花费可以更低)。动手前请确认满足前提条件(操作步骤详见参考链接):

  • 具有一个AWS中国区域帐号(或Global帐号)。
  • 新建了足够权限的IAM User并记录了访问密钥(AK)和秘密密钥(SK)。
  • 掌握Amazon EC2启动、SSH登录EC2、创建S3存储桶的基本操作。

步骤 1:准备处理任务的Docker镜像

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

EC2就绪后通过SSH方式登录:

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

文件内容如下所示,其中FORM语句是拉取最新的amazonlinux版本,ADD语句把fetch_and_run.sh脚本拷贝至/usr/local/bin路径下,ENTRYPOINT语句指定容器运行的入口是调用/usr/local/bin/fetch_and_run.sh脚本。

FROM amazonlinux:latest

RUN yum -y install unzip aws-cli

ADD fetch_and_run.sh /usr/local/bin/fetch_and_run.sh

WORKDIR /tmp

USER nobody

ENTRYPOINT ["/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()函数的第一句改成如下并保存退出编辑:

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

把ec2-user加到docker组里(免得后续每次docker命令前都要加sudo):

sudo usermod -a -G docker ec2-user

执行完退出SSH。

步骤2: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

逐个执行上述“查看推送命令”图中的四条命令:

$(aws ecr get-login --no-include-email --region cn-northwest-1)

编译docker镜像文件(命令行最后的“.”点号不要忘输入)

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

可查看到本地镜像库的列表信息如下图所示:

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

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名称。

步骤 3:上传作业脚本至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控制台,分别点击角色->创建角色。受信任实体选“AWS产品”,并在服务中选择“Elastic Container Service”:

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

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

步骤 4:Batch服务的作业配置

Batch的作业配置依次包括:计算环境(Compute Environment)配置,作业队列(JobQueue)配置,作业定义(Job Definition)的配置。

计算环境配置是在Batch控制台中选择Compute Environment页点击创建。其中计算环境参数组的配置如下图,环境类型选择托管,将由Batch来负责管理实例的选择和调度。计算资源参数组可指定需要的实例类型,其中最小vCPU数填1,所需vCPU填2,最大vCPU填4,选择已有EC2密钥对,其他保持默认并点击创建。


作业队列的配置是在Batch控制台中选择Job Queue页点击创建。指定队列名称queFetchRun,Priority优先级填1,下方计算环境选择列表里选择刚创建的计算环境配置名称envFetchRun,选取后会显示其摘要信息,如下图所示。

作业定义配置是在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。全部填写完成后点击创建作业定义。

步骤 5:提交Batch任务并查看执行状态

最后一步就是提交任务了。在Batch控制台选择Jobs页面点击“提交任务”按钮。Job name栏输入指定的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中的对应日志记录删除。

4、参考文档

AWS Batch产品参考文档:

入门指南:https://docs.aws.amazon.com/zh_cn/batch/latest/userguide/Batch_GetStarted.html

用户指南:

https://docs.aws.amazon.com/zh_cn/batch/latest/userguide/what-is-batch.html

CLI命令参考:

https://docs.aws.amazon.com/zh_cn/cli/latest/reference/batch/index.html

AWS Batch动手实践参考博客:

Dougal Ballantyne’s Blog: “Creating a Simple Fetch & Run AWS Batch Job”

https://amazonaws-china.com/cn/blogs/compute/creating-a-simple-fetch-and-run-aws-batch-job/?nc1=h_ls

动手实验包的Github链接:

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

AWS中国区域帐号申请:

https://www.amazonaws.cn/signup/?sc_channel=el&sc_campaign=request_for_pilot_account&sc_geo=chna&sc_country=cn&sc_outcome=ml&sc_publisher=internal&trkCampaign=request_for_pilot_account&trk=GSRC

EC2启动与SSH登录步骤:

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/launching-instance.html

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html

创建S3存储桶:

https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/gsg/CreatingABucket.html

本篇作者

崔向徽

AWS解决方案架构师,目前负责医疗健康与生命科学行业云端应用的架构设计与技术咨询。加入AWS前从事了十余年信息系统研发,设计部署了多个HPC、SOA系统,多次获国家级科技进步奖项。

李迎峰

AWS解决方案架构师,目前负责企业应用架构设计工作,有丰富的数据库系统和企业应用系统经验。