我正在开始研究需要发现集群中的节点并将这些节点作业发送到工作的系统。我知道有很多系统可以解决这个问题,但我不清楚每个系统的复杂性,哪个系统最适合我的特定需求。
我们的要求是应用程序应该能够发出作业请求。每个请求都将指定要处理的多个数据段。群集中的节点应该获取这些作业请求,并确定所请求的数据段是否“方便”。应用程序需要跟踪某个节点正在处理哪些段,然后如果存在需要强制某些节点处理的数据段,则可能发出进一步的请求(所有节点都可以访问所有数据) ,但他们应该更喜欢处理他们已经缓存过的数据段。
这是一个非常典型的map / reduce问题,但我们不想使用标准的hadoop解决方案,因为我们试图避免将初步结果写入文件的开销。这更像是一个流媒体问题,我们希望节点对他们读取的数据执行过滤,然后通过网络套接字将其发送到将结合所有节点结果的应用程序。
我快速浏览了akka,apache-spark(流媒体),风暴和简单的简单UPNP,我不太确定哪一个最适合我的需求。至少对火花起作用的一件事是它似乎需要在网络上设置ZooKeeper,这是我们希望能够避免的复杂功能。
是否有任何类似于“通过网络多播自动发现节点”的简单库,然后允许您来回简单地发送消息来协商哪个节点将处理哪个数据段?阿卡能帮助我吗?如何在群集中添加/发现节点?同样,我们希望将配置开销保持在最低限度,这就是UPNP / SSDP看起来不错的原因。
非常感谢任何有关如何使用上述解决方案或其他图书馆或解决方案的建议。
答案 0 :(得分:3)
您可以使用Akka群集:http://doc.akka.io/docs/akka/current/java/cluster-usage.html。但是,它不使用多播,它使用Gossip协议来处理节点上/下消息。您可以使用群集感知路由器(请参阅Akka群集文档和http://doc.akka.io/docs/akka/current/java/routing.html)将消息路由到群集,根据您的需要和您的意思,有几种不同类型的路由器,方便& #34 ;.如果"方便"只是意味着哪个actor目前是免费的,你可以使用最小的邮箱路由器。如果它与消息内容有关,则可以使用Consistent Hashing路由器。
答案 1 :(得分:3)
请参阅Balancing Workload Across Nodes with Akka 2。
这篇文章描述了使用Akka的工作分配算法。该算法不使用多播来发现工作者。有一个众所周知的主地址,工人向主人注册。除此之外,它很好地满足您的要求。
Akka Work Pulling Pattern中描述了它的另一个变体。
我在很多项目中使用过这种模式 - 效果很好。
答案 2 :(得分:0)
当涉及到工作人员节点离线时,Storm非常有弹性。线上。但是,就像Spark一样,它确实需要Zookeeper。
好消息是Storm附带了一个姊妹项目,使部署变得轻而易举:https://github.com/nathanmarz/storm-deploy/wiki
如果您在EC2上运行香草风暴,storm-deploy
项目可能就是您正在寻找的项目。