Java 8 MapReduce for Distributed Computing

当我在Java 8中听说在多个内核上进行处理并最终在单个JVM中返回结果时,这让我感到高兴。不再有多线程代码行。据我所知,这仅适用于单个JVM。parallelStream()

但是,如果我想在单个主机甚至多个主机上的不同 JVM 之间分配处理,该怎么办?Java 8 是否包含任何简化它的抽象?

dreamsyssoft.com 的教程中,用户列表

private static List<User> users = Arrays.asList(
    new User(1, "Steve", "Vai", 40),
    new User(4, "Joe", "Smith", 32),
    new User(3, "Steve", "Johnson", 57),
    new User(9, "Mike", "Stevens", 18),
    new User(10, "George", "Armstrong", 24),
    new User(2, "Jim", "Smith", 40),
    new User(8, "Chuck", "Schneider", 34),
    new User(5, "Jorje", "Gonzales", 22),
    new User(6, "Jane", "Michaels", 47),
    new User(7, "Kim", "Berlie", 60)
);

经过处理,可以得到他们的平均年龄,如下所示:

double average = users.parallelStream().map(u -> u.age).average().getAsDouble();

在这种情况下,它是在单个主机上处理的。

我的问题是:是否可以使用多个主机进行处理?

例如: 处理以下列表并为五个用户返回:Host1average1

new User(1, "Steve", "Vai", 40),
new User(4, "Joe", "Smith", 32),
new User(3, "Steve", "Johnson", 57),
new User(9, "Mike", "Stevens", 18),
new User(10, "George", "Armstrong", 24),

同样,处理以下列表并返回其余五个用户:Host2average2

new User(2, "Jim", "Smith", 40),
new User(8, "Chuck", "Schneider", 34),
new User(5, "Jorje", "Gonzales", 22),
new User(6, "Jane", "Michaels", 47),
new User(7, "Kim", "Berlie", 60)

最后计算最终结果,如下所示:Host3

average = (average1 + average2)  / 2

使用分布式架构,它可以像远程处理一样解决。Java 8是否有更简单的方法来解决这个问题,并对其进行一些抽象?

我知道像Hadoop,Akka和Promises这样的框架可以解决这个问题。我说的是纯Java 8。我可以获得多个主机的任何文档和示例吗?parallelStream()


答案 1

以下是截至 2013 年 9 月计划用于 Java 8 的功能列表

如您所见,没有专用于在集群上标准化分布式计算的功能。最接近的是 JEP 107,它建立在 JDK 7 中的 Fork/Join 框架之上,以利用多核 CPU。在 Java 8 中,您将能够使用 lambda 表达式,通过将任务划分到多个处理器之间,对集合并行执行批量操作。

Java 8还计划采用JEP 103,它还将基于Java 7 Fork/Join构建以并行排序数组。同时,由于Fork/Join显然是一件大事,因此它与JEP 155一起进一步发展。

因此,没有用于集群分布式计算的核心 Java 8 抽象 - 仅跨多个内核。您需要使用现有设施为真正的分布式计算设计自己的解决方案。

尽管这可能令人失望,但我要指出的是,Hadoop上仍然有很棒的开源第三方抽象,比如CascalogApache Spark。特别是 Spark 允许您通过 RDD 抽象以分布式方式对数据执行操作,这让人感觉您的数据只是在一个花哨的数组中。

但是你将不得不在核心Java中等待这样的事情。


答案 2

文档/规范中没有任何内容表明将有这样的功能。但是,如果我们暂时认为RMI是用于分发的Java解决方案,并且它非常简单,则可以将其用作分发的基础,并在节点上使用您所示的核心并行性。


推荐