我写了一个从s3存储桶触发的lambda,以解压缩zip文件并处理其中的文本文档。由于lambda内存的限制,我需要将流程移至类似AWS Batch的位置。如果我错了,请纠正我,但我的工作流程应如下所示。
我相信我需要编写一个lambda来将s3存储桶的位置放在亚马逊SQS上,因为AWS批处理可以读取该位置并进行所有解压缩/数据处理,因为它们的内存更大。
这是我当前的lambda,它接收由s3存储桶触发的事件,检查它是否是一个zip文件,然后将该s3键的名称推送到SQS。我应该告诉AWS Batch在我的lambda中开始读取队列吗?一般而言,我对AWS完全陌生,不确定从这里开始。
public class dockerEventHandler implements RequestHandler<S3Event, String> {
private static BigData app = new BigData();
private static DomainOfConstants CONST = new DomainOfConstants();
private static Logger log = Logger.getLogger(S3EventProcessorUnzip.class);
private static AmazonSQS SQS;
private static CreateQueueRequest createQueueRequest;
private static Matcher matcher;
private static String srcBucket, srcKey, extension, myQueueUrl;
@Override
public String handleRequest(S3Event s3Event, Context context)
{
try {
for (S3EventNotificationRecord record : s3Event.getRecords())
{
srcBucket = record.getS3().getBucket().getName();
srcKey = record.getS3().getObject().getKey().replace('+', ' ');
srcKey = URLDecoder.decode(srcKey, "UTF-8"); …Run Code Online (Sandbox Code Playgroud) 嗨,我已经安排了一个 Cloudwatch规则,以便通过将 AWS Batch 作为目标在每周三 GTM 14.15 运行,它总是返回FailedInvocation。我看到来自关联指标的 FailedInvocation 事件
但是没有关于错误的日志,我无法理解这个问题。
我遵循了本教程:https : //docs.aws.amazon.com/batch/latest/userguide/batch-cwe-target.html 我从几个小时就被困在这里有什么建议吗?
AWS 批处理目标配置如下:
与目标关联的角色具有以下策略:
arn:aws:iam::aws:policy/service-role/AWSBatchServiceEventTargetRole
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"batch:SubmitJob"
],
"Resource": "*"
}
]
}
Run Code Online (Sandbox Code Playgroud)arn:aws:iam::216314997889:role/awsInvokeActionOnEc2
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cloudwatch:Describe*",
"ec2:Describe*",
"ec2:RebootInstances",
"ec2:StopInstances",
"ec2:TerminateInstances"
],
"Resource": "*"
}
]
}
Run Code Online (Sandbox Code Playgroud)和信任关系
{
"Version": "2012-10-17",
"Statement": …Run Code Online (Sandbox Code Playgroud)amazon-web-services amazon-cloudwatch amazon-cloudwatch-metrics aws-batch
我正在尝试将我的弹性文件系统(EFS)安装在我的docker容器中,以便它可以与AWS批处理一起使用.这是我做的:
创建针对弹性容器服务(ECS)进行了优化的新AMI.我在这里遵循了这个指南,以确保它有ECS.我还将mount挂载到/etc/fstab文件中,并在重启后验证我的EFS是否正在挂载(/ mnt/efs).
用我的新AMI测试了EC2实例并验证我可以拉出docker容器并通过它传递我的挂载点
docker run --volume /mnt/efs:/home/efs -it mycontainer:latest
以交互方式运行docker镜像会在efs中显示我的数据
使用我的新AMI 设置新的计算环境,该AMI在引导时安装EFS.
创建JOB定义文件:
{
"jobDefinitionName": "MyJobDEF",
"jobDefinitionArn": "arn:aws:batch:us-west-2:#######:job-definition/Submit:8",
"revision": 8,
"status": "ACTIVE",
"type": "container",
"parameters": {},
"retryStrategy": {
"attempts": 1
},
"containerProperties": {
"image": "########.ecr.us-west-2.amazonaws.com/mycontainer",
"vcpus": 1,
"memory": 100,
"command": [
"ls",
"/home/efs",
],
"volumes": [
{
"host": {
"sourcePath": "/mnt/efs"
},
"name": "EFS"
}
],
"environment": [],
"mountPoints": [
{
"containerPath": "/home/efs",
"readOnly": false,
"sourceVolume": "EFS"
}
],
"ulimits": []
} …Run Code Online (Sandbox Code Playgroud)我有一个现有的 AWS Steps 编排,它通过 lambdas 执行 AWS Batch 作业。但是,AWS 最近添加了从一个步骤直接调用其他服务(如 AWS Batch)的功能。我很想使用这个新功能,但无法让它工作。
https://docs.aws.amazon.com/step-functions/latest/dg/connectors-batch.html
所以我想用来调用 Batch 的新步骤操作。
"File Copy": {
"Type": "Task",
"Resource": "arn:aws:states:::batch:submitJob.sync",
"Parameters": {
"JobName": "MyBatchJob",
"JobQueue": "MySecondaryQueue",
"ContainerOverrides.$": "$.lts_job_container_overrides",
"JobDefinition.$": "$.lts_job_job_definition",
},
"Next": "Upload Start"
}
Run Code Online (Sandbox Code Playgroud)
请注意,我正在尝试使用 $. JSONpath 语法,以便动态地通过步骤传递参数。
当给出以下输入时
"lts_job_container_overrides": {
"environment": [
{
"name": "MY_ENV_VARIABLE",
"value": "XYZ"
},
],
"command": [
"/app/file_copy.py"
]
},
"lts_job_job_definition": "MyBatchJobDefinition"
Run Code Online (Sandbox Code Playgroud)
我预计环境和命令值将传递给 AWS Batch 中的相应参数 (ContainerOverrides)。相反,AWS Steps 似乎试图将它们提升为顶级参数 - 然后抱怨它们无效。
{
"error": "States.Runtime",
"cause": "An error occurred while executing the …Run Code Online (Sandbox Code Playgroud) 在创建批处理作业时,我们可以在容器属性中提供vCPU和内存。
在 cloudwatch 中,我们可以在每个集群的Elastic Container Service下检查每个集群的内存和 CPU 使用情况。
有没有办法检查每个作业的内存和 CPU 使用率?
我正在尝试运行 100 个节点的 AWS Batch 作业,当我将计算环境设置为仅使用m4.xlarge和m5.xlarge实例时,一切正常,并且我的作业被拾取并运行。
但是,当我开始在我的计算环境中包含其他实例类型(例如 )时m5.2xlarge,作业会runnable无限期地停留在该状态。我在这些更新中更改的唯一变量是计算环境中的实例类型。
当我在计算环境中包含其他实例类型时,我不确定是什么导致无法完成这项工作。在计算环境参数的文档中,唯一的说明是:
创建计算环境时,您为计算环境选择的实例类型必须共享相同的架构。例如,您不能在同一计算环境中混合使用 x86 和 ARM 实例。
的JobDefinition是多节点:
我的计算环境最大 vCPUs 设置为10,000,始终处于VALID状态并且始终处于ENABLED。另外我的 EC2 vCPU 限制是6,000. CloudWatch 不提供任何日志,因为作业尚未启动,我不确定在这里还可以尝试什么。我也没有使用optimal实例类型的设置,因为我遇到了没有获得足够实例的问题。
我是 AWS Step Functions 和 AWS Batch 的新手。我正在尝试将 AWS Batch Job 与 Step Function 集成。AWS Batch Job 执行输出字符串值的简单 python 脚本(高级简化要求)。我需要让 python 脚本输出可用于步骤函数的下一个状态。我应该如何才能完成这个任务。AWS Batch 作业输出不包含 python 脚本的结果。相反,它包含所有与输入值相关的容器信息。
示例:AWS Batch Job 执行输出“Hello World”的 python 脚本。我需要“Hello World”可用于步骤函数的下一个状态,以执行与其关联的 lambda。
我想为AWS Batch创建一个托管计算环境,但是使用EC2用户数据来配置实例,因为这些实例被引入Batch计划在其上进行作业的ECS机群。
没关系,但是User Data脚本的目的是将大型数据文件下拉到Docker容器将引用的InstanceStore上。
在ECS中,这是可能的,但是我找不到将用户数据传递到托管批处理计算环境的方法。
最多只能指定AMI。但是,由于我们要使用Managed,因此必须使用Amazon ECS-optimized AMI。
我更喜欢使用EC2用户数据作为解决方案,因为它为我们希望执行的任何其他引导提供了切入点。但是我愿意接受其他黑客或解决方案,只要它们适用于托管计算环境。
有没有办法为AWS Batch作业(或队列)设置最长运行时间?这是大多数批处理管理器中的标准设置,可避免因任何原因挂起作业时浪费资源.
scientific-computing batch-processing amazon-web-services aws-batch
AWS Batch 文档称它基于 ECS。
那么我们为什么不直接使用ECS呢?AWS Batch 提供了哪些 ECS 所不具备的紧迫优势?
两者都提供自动缩放功能。jbos 的排队和优先级是 AWS Batch 的唯一优势吗?
aws-batch ×10
amazon-ecs ×3
docker ×2
amazon-ec2 ×1
amazon-s3 ×1
java ×1
python ×1
workflow ×1