11

我有一个程序执行数千个monte-carlo模拟来预测结果;我不能说他们真的预测了什么,所以我会用另一个来自“圣诞老人无可争辩的存在”的例子,因为这些算法的内容与问题无关。我想知道垄断委员会上每个广场的访问频率(以预测哪个最好的房产是购买的)。为此,我模拟数千场比赛并整理结果。我目前的实现是一个独立的C#应用​​程序,但我想将它移动到云中,以便我可以将其作为服务提供 - 每个用户都可以通过提交每个骰子所具有的边数来获得个性化结果。如何将mapreduce操作的结果返回给AWS API请求

当前的实现也很慢 - 它是非常复杂的,因为每个模拟是完全独立的,但我只有8个核心,所以它需要20分钟的时间才能完成预测,在本地计算机上进行大约50000次单独模拟。

该计划是让AWS lambda函数运行一个(或多个)模拟,然后整理 - 基本上是mapreduce它。我着眼于使用AWS EMR(Elastic MapReduce),但是对于我想要的规模来说太大规模,旋转实例来单独运行计算似乎需要比单独计算更长的时间(这对于多核处理器来说并不重要)小时离线分析,但我希望通过网络请求进行低延迟响应)。

我看到这将是理想的:

LAMBDA 0 - 关闭触发许多其他lambda函数,各做计算的一小部分。 Lambda 1..N - 并行进行许多模拟(数字不是常数)。 Lambda N + 1 - 整理所有结果并返回答案。

有一个lambda MapReduce框架这里:

https://github.com/awslabs/lambda-refarch-mapreduce

但它似乎有一个主要的缺点 - 每一个地图阶段完成时,它把结果给S3(我很好用那作为一个临时的)然后通过一个事件触发一个新的lambda。这引发了lambda看起来是否所有的结果都写入存储了。如果没有,则结束,如果是,则执行还原步骤。这似乎是一个公平的解决方案,但我只是稍微关注a)当两个结果一起出现时的种族危害,两个减速器是否可以计算结果?而且b)似乎它正在解雇许多只是决定不运行的lambda(我知道它们运行起来很便宜,但是将每次模拟的数量加倍到两个 - 计算并可能减少 - 显然会使成本增加一倍)。在将100个文件写入文件夹而不是每个文件夹之后,有没有办法让S3结果发出?

我看着使用步进函数,但我不知道如何在一个步骤中并行触发许多lambda,并让它们在状态机转换之前全部返回。然而,步骤函数对于最终的皱纹是有用的 - 我想隐藏所有这些背后的API。

从我读过的,API可以发出一个lambda并返回该lambda的结果,但我不希望被调用的lambda是返回结果的那个。这不是在你调用API的step函数时,而是由API调用返回最后状态的结果。

总之,我想:

API请求 - >计算并行结果 - > API响应

它是在中间,我不太清楚该怎么做位,同时能够返回所有结果作为对原始请求的回应 - 无论是自己的都很容易。

有几个选项,我可以看到:

使用一个阶跃函数,它是原生的AWS API网关现在支持,并在一个状态中调用多个lambda表达式,等待他们全部转移之前返回。

使用AWS EMR,但以某种方式保持供应的实例始终有效以避免供应时间开销。这显然否定了Lambda的可扩展性,并且更昂贵。

使用mapreduce框架或类似的东西,并找到一种方法来响应来自不同lambda的传入请求,该请求最初由API请求调用。理想情况下,还可以减少此处涉及的S3事件的数量,但这不是优先事项。

立即响应来自第一个lambda的原始API请求,然后在计算完成时将更多数据推送给用户(他们应该只需要约30秒的并行性,并且该域是可以接受的等待响应的时间,甚至是HTTP响应)。

我怀疑这将使得该解决方案的任何区别,因为它仅仅是中间位,而不是根本性变化的扩张,但真正的计算是迭代的,所以应该是:

