1 为了提交一个任务,需要先创建调度策略、计算环境、任务定义、任务队列
1 创建任务策略
添加共享标识
2 创建计算环境
创建vpc等基本信息完成创建
3 创建任务队列,在基本信息里选择刚创建的调度策略和计算环境
4 创建任务定义
添加运行作业时需要执行的命令
5 提交执行任务
在基本信息中添加“作业定义”和“任务队列”, 共享标识填写上面常见调度策略使用的“标识符”
在下一页上"调度优先级" 填写数值
进入提交的任务里,在里面找到日志流位置
关于数组大小的使用,填上相应的数值,就可以有并行的n个任务
Bash 上添加下面打印的脚本
["bash", "-c", "JOB_ID=$AWS_BATCH_JOB_ID; ARRAY_INDEX=$AWS_BATCH_JOB_ARRAY_INDEX; echo \"当前作业 ID: $JOB_ID\"; echo \"数组索引: $ARRAY_INDEX\""]
下面介绍使用自定义镜像跑Batch
自定义作业
实现定时任务调用batch, batch启动fragate拉取 ECR镜像启动执行表数据更新task
RDS 创建一个数据库
创建过程略
构建自定义镜像
test_batch_1.py
import pymysql
import argparse
def increment_money(table_name, increment_value):
# 数据库连接配置
host = 'test-batch-db.crmi8wgo8li3.ap-northeast-2.rds.amazonaws.com'
port = 3306
user = 'deng' # 替换为你的用户名
password = 'dly!19892' # 替换为你的密码
database = 'batch_schema' # 替换为你的数据库名称
# 连接到数据库
connection = pymysql.connect(
host=host,
port=port,
user=user,
password=password,
database=database
)
try:
with connection.cursor() as cursor:
# 构建 SQL 语句
sql = f"UPDATE {table_name} SET money = money + %s"
cursor.execute(sql, (increment_value,))
# 提交更改
connection.commit()
print(f"成功将 {increment_value} 加到 {table_name} 表的 money 字段")
except Exception as e:
print(f"发生错误: {e}")
finally:
connection.close()
# 使用示例
#increment_money('batch_info', 1) # 替换为你的表名和增加的值
if __name__ == "__main__":
# 创建参数解析器
parser = argparse.ArgumentParser(description='Increment money field in a specified table.')
parser.add_argument('table_name', type=str, help='The name of the table to update')
parser.add_argument('increment_value', type=float, help='The value to increment the money field by')
# 解析命令行参数
args = parser.parse_args()
# 调用函数
increment_money(args.table_name, args.increment_value)
Dockerfile
# 使用官方 Python 3.10 运行时作为父镜像
FROM python:3.10
# 设置工作目录
WORKDIR /app
# 复制当前目录内容到容器中
COPY . .
# 安装依赖
RUN pip3 install --no-cache-dir --no-index ./packages/* && rm -rf ./packages
# 设置容器启动时的默认命令
ENTRYPOINT ["sleep", "infinity"]
ECR上查看推送命令
分别执行
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin xxx.dkr.ecr.ap-northeast-2.amazonaws.com
docker build -t test/batch .
docker tag test/batch:latest xxx.dkr.ecr.ap-northeast-2.amazonaws.com/test/batch:latest
docker push xxx.dkr.ecr.ap-northeast-2.amazonaws.com/test/batch:latest
创建batch job
配置作业和编排类型
创建计算环境
创建任务队列
创建任务定义
镜像填写
xxxx.dkr.ecr.ap-northeast-2.amazonaws.com/test/batch:latest
命令填写
["python3", "test_batch_0.py", "batch_info", "1.0"]
创建完毕后,在“任务”上测试batch job
右上角“提交新作业”
选择“作业定义”,“作业队列”
覆盖项是针对任务定义里的配置而言,填写即代表要覆盖任务定义
点下一步,到达审核
点击“提交”
从starting转向runnable
Runnable 表示可运行
从runnable转向starting
查看作业如果报这个错误
ResourceInitializationError: unable to pull secrets or registry auth: The task cannot pull registry auth from Amazon ECR: There is a connection issue between the task and Amazon ECR. Check your task network configuration. RequestError: send request failed caused by: Post "https://api.ecr.ap-northeast-2.amazonaws.com/": dial tcp 54.180.184.245:443: i/o timeout
查看这个角色的权限
给角色添加内联策略
选择Elastic Container Registry
创建endpoint 端点
com.amazonaws.ap-northeast-2.ecr.api
com.amazonaws.ap-northeast-2.ecr.dkr
com.amazonaws.ap-northeast-2.logs
创建完毕后再次运行,查看日志
再次运行job执行作业后数据库 money字段+1
库里有两张表,利用ARRAY_INDEX 去执行两个task
job其他保持不变
修改cmd
[
"sh",
"-c",
"ARRAY_INDEX=$AWS_BATCH_JOB_ARRAY_INDEX; python3 test_batch_1.py batch_info_$ARRAY_INDEX 1.0"
]
跑起来以后
查看两个task的日志
使用Amazon EventBridge定期执行Batch
创建EventBridge 规则
输入cron表达式因为是UTC时间所以你需要自己转换成你本地的时间
复制队列 arn 编号
把队列arn 贴到目标表单的下面位置
点击保存