文档
- Compute Resource Memory Management
- Running Workload on AWS Batch
aws batch 是云上的批处理平台,通过托管环境减少了管理成本。包括配置大量计算资源,更具任务负载优化资源分配。
基本概念
-
job(任务),提交到batch的工作单元,可以是shell脚本,二进制或docker容器。job之间可以引用和依赖
-
job definition(任务定义),类似于ecs中的任务定义,主要是对负载的资源,环境变量,文件系统等进行配置。
-
job queues,容纳作业的队列,通过队列将任务和计算环境关联。可以指定优先级
-
compute environment,托管的计算环境,可以指定平台类型,计算资源数量等
计算环境
选择和配置
batch计算环境实际上就是在配置ecs环境(不考虑eks的情况下),可以将ec2类型的计算环境视作ecs实例,同样使用ecs优化的ami,同样需要访问ecs服务。
计算环境有以下分类
- 托管计算环境
- 非托管计算环境,需要保证ami符合ecs规范
对于ec2类型的自定义计算环境支持,有两种方式
-
自定义ami,需要符合ecs规范
-
启动模板支持,避免对ami进行定制
https://docs.amazonaws.cn/en_us/batch/latest/userguide/launch-templates.html
计算环境的选择
如果需要访问特定实例配置(特定处理器、GPU 或基础架构)或非常大规模的工作负载,则应该在 EC2 中运行作业。
Fargate 作业在初始扩展停止工作的情况下启动更快,因为不需要等待 EC2 实例启动。然而,对于较大的工作负载,EC2 实例可能更快,因为 Batch 重用实例和容器映像来运行后续作业。
如果有以下情景推荐使用ec2计算环境
- More than four vCPUs
- More than 30 gibibytes (GiB) of memory
- A GPU
- An Arm-based Amazon Web Services Graviton CPU
- A custom Amazon Machine Image (AMI)
- Any of the linuxParameters parameters
初次使用batch会创建一个service role,这个角色代表batch调用其他aws service
Amazon Batch uses a service-linked role that includes all the permissions Batch requires to call other Amazon Web Services services on your behalf. If you do not have a Batch service-linked role, we will create it for you.
最少vcpu数量,最小vcpu为0则无任务时无实例配置
By keeping this set to 0 you will not have instance time wasted when there is no work to be run. If you set this above zero you will maintain that number of vCPUs at all times.
实例类型,默认为Optimal类型,即CRM实例
Optimal chooses the best fit of M4, C4, and R4 instance types available in the region. Jobs define their vCPU and memory requirements at submission and that information is used to match the job with the most appropriately sized instance.
分配策略
Allocation Strategies allow you to choose how Batch launches instances on your behalf. We recommend Best Fit Progressive for On-Demand CEs and Spot Capacity Optimized for Spot CEs
网络要求,batch计算环境必须和ecs终端节点通信
计算环境更新
计算环境的更新有一定限制
https://docs.amazonaws.cn/en_us/batch/latest/userguide/updating-compute-environments.html
- fargate环境的更新,只能更新安全组和子网
- ec2环境的更新,可能会导致实例的替换
- 缩放更新和基础设施更新的区别
- 对于amiid的设置,由于有优先级顺序( first the launch template, then the
imageId
setting, and finally theimageIdOverride
setting.),需要额外关注
计算实例的具体配置
创建一个托管ec2的计算环境,创建计算队列关联这个计算环境,保持默认调度策略为FIFO,提交测试任务查看启动的实例。实例的userdata如下
- 配置特定的环境变量
- 启动实例加入ecs集群
Content-Type: multipart/mixed; boundary="==BOUNDARY=="
MIME-Version: 1.0
--==BOUNDARY==
MIME-Version: 1.0
Content-Type: text/x-shellscript; charset="us-ascii"
#!/bin/bash
echo ECS_CLUSTER=AWSBatch-first-ec2-environment-9378b7bb-cecc-378f-8eeb-e99e9a80dee7>>/etc/ecs/ecs.config
echo ECS_DISABLE_IMAGE_CLEANUP=false>>/etc/ecs/ecs.config
echo ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION=2m>>/etc/ecs/ecs.config
echo ECS_IMAGE_CLEANUP_INTERVAL=10m>>/etc/ecs/ecs.config
echo ECS_IMAGE_MINIMUM_CLEANUP_AGE=10m>>/etc/ecs/ecs.config
echo ECS_NUM_IMAGES_DELETE_PER_CYCLE=5>>/etc/ecs/ecs.config
echo ECS_RESERVED_MEMORY=32>>/etc/ecs/ecs.config
echo ECS_INSTANCE_ATTRIBUTES={\"com.amazonaws.batch.compute-environment-revision\":\"0\"}>>/etc/ecs/ecs.config
--==BOUNDARY==
MIME-Version: 1.0
Content-Type: text/x-shellscript; charset="us-ascii"
#!/bin/bash
echo ECS_CLUSTER=AWSBatch-first-ec2-environment-9378b7bb-cecc-378f-8eeb-e99e9a80dee7>>/etc/ecs/ecs.config
--==BOUNDARY==--
计算环境的资源
batch为ecs-agent和其他关键系统进程保留了32 MiB 的内存。此内存不可用于作业分配
https://docs.amazonaws.cn/en_us/batch/latest/userguide/memory-management.html
eks环境的资源预留在启动脚本里有所体现
https://docs.amazonaws.cn/en_us/batch/latest/userguide/memory-cpu-batch-eks.html
相关错误
任务始终出于runnable状态,表示当前没有资源可用,ecs实例未能成功加入集群。手动登录到ec2实例上,查看ecs-agent日志
说明计算环境的实例角色配置错误,需要设置为ecs实例角色
https://docs.amazonaws.cn/zh_cn/AmazonECS/latest/developerguide/instance_IAM_role.html
level=error time=2023-03-01T05:23:40Z msg="Error registering container instance" error="AccessDeniedException: User: arn:aws-cn:sts::xxxxxxxxxx:assumed-role/AmazonSSMRoleForInstancesQuickSetup/i-0696aa64beb712118 is not authorized to perform: ecs:RegisterContainerInstance on resource: arn:aws-cn:ecs:cn-north-1:xxxxxxxxxx:cluster/AWSBatch-first-ec2-environment-9378b7bb-cecc-378f-8eeb-e99e9a80dee7 because no identity-based policy allows the ecs:RegisterContainerInstance action"
任务配置
job role和task role的区别,batch的任务角色实际上就是ecs任务的角色,对于fargate任务类型是必须的
note:A job role is required for jobs that runs on Fargate resources.
任务状态
-
SUBMITTED,任务提交但未调度,调度器判断依赖,存在依赖进入pending状态
-
PENDING,存在对其他任务的依赖,满足依赖关系后进入runnable状态
-
RUNNABLE,等待计算环境有可用计算资源
任务始终处于runnable的错误排查
-
STARTING,任务正在启动,下载image运行任务后进入running状态
-
RUNNING,任务运行,失败是根据重试策略重试并进入runnable状态
任务重试的情形:容器退出非0退出码,实例故障,aws服务故障
-
SUCCEEDED,任务成功结束,至少持续7天
-
FAILED,任务失败结束,至少持续7天
注意:计算环境中运行 GPU 任务的所有实例类型都必须来自
p2``p3
、p4``g3
、g3s
、g4
、或g5
实例系列。如果不这样做,GPU 作业可能会停留在RUNNABLE
状态中
任务超时时,容器会收到 SIGTERM
信号,以便为应用程序提供正常关闭的机会。如果容器在 30 秒后仍在运行,则会发送 SIGKILL
信号以强制关闭容器。batch任务没有最大超时时间的限制,但是fargate任务运行时间超过14天可能不可用。
数组和多节点任务
数组任务共享参数(如作业定义、vCPU 和内存),任务分布在多个主机上并行运行。
https://docs.amazonaws.cn/batch/latest/userguide/array_jobs.html
batch可以在多节点运行 parallel 任务,但是有诸多限制
支持基于 IP 的节点间通信的框架兼容。示例包括 Apache MXNet TensorFlow、Caffe2 或消息传递接口 (MPI)。每个多节点并行作业都包含一个主节点,这是最先启动的节点。主节点启动之后,子节点会启动并开始运行。只有当主节点退出时,任务才会完成。然后所有子节点都将停止
创建任务定义
任务定义类似于ecs中的任务定义,指定了任务的一些属性(image,内存和cpu,运行命令,数据卷,角色等),任务启动时可以对任务定义中的一些参数进行修改
任务定义的参数说明
任务定义的完整json模板
任务定义同样需要区分计算环境,并且分为单节点和多节点任务定义
batch任务定义几乎能够控制容器的所有可用参数
- 基本配置,计算平台(ec2,fargate,eks),超时设置,调度优先级,重试策略
- 容器配置,容器image,入口指令,角色和执行角色,cpu和内存
- 系统配置,用户名,文件系统,共享内存,交换内存,交换行为控制,设备卷映射,日志驱动
对于ec2类型的任务,支持的配置相对更多,例如日志驱动的数量上
总的来说batch的任务定义和ecs任务定义大同小异,区别在于参数的灵活性和多节点的支持
batch任务定义允许使用参数对任务定义动态配置,在任务定义中指定占位符,然后通过参数进行替换即可
https://docs.amazonaws.cn/en_us/batch/latest/userguide/example-job-definitions.html#example-use-parameters
多节点并行任务不支持fargate,相对单节点任务定义的区别如下
-
需要指定node数量和主节点索引值
-
增加了一项叫做node range的配置
使用节点索引值的节点范围。范围 0:3 表示索引值为 0 到 3 的节点。如果省略起始范围值(:n),则将使用 0 来开始范围。如果省略结束范围值(n:),则将使用可能的最高节点索引来结束范围。
任务队列
任务提交后存在在任务队列中,并由batch调度程序调度到计算环境中运行
队列可以设置优先级,调度程序会根据队列的优先级,选择高优先级队列中的任务执行
任务的调度
batch任务调度器,决定了任务的运行时间,地点以及运行的方式
队列的默认调度策略为FIFO,如果不设置调度策略则创建后无法再次添加,添加调度策略后可以替换但不能删除
调度策略的共享标识符设置,能够对工作负载进行区分
Amazon Batch 调度程序使用(T * weightFactor)公式跟踪每个公平共享标识符的使用情况,其中 T 是 vCPU 随时间的使用情况。调度程序从共享标识符中选择使用率最低的作业
调度策略可以手动创建和定制,参数如下
"fairsharePolicy": {
"computeReservation": number,
"shareDecaySeconds": number,
"shareDistribution": [
{
"shareIdentifier": "string",
"weightFactor": number
}
]
}
故障排查的参考
- https://aws.amazon.com/cn/premiumsupport/knowledge-center/batch-docker-timeout-error/
- https://docs.aws.amazon.com/zh_cn/batch/latest/userguide/troubleshooting.html