簡體   English   中英

Java 8 MapReduce用於分布式計算

[英]Java 8 MapReduce for distributed computing

當我在Java 8中聽到parallelStream()時,它讓我感到高興,它在多個內核上進行處理,最后在單個JVM中返回結果。 沒有更多的多線程代碼行。 據我所知,這僅對單個JVM有效。

但是,如果我想在單個主機甚至多個主機上的不同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();

在這種情況下,它在單個主機上處理。

我的問題是 :它可以使用多個主機進行處理嗎?

例如, 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抽象 - 僅在多個核心上。 您需要使用現有設施為真正的分布式計算設計自己的解決方案。

盡管可能令人失望,但我還是會指出,就像CascalogApache Spark一樣,Hadoop仍然有很好的開源第三方抽象。 Spark特別允許您通過RDD抽象以分布式方式對數據執行操作,這使您感覺您的數據只是在一個花哨的數組中。

但是你必須在核心Java中等待這些事情。

文檔/規范中沒有任何內容表明會有這樣的功能。 但是,如果我們考慮一下RMI是用於分發的Java解決方案並且它非常簡單,您可以將其用作分發的基礎,並且在節點上使用核心並行性,如圖所示。

不要指望核心語言中有這樣的功能,因為它需要某種服務器來運行和管理不同的進程。 從歷史上看,我不知道屬於java核心的類似解決方案。

但是,有些解決方案與您想要的解決方案類似。 其中一個是級聯http://www.cascading.org/ ,這是一個用於編寫地圖縮減程序的功能樣式基礎結構。 意思是 - 相對輕量級的實際代碼(與傳統的map reduce程序不同)但它確實需要維護hadoop基礎結構。

我不確定Java 8會發生什么,因為它還為時過早,但是有一些開源項目將JVM中運行的早期函數編程語言的地圖縮減功能擴展到分布式計算環境。

最近,我采用了傳統但非平凡的Hadoop map reduce工作(它接受原始性能數據並准備加載到OLAP多維數據集中)並在Cascalog上運行的Clojure和Spark上運行的Scala中重寫。 我在一個叫做分布式計算和功能編程的博客中記錄了我的發現。

這些開源項目已經成熟並准備好迎接黃金時段。 他們得到了Cloudera和Hortonworks的支持。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM