当我听说这件事时,我很高兴 parallelStream()
在Java8中,在多个内核上进行处理并最终在单个jvm中返回结果的方法。没有更多的多线程代码行。据我所知,这只对单个jvm有效。
但是,如果我想在单个主机甚至多个主机上的不同JVM之间分发处理,该怎么办?Java8是否包含任何简化它的抽象?
在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();
在这种情况下,它是在单个主机上处理的。
我的问题是:是否可以使用多个主机来处理它?
例如。 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
使用分布式体系结构可以像远程处理一样解决这个问题。Java8有更简单的方法来解决这个问题吗?
我知道像hadoop、akka和promises这样的框架可以解决这个问题。我说的是纯Java8。我能给你拿些文件和例子吗 parallelStream()
对于多个主机?
4条答案
按热度按时间mrzz3bfm1#
文件/规范中没有任何内容表明会有这样的功能。但是如果我们认为rmi是用于分发的java解决方案,而且它非常简单,那么您可以使用它作为分发的基础,并在节点上使用核心并行性,如您所示。
izkcnapc2#
我不确定java8会发生什么,因为现在说还为时过早,但是有几个开源项目将jvm中运行的早期函数式编程语言的map-reduce功能扩展到了分布式计算环境。
最近,我做了一个传统的hadoop map reduce作业(它获取原始性能数据并准备加载到olap多维数据集),然后在cascalog上运行clojure和spark上运行scala中重写了它。我在一个名为分布式计算和函数编程的博客中记录了我的发现。
这些开源项目已经成熟,并准备好迎接黄金时间。它们由cloudera和hortonworks支持。
lztngnrs3#
不要期望核心语言中有这样的特性,因为它需要某种服务器来运行和管理不同的进程。历史上,我不知道类似的解决方案是JavaCore的一部分。
但是,有些解决方案与您想要的类似。其中之一就是级联http://www.cascading.org/ ,这是一个函数式的基础结构,用于编写map-reduce程序。意思-实际代码如果相对轻量级(不像传统的map reduce程序),但它确实需要维护hadoop基础设施。
eivnm1vs4#
以下是自2013年9月起计划用于Java8的功能列表。
如您所见,没有专门用于标准化集群上的分布式计算的特性。最接近的是jep107,它构建在jdk7中的fork/join框架之上,以利用多核cpu。在Java8中,通过在多个处理器之间划分任务,您将能够使用lambda表达式并行地对集合执行批量操作。
java8还计划采用jep103,jep103还将构建在java7 fork/join之上,以并行排序数组。同时,由于fork/join显然是一个大问题,它在jep155中得到了进一步的发展。
因此,集群上的分布式计算没有核心Java8抽象——只有多个核心。您需要使用现有设施为真正的分布式计算设计自己的解决方案。
尽管这可能令人失望,但我要指出的是,hadoop上仍然有许多优秀的开源第三方抽象,比如cascalog和apachespark。spark特别允许您通过rdd抽象以分布式方式对数据执行操作,这使您感觉数据只是在一个奇特的数组中。
但是您必须在核心java中等待这样的事情。