我准备了一个正在使用的MapReduce akka_mapreduce_example的Akka / Java实现,我目前在多个项目中使用它。
我现在想要将Map步骤工作负载分布在许多单独的网络节点上,我想知道我必须在Akka配置中更改以实现这一点。我需要在“Master”机器中进行配置更改(触发MapReduce,同时运行reduce步骤)和“Slave”机器,以帮助分配Map工作负载。
我当前的application.conf适用于单台机器,非常简单。我希望这只需要更改配置而不需要更改代码,或者?
答案 0 :(得分:2)
根据您的代码,所需的只是配置更改。在配置中你需要这样的东西来设置远程:
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
remote {
enabled-transports = ["akka.remote.netty.tcp"]
netty.tcp {
hostname = "127.0.0.1"
port = 2552
}
}
}
然后你需要告诉Akka你的哪个演员将在远程节点上创建:
akka {
actor {
deployment {
/sampleActor {
remote = "akka.tcp://sampleActorSystem@127.0.0.1:2553"
}
}
}
}
有关详细信息,您可以查找excellent documentation。我链接了2.2.1版本的文档,如果您使用不同的版本,请务必查看该版本的文档。版本之间往往会有变化,而旧版本的版本仍然可以在较新的版本中使用(虽然它们可能会被弃用),反过来显然是一个问题。
你会注意到我说“取决于你的代码”。我的意思是,您发送到远程节点的所有消息都需要是Serializable,并且您不需要在actor中使用任何静态成员。
如果您想要更多灵活性,可以查看全新的群集支持。这将为您提供一个灵活,灵活的Peer-To-Peer系统,您可以根据需要进行扩展和缩小。您可能需要稍微更改代码。
希望有所帮助。
答案 1 :(得分:1)
工作负载可以分布在多个节点上,但您必须选择两种处理模式,即基于拉或推的处理。
两者都有利弊。但拉动更具吸引力,因为它提供容错功能,您可以跟踪工作者的工作分配。要开始使用,请查看http://blog.goconspire.com/post/64901258135/akka-at-conspire-part-5-the-importance-of-pulling。
示例工作代码位于https://github.com/typesafehub/activator-akka-distributed-workers。
处理快速生产者和缓慢的消费者问题可以使用akka流的背压。
为了在系统极端负载的情况下动态创建工作人员,您必须提出自己的设计。但该解决方案表示要向集群添加更多节点以将工作分配给新节点。