当我parallelStream()
在Java 8中听到它在多个内核上进行处理并最终在单个JVM中返回结果时,我很高兴.没有更多的多线程代码行.据我所知,这仅对单个JVM有效.
但是,如果我想在单个主机甚至多个主机上的不同JVM上分发处理,该怎么办?Java 8是否包含任何用于简化它的抽象?
在dreamsyssoft.com的教程中,用户列表
private static Listusers = 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();
在这种情况下,它在单个主机上处理.
我的问题是:它可以使用多个主机进行处理吗?
例如,Host1
处理下面的列表并返回average1
五个用户:
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),
类似地Host2
处理下面的列表并返回average2
剩下的五个用户:
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()
为多个主机获取任何文档和示例吗?
以下是截至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抽象 - 仅在多个核心上.您需要使用现有设施为真正的分布式计算设计自己的解决方案.
尽管可能令人失望,但我还是会指出,就像Cascalog和Apache Spark一样,Hadoop仍然有很好的开源第三方抽象.Spark特别允许您通过RDD抽象以分布式方式对数据执行操作,这使您感觉您的数据只是在一个花哨的数组中.
但是你必须在核心Java中等待这些事情.