Akka配置在不同的网络节点上分配Map工作负载?

时间:2013-10-10 12:33:28

标签: mapreduce akka

我准备了一个正在使用的MapReduce akka_mapreduce_example的Akka / Java实现,我目前在多个项目中使用它。

我现在想要将Map步骤工作负载分布在许多单独的网络节点上,我想知道我必须在Akka配置中更改以实现这一点。我需要在“Master”机器中进行配置更改(触发MapReduce,同时运行reduce步骤)和“Slave”机器,以帮助分配Map工作负载。

我当前的application.conf适用于单台机器,非常简单。我希望这只需要更改配置而不需要更改代码,或者?

2 个答案:

答案 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流的背压。

为了在系统极端负载的情况下动态创建工作人员,您必须提出自己的设计。但该解决方案表示要向集群添加更多节点以将工作分配给新节点。