请求 - >的MapReduce - > Mapreduce - > ... - >响应

只要我知道如何在请求中链接一组lambda函数,链接更多应该只是更多相同(我希望)。

谢谢。

P.S.我无法创建它们,也没有标签aws-emraws-elastic-mapreduce

+0

对我的答案有任何意见?是100号固定? – Deepak

回答

1

有趣的情况..喜欢阅读这个问题的详细信息..基本上,我们寻找CPU负荷的负荷,但短期...应该可以很快..基本问题,如果我们真的认识到lambda是它不支持线程并且不支持异步行为。

想过它.. Lambda看起来是正确的方式..如果你接受dynamodb的帮助(不需要另一个数据库,因为需求非常小;为什么要为此另一个ec2实例)..每当lambda函数完成它并更新dynamodb中的记录..并且如果db中的此值超过100 - >执行您的最终lambda函数..

数字是否固定为100?或者它可以是任何数字......如果它可以是任何数字n;那么我能想到的解决方案来处理太..

解决您的问题,“API调用发生的λ0和u需要对回答”是的λ0应该是这个样子:

for (int i = 0 ; i < n ; i++){ 
    invoke processinglambda[i]; // each processingLambda process and updates 
           // results in dynamodb 
} 
while (true) { 
(if work is done by ALL processing lambdas){ 
    //collate all data 
    return result; 
    } 

} 

所以,我们基本上试图使用上面的设计来实现MapReduce .. Lambda 0是主节点;它将作业委派给节点lambda 1..N ...,它们在dynamodb中进行处理并保持更新结果。主节点;如果所有子节点都完成了工作,请继续查询dynamodb。完成后;主节点会整理所有数据并返回响应。

+0

这个数字不是固定的,但我会假设目标也可以存储在数据库中。然而,问题仍然是如何从最终的lambda返回HTTP的结果,产生许多结果并不是主要问题 - 我知道该怎么做,而不是如何从不同的lambda响应收到发起请求。 –

+0

我现在基本上在想,我需要转向异步设计,这需要对前端进行相当的重写,目前与同步的不同后端一起工作;或者沿着lambda-as-a-coordinator路线走。我实际上已经实现了(尽管我有超时和结果长度问题与这个问题无关)。我希望很快就能有一个坚定的解决方案(因为我需要它,并且我知道一个答案需要接受)。 –

+0

让我知道如果我可以有任何帮助 – Deepak

2

一个想法是通过API GW调用Lambda函数(称为'工作流指导'),然后在该函数中编写代码以直接调用步骤函数(或其他)并轮询状态,以便最终可以同步响应到HTTP请求。

这只是异步工作流程的同步包装。请记住,API GW在29秒内有一个硬超时,所以如果您预计此工作流程需要大约30秒,则实施同步版本可能不值得。

异步模型(我猜在这种情况下,直接从API GW调用step函数)可以在任何情况下工作。

编辑:对不起,您可能误解了您对step功能的评论。我认为没有同步的方式来调用步骤功能工作流程,并等待最终状态,但从您的评论看来,已经存在。

让我很快地回答了几个您的具体问题:

有没有办法后,断火的S3的结果,也就是说,100个文件被写入到一个文件夹,而不是以后每一个?

我相信这是不可能的。

我不知道怎么火并联了很多lambda算一步到位,让他们的状态机

你在文档中看到在此之前所有的回报? http://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-parallel-state.html

+0

我没有在文档中看到,没有。我尝试了很多不同的搜索,虽然我没有从封面到封面全部阅读,谢谢。我会再次尝试使用该方法的步骤功能。 –

+0

另外,您对阶梯功能的误解可能来自我的误解。事实证明,从我尝试基于指针实现该路线,该步骤函数不能同步返回它们的结果。他们做的回报基本上是对结果最终将存储供您轮询的操作的参考。我误以为结果本身是同步返回的。 –

相关问题