我有一个程序执行几千蒙特卡罗模拟来预测结果; 我不能说他们真正预测的是什么,所以我将使用"无可争议的圣诞老人存在"中的另一个例子,因为这些算法的内容与问题无关.我想知道Monopoly董事会上每个广场的访问频率(预测哪些是最好的购买物业).为此,我模拟了数千个游戏并整理结果.我目前的实现是一个独立的C#应用程序,但我想将它移动到云端,以便我可以将其作为服务提供 - 每个用户都可以通过提交每个骰子的边数来获得个性化结果.
当前的实现也非常慢 - 它非常简单,因为每个模拟都是完全独立的,但我只有8个内核,因此在我的本地机器上完成大约50000个单独模拟的完整预测需要20分钟.
计划是让AWS lambda函数运行一个(或几个)模拟然后整理 - 基本上mapreduce它.我查看了使用AWS EMR(弹性MapReduce),但这对于我想要的太大了,旋转实例单独运行计算似乎比单独的整个计算花费更长时间(这对于多个小时离线分析,但我希望通过Web请求进行低延迟响应).
我认为理想的是:
Lambda 0 - 触发许多其他lambda函数,每个函数执行一小部分计算.Lambda 1..N - 并行进行多次模拟(数字不是常数).Lambda N + 1 - 整理所有结果并返回答案.
这里有一个lambda mapreduce框架:
https://github.com/awslabs/lambda-refarch-mapreduce
但它似乎有一个主要缺点 - 每次地图阶段完成时,它会将结果写入S3(我可以将其作为临时使用)然后通过事件触发新的lambda.触发lambda看看是否所有结果都已写入存储.如果不是,则结束,如果是,则执行还原步骤.这似乎是一个公平的解决方案,但我只是稍微关注a)当两个结果汇总在一起时,两个减速器都能计算结果?并且b)看起来好像它已经解雇了很多只是决定不运行的lambdas(我知道它们运行起来很便宜,但是每次模拟的数量加倍到两次 - 计算并且可能会减少 - 显然会使成本增加一倍).有没有办法在100个文件写入文件夹而不是每个文件后写入S3结果?
我看了一下使用步骤函数,但是我不确定如何在一步中并行激发多个lambdas并让它们在状态机转换之前全部返回.然而,步骤函数对于最终的皱纹是有用的 - 我想在API后面隐藏所有这些.
根据我的阅读,API可以触发lambda并返回该lambda的结果,但我不希望被调用的lambda是返回结果的lambda.当您从API调用步骤函数时,不是API调用返回最后一个状态的结果.
总之,我想:
API请求 - >并行计算结果 - > API响应
中间的那一点我不清楚该怎么做,同时能够将所有结果作为对原始请求的响应返回 - 或者单独使用它们很容易.
我可以看到几个选项:
使用现在由AWS API网关本机支持的步骤函数,并在一个状态中调用多个lambda,等待它们在转换之前返回.
使用AWS EMR,但以某种方式保持配置的实例始终处于活动状态以避免配置时间开销.这显然否定了Lambda的可扩展性并且更加昂贵.
使用mapreduce框架或类似的东西,找到一种方法来响应来自不同lambda的传入请求到API请求最初调用的请求.理想情况下还要减少此处涉及的S3事件的数量,但这不是优先事项.
立即响应来自第一个lambda的原始API请求,然后在计算完成后将更多数据推送给用户(它们应该只需要大约30秒的并行性,并且域是这样的,这是可以接受的等待时间响应,甚至HTTP响应).
我怀疑它会对解决方案产生任何影响,因为它只是中间位的扩展,而不是根本的改变,但真正的计算是迭代的,所以会是:
请求 - > Mapreduce - > Mapreduce - > ... - >响应
只要我知道如何在一个请求中链接一组lambda函数,链接更多应该更多相同(我希望).
谢谢.
PS我无法创建它们,标签aws-emr也不aws-elastic-mapreduce存在.
amazon-web-services aws-lambda aws-api-gateway aws-step-functions
我在步进函数流中的状态返回state/task returned a result with a size exceeding the maximum number of characters service limit.. 在步进函数文档中,输入/输出字符的限制是32,768 characters. 检查我的结果数据的总字符数是否低于限制。是否还有其他情况会引发该错误?谢谢!
我有三个 python 脚本 、1.py、2.py和3.py,每个脚本都有 3 个要传递的运行时参数。
所有三个 python 程序都是相互独立的。所有 3 个可能会以批量方式按顺序运行,或者可能会发生任意两个运行,具体取决于某些配置。
手动方法:
自动化的方式是通过 lambda 触发上述过程,并使用某种服务组合来复制上述过程。
在 AWS 中实现此功能的最佳方法是什么?
python amazon-web-services aws-lambda aws-step-functions aws-batch
AWS Step Functions 可以使用Step Functions Local Docker在本地 Docker 环境中运行。但是,需要使用基于 JSON 的Amazon States Language定义步骤函数。如果您的 AWS 基础设施(Step Functions 加 lambda)是使用 AWS CDK/CloudFormation 定义的,那么这根本不方便。
\n有没有办法从 CDK 或 CloudFormation 输出创建状态机的 Amazon States Language 定义,以便可以在本地运行步骤函数?
\n目前,我的开发周期需要 30 分钟才能在 AWS 中构建/部署/运行基于 Lambda 的步骤函数,以便对其进行测试,并且肯定有比这更好/更快的测试方法。
\namazon-web-services aws-cloudformation aws-step-functions aws-cdk
我正在使用 EventBridge 来触发步骤函数。CloudFormation 模板中的 EventBridge 规则如下所示:
JobStepFunctionTrigger:
Type: AWS::Events::Rule
Properties:
EventBusName: !GetAtt JobTaskEventBus.Name
Name: !Sub ${DeploymentName}-new-job-created
State: ENABLED
EventPattern:
source:
- !Sub ${DeploymentName}-my-service
detail-type:
- 'NEW_JOB'
Targets:
- Arn: !GetAtt JobOrchestrator.Arn
Id: !GetAtt JobOrchestrator.Name
RoleArn: !Ref MyAwesomeRole
Run Code Online (Sandbox Code Playgroud)
不幸的是,在这种情况下,步骤函数“执行名称”是随机生成的,因此很难将特定事件链接到特定步骤函数执行。在我的事件中,我有一个属性$.detail.id,$.detail.state我希望能够使用这些属性,以格式发出步骤函数执行名称${detail.id}_${detail.state}_someRandomValueToGuaranteeNameUniqueness,但阅读有关规则目标的文档,我不知道这是如何工作的...
amazon-web-services aws-cloudformation aws-step-functions aws-event-bridge
在微服务之间协调任务的更好选择是什么?
例如,如果我有一个处理客户信息并需要通知其他微服务的微服务,那么在微服务之间创建工作流(AWS Steps)或使用SNS是否更好?
我认为AWS Steps将耦合我的lambda函数,而SNS不会.
对于在step函数中执行的lambda,我有点期望我可以从lambda上下文中获取当前步骤的名称,但它似乎并不那么简单.
有没有办法获得在步骤函数中执行的lambda中当前步骤的名称?
我有一个AWS Step Function State格式如下:
"MyState": {
"Type": "Task",
"Resource": "<MyLambdaARN>",
"ResultPath": "$.value1"
"Next": "NextState"
}
Run Code Online (Sandbox Code Playgroud)
我想添加第二个值,但无法找到任何地方.AWS示例均未显示要添加到输出的多个ResultPath值.
我会在它们之间加一个逗号吗?
"MyState": {
"Type": "Task",
"Resource": "<MyLambdaARN>",
"ResultPath": "$.value1, $.value2"
"Next": "NextState"
}
Run Code Online (Sandbox Code Playgroud)
或者有更好的格式化方法吗?
我试图在循环中调用步骤函数中的几个步骤,但我无法弄清楚我需要如何执行此操作。这是我现在所拥有的:我需要添加另一个 lambda 函数(GetReviews),然后它将循环调用 CreateReview、SendNotification。我该怎么做呢?我指的是“使用 Lambda 迭代循环”文档,它表明这是可能的。
阶跃函数定义:
{
"Comment": "Scheduling Engine",
"StartAt": "CreateReview",
"States": {
"CreateReview": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-west-2:.........:function:CreateReview",
"Next": "CreateNotification",
"InputPath": "$",
"ResultPath": "$.CreateReviewResult",
"OutputPath": "$"
},
"CreateNotification": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-west-2:.........:function:CreateNotification",
"InputPath": "$",
"ResultPath": "$.CreateNotificationResult",
"OutputPath": "$",
"End": true
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在编写一个 AWS 步骤函数,对于其中一个步骤,我希望调用一个接受数组作为输入之一的 lambda。但是,如果我尝试将 JsonPath 传入数组,则会得到
The value for the field 'arrayField.$' must be a STRING that contains a JSONPath but was an ARRAY
Run Code Online (Sandbox Code Playgroud)
我的步骤函数定义:
{
"StartAt": "First",
"States": {
"First": {
"Type": "Pass",
"Parameters": {
"type": "person"
},
"ResultPath": "$.output",
"Next": "Second"
},
"Second": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:<aws_id>:function:MyFunction",
"Parameters": {
"regularParameter": "some string",
"arrayParameter.$": ["$.output.type"]
},
"Next": "Succeed"
},
"Succeed": {
"Type": "Succeed"
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何在数组中使用 jsonPath?