1

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

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

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

4

2 回答 2

2

根据您的代码,所需要的只是配置更改。您需要在配置中使用类似的内容来设置远程处理:

akka {
  actor {
    provider = "akka.remote.RemoteActorRefProvider"
  }
  remote {
    enabled-transports = ["akka.remote.netty.tcp"]
    netty.tcp {
      hostname = "127.0.0.1"
      port = 2552
    }
 }
}

然后你需要告诉 Akka 你的哪些actors将在远程节点上创建:

akka {
  actor {
    deployment {
      /sampleActor {
        remote = "akka.tcp://sampleActorSystem@127.0.0.1:2553"
      }
    }
  }
}

有关更多信息,您可以查找出色的文档。我链接了 2.2.1 版本的文档,如果您使用不同的版本,请务必查看该版本的文档。版本之间往往会发生变化,虽然旧版本中的东西仍然可以在新版本中使用(尽管它们可能已被弃用),但反过来显然是一个问题。

你会注意到我说“取决于你的代码”。我的意思是,您将发送到远程节点的所有消息都需要是可序列化的,并且您不要在演员中使用任何静态成员。

如果您想要更多的灵活性,您可以查看全新的集群支持。这将为您提供一个很好的灵活、动态的点对点系统,您可以根据需要向上和向下扩展。您可能需要为此进行一些细微的代码更改。

希望有帮助。

于 2013-10-10T13:39:29.247 回答
1

工作负载可以分布在多个节点上,但您必须选择两种处理模式,即基于拉取或推送的处理。

两者都有优点和缺点。但是 pull 更具吸引力,因为它提供了容错性,并且您可以跟踪工作分配给工人演员的工作。要开始查看 http://blog.goconspire.com/post/64901258135/akka-at-conspire-part-5-the-importance-of-pulling

示例工作代码位于https://github.com/typesafehub/activator-akka-distributed-workers

可以使用处理快速生产者和慢消费者问题 akka 流的背压。

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

于 2014-08-06T09:39:18.670 回答