2017-08-01 46 views
0

问题陈述: 试图评估的Apache弗林克建模先进的实时低延迟分布分析阿帕奇弗林克复杂的分析数据流设计与挑战

使用案例摘要: 的仪器I1提供复杂的分析,I2 ,I3 ...等各有产品定义P1,P2,P3;配置用户参数(动态)U1,U2,U3 &需要流媒体市场数据M1,M2,M3 ... 仪器分析功能(A1,A2)在计算复杂性方面复杂,其中一些可能需要300-400ms但可以并行计算。 从上面清楚地看到,市场数据流将比分析功能&需要消耗最新的一致市场数据进行计算快得多(< 1ms)。 下一个挑战是结合流媒体市场数据和仪器分析结果(例如价格或收益)的多个Dependendant富集函数E1,E2,E3(例如Risk/PnL) 最后一个挑战是计算的一致性 - 因为函数A1可能比A2快并且需要来自特定市场输入的一致的所有仪器结果。

计算格拉夫依赖性的例子(它扩展到数百文书& 10-15市场数据源): calculationGraph

在上面的情况下,图像是不可见的,曲线的依赖流是这样的:
- M1 + M2 + P1 => A2
- M1 + P1 => A1
- A1 + A2 => E2
- A1 => E1
- E1 + E2 =>结果号码

问题:这些计算的数据流

  1. 正确的设计/模型,目前我使用的(P1 + M1)ConnectedStreams,另一种方法可以是使用迭代模型喂养相同文书静态数据到其自身再次?

  2. 由于分析功能(A1)比市场数据(M1)流式传输速度慢很多,因此只能使用计算中最新的市场数据事件。 因此需要为下一次迭代保留那些陈旧的市场数据驱逐在那里没有价值不可用(如LRU缓存)

  3. 需要同步不同的时间复杂度/归属关系函数执行,这样重复2开始,只有当一切都在迭代1已完成

回答

3

这是一个相当广泛的问题,为了更准确地回答它,需要更多的细节。

下面是我希望将指向你在一个很好的方向,并帮助你接近你的使用情况的一些想法:通过关键

  • 连接的流(a.keyBy(...).connect(b.keyBy(...))是最强大的join-或互助社在连接的流上使用CoProcessFunction应该能够根据需要灵活地关联或连接值。例如,您可以在等待匹配事件从另一个流到达的同时将状态中的一个流中的事件存储在状态中。

  • 只需将该值置于CoFlatMapFunctionCoProcessFunction的状态,即可轻松实现一个输入的最新数据。对于来自输入1的每个事件,您将事件存储在状态中。来自流2的每个事件,您查看状态以从流1中查找最新事件。

  • 要按时进行同步,您实际上可以考虑使用事件时间。事件时间也可以是“逻辑时间”,意思是一个版本号,迭代次数或任何事物。您只需确保分配的时间戳和您生成的水印能够一致地反映出来。

    如果通过事件时间窗口,那么无论一个操作符是否比其他操作符快,或者事件通过具有不同延迟的路径到达,您都将获得该版本的所有数据。这是真正的事件时间处理的美丽:-)

+0

有趣的是,事件时间可以设置为迭代次数,有没有例子/参考? 我以相当复杂的方式使用ConnectedIterativeStreams完成了PoC,因此可能会有所帮助。 如果我可以简化上面的广泛查询 - 希望一致地执行一个DAG,其中一些节点使用外部数据。 外部数据变化非常快<1ms,某些DAG功能可能会变慢〜100ms。 为了消费的一致性,我应该在迭代开始时将外部市场数据明确复制到缓存中,还是我们可以直接将市场数据的快照与DAG迭代编号关联起来? –