em7*_*m70 8 dataflow stream control-flow-graph
我有一类似乎自然采用图形结构的计算.该图远非线性,因为有多个输入以及扇出的节点和需要其他几个节点结果的节点.在所有这些计算中,也可能存在几个接收器.但是,没有任何循环存在.输入节点被更新(不一定一次),我的值通过(此时纯粹是概念上的)图形.当输入改变时,节点保持状态,并且计算必须相对于输入顺序运行.
因为我必须非常频繁地编写这样的计算,并且我每次都不愿意编写ad-hoc代码,所以我尝试编写一个小型库,以便通过编写各种顶点的类来轻松地将这些计算拼凑在一起.然而,我的代码相当不优雅,并没有利用这些计算的并行结构.虽然每个顶点通常都是轻量级的,但计算可能会非常复杂和"宽".为了使问题更加复杂,这些计算的输入在循环中非常频繁地更新.幸运的是,问题的规模足够小,我可以在一个节点上处理它们.
有没有人曾经处理类似的事情?您会推荐哪些想法/方法/工具?
这听起来像是 Apache Storm(开源)完美解决的问题: http: //storm.apache.org/
Apache Storm 是一种实时流计算,它一次处理一个元组(数据点)。Storm 保证每个元组至少被处理一次。使用 Storm Trident,您可以进一步抽象 Storm 并获得一次性语义。
Apache Storm 是一个免费开源的分布式实时计算系统。Storm 可以轻松、可靠地处理无限制的数据流,其实时处理功能就像 Hadoop 的批处理功能一样。
我和我的公司已经使用 Apache Storm 多年了,它是最成熟的大数据技术之一。大数据技术是以水平分布式方式运行的技术(在廉价的商品硬件上)。
主要 API 适用于 Java,但也有适用于 Ruby、Python、Javascript、Perl 的适配器。然而,您实际上可以使用任何语言:http://storm.apache.org/about/multi-language.html
该文档很好(尽管 JavaDoc 可以使用更多详细信息):http://storm.apache.org/documentation.html
Storm 有 Spouts,您可以从中读取数据到所谓的拓扑中。拓扑就是您所描述的这个图。当新元组进入 Spout 时,它们会通过拓扑发送。每个节点都是风暴螺栓之一。
Storm 有许多用例:实时分析、在线机器学习、连续计算、分布式 RPC、ETL 等等。Storm 速度很快:基准测试显示每个节点每秒处理超过一百万个元组。它具有可扩展性、容错性,保证您的数据得到处理,并且易于设置和操作。