我有一个程序执行数千个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-emr
和aws-elastic-mapreduce
。
对我的答案有任何意见?是100号固定? – Deepak