發(fā)布于:2021-01-21 10:38:08
0
177
0
在這篇文章中,我們將介紹有關(guān)Java8流、Hadoop、ApacheSpark、Quasar光纖和反應(yīng)式編程方法的一些您需要了解的知識(shí),并幫助您保持循環(huán),特別是在您不經(jīng)常使用它們的情況下。這不是未來(lái),而是現(xiàn)在。
我們?cè)谔幚硎裁矗?/strong>
在談到并發(fā)性時(shí),描述當(dāng)前問(wèn)題的一個(gè)好方法是回答幾個(gè)問(wèn)題以更好地理解它:
這是一項(xiàng)數(shù)據(jù)處理任務(wù)嗎?如果是的話,它能被分解成獨(dú)立的作品嗎?
操作系統(tǒng)、JVM和代碼之間的關(guān)系是什么?(本機(jī)線程與輕量級(jí)線程)
涉及多少臺(tái)機(jī)器和處理器?(單核與多核)
讓我們逐一分析一下,找出每種方法的最佳用例。
1.從線程池到并行流
在單機(jī)上進(jìn)行數(shù)據(jù)處理,讓Java負(fù)責(zé)線程處理。
在Java8中,我們引入了新的流API,它允許對(duì)數(shù)據(jù)流應(yīng)用聚合操作,如過(guò)濾、排序或映射。流允許的另一件事是在應(yīng)用.parallelStream()時(shí)在多核機(jī)器上進(jìn)行并行操作——使用Java7中引入的Fork/Join框架在線程之間分割工作。Java6的一個(gè)演變java.util.concurrency在庫(kù)中,我們遇到了創(chuàng)建和處理工作線程池的ExecutorService。
Fork/Join也構(gòu)建在ExecuterService之上,與傳統(tǒng)線程池的主要區(qū)別在于它們?nèi)绾卧诰€程之間分配工作,從而支持多核機(jī)器。通過(guò)一個(gè)簡(jiǎn)單的ExecuterService,您可以完全控制工作線程之間的工作負(fù)載分配,確定線程要處理的每個(gè)任務(wù)的大小。另一方面,在Fork/Join中,有一個(gè)工作竊取算法,可以抽象線程之間的工作負(fù)載處理。簡(jiǎn)而言之,這允許將大型任務(wù)劃分為較小的任務(wù)(分叉),并在不同的線程中進(jìn)行處理,最終合并結(jié)果—平衡線程之間的工作。然而,這不是一個(gè)銀彈。
有時(shí)平行流甚至?xí)p慢你的速度,所以你需要好好想想。將.parallelStream()添加到方法中可能會(huì)導(dǎo)致瓶頸和速度減慢(在我們運(yùn)行的這個(gè)基準(zhǔn)測(cè)試中大約慢了15%),細(xì)線穿過(guò)線程的數(shù)量。假設(shè)我們已經(jīng)運(yùn)行了多個(gè)線程,并且在其中一些線程中使用了.parallelStream(),向池中添加了越來(lái)越多的線程。這很容易變成超出我們的核心所能處理的,并且由于增加了上下文切換而減慢了一切。
底線:并行流在一臺(tái)機(jī)器上抽象處理線程,在核心之間分配工作負(fù)載。但是,如果您想有效地使用它們,請(qǐng)務(wù)必記住硬件不會(huì)產(chǎn)生超出您的機(jī)器所能處理的線程數(shù)。
2.apachehadoop和apachespark
重型起重:跨多臺(tái)機(jī)器的大數(shù)據(jù)處理。
接下來(lái)是多臺(tái)機(jī)器、數(shù)PB的數(shù)據(jù)和類似于從twitter或重型機(jī)器學(xué)習(xí)算法中提取所有提到Java的推文的任務(wù)。說(shuō)到Hadoop,重要的是要采取另一個(gè)步驟并考慮更廣泛的框架及其組件:Hadoop分布式文件系統(tǒng)(HDFS)、資源管理平臺(tái)(YARN)、數(shù)據(jù)處理模塊(MapReduce)以及Hadoop所需的其他庫(kù)和實(shí)用程序(Common)。除此之外,還有其他可選工具,如運(yùn)行在HDFS(HBase)之上的數(shù)據(jù)庫(kù)、查詢語(yǔ)言平臺(tái)(Pig)和數(shù)據(jù)倉(cāng)庫(kù)基礎(chǔ)設(shè)施(Hive)等。
這就是apachespark作為一個(gè)新的數(shù)據(jù)處理模塊介入的地方,它以內(nèi)存性能和使用快速執(zhí)行的彈性分布式數(shù)據(jù)集(RDDs)而聞名,不像Hadoop MapReduce那樣高效地使用內(nèi)存(和磁盤(pán))操作。Databricks發(fā)布的最新基準(zhǔn)測(cè)試顯示,Spark在對(duì)PB級(jí)數(shù)據(jù)進(jìn)行排序時(shí)比Hadoop快3倍,而使用的節(jié)點(diǎn)則少10倍。
Hadoop的經(jīng)典用例是查詢數(shù)據(jù),而Spark則以其快速運(yùn)行的機(jī)器學(xué)習(xí)算法而聞名。但這只是冰山一角,正如Databricks所說(shuō):“Spark使Hadoop集群中的應(yīng)用程序在內(nèi)存中的運(yùn)行速度提高了100倍,甚至在磁盤(pán)上運(yùn)行時(shí)也提高了10倍”。
底線:Spark是Hadoop生態(tài)系統(tǒng)中的新星。有一種常見(jiàn)的誤解,認(rèn)為我們談?wù)摰氖且恍┎幌嚓P(guān)或相互競(jìng)爭(zhēng)的東西,但我相信我們?cè)谶@里看到的是框架的演變。
3.類星體纖維
將本機(jī)線程中斷為虛擬輕量級(jí)線程。
我們已經(jīng)有機(jī)會(huì)運(yùn)行Hadoop,現(xiàn)在讓我們回到單機(jī)。事實(shí)上,讓我們進(jìn)一步放大標(biāo)準(zhǔn)的多線程Java應(yīng)用程序,并將重點(diǎn)放在單個(gè)線程上。就我們而言,HotSpot JVM線程與本機(jī)OS線程是一樣的,只持有一個(gè)線程并在其中運(yùn)行“虛擬”線程是fibres的全部?jī)?nèi)容。Java沒(méi)有本機(jī)的光纖支持,但不用擔(dān)心,平行宇宙的類星體讓我們得到了覆蓋。
Quasar是一個(gè)開(kāi)源JVM庫(kù),它支持fibers(也稱為輕量級(jí)線程),還充當(dāng)Actor框架,稍后我將提到它。上下文切換是游戲的名字。由于我們受到內(nèi)核數(shù)量的限制,一旦本機(jī)線程數(shù)量增加,我們就會(huì)承受越來(lái)越多的上下文切換開(kāi)銷。解決這一問(wèn)題的一種方法是使用支持“多線程”的單線程進(jìn)行光纖傳輸。看起來(lái)像是Threadception的病例。
光纖也可以看作是線程池的一種演變,它避免了我們?cè)诓⑿辛髦杏龅降木€程過(guò)載的危險(xiǎn)。它們使擴(kuò)展線程變得更容易,并允許大量并發(fā)的“輕”線程。它們不是用來(lái)替換線程的,應(yīng)該用于相對(duì)頻繁地阻塞的代碼,就像它們充當(dāng)真正的異步線程一樣。
底線:Parallel Universe為Java中的并發(fā)提供了一種新的方法,雖然還沒(méi)有達(dá)到v1.0,但絕對(duì)值得一試。
4.參與者和反應(yīng)式編程
使用Java處理并發(fā)的其他模型。
在反應(yīng)宣言中,新的運(yùn)動(dòng)被描述為4個(gè)原則:反應(yīng)、彈性、彈性和信息驅(qū)動(dòng)。這基本上意味著快速、容錯(cuò)、可擴(kuò)展和支持無(wú)阻塞通信。
讓我們看看阿克卡演員是如何支持這一點(diǎn)的。為了簡(jiǎn)化事情,可以把參與者想象成具有某種狀態(tài)和某種行為的人,通過(guò)交換發(fā)往對(duì)方郵箱的消息來(lái)進(jìn)行交流。作為一個(gè)整體,應(yīng)該為每個(gè)應(yīng)用程序創(chuàng)建一個(gè)Actor系統(tǒng),其層次結(jié)構(gòu)將任務(wù)分解為更小的任務(wù),這樣每個(gè)Actor最多只有一個(gè)監(jiān)控Actor。參與者可以處理任務(wù),將任務(wù)進(jìn)一步分解并委托給另一個(gè)參與者,或者在失敗的情況下,將任務(wù)升級(jí)到其主管。無(wú)論哪種方式,消息都不應(yīng)該包含行為或共享可變狀態(tài),每個(gè)參與者都有自己的獨(dú)立狀態(tài)和行為。
這是從大多數(shù)開(kāi)發(fā)人員習(xí)慣的并發(fā)模型的范例轉(zhuǎn)變。我們?cè)谶@里討論的前三個(gè)主題中的進(jìn)化有點(diǎn)偏離了。雖然它的起源可以追溯到70年代,但直到最近幾年,它的復(fù)興才開(kāi)始受到關(guān)注,以更好地適應(yīng)現(xiàn)代應(yīng)用需求。平行宇宙的類星體也支持Actor,基于它的輕量級(jí)線程。實(shí)現(xiàn)上的主要區(qū)別在于光纖/輕量級(jí)線程。
底線:采用Actor模型可以減少對(duì)線程池的管理,而將其留給工具箱。興趣的復(fù)興來(lái)自于應(yīng)用程序今天處理的問(wèn)題,即具有更多內(nèi)核的高度并發(fā)系統(tǒng)。
結(jié)論
我們已經(jīng)介紹了四種使用并行或并行算法解決問(wèn)題的方法,其中最有趣的方法是解決當(dāng)今的挑戰(zhàn)。希望這有助于激發(fā)您的興趣,更好地了解今天并發(fā)的熱門(mén)話題。
除了線程池之外,現(xiàn)在有一種趨勢(shì),就是將這一點(diǎn)負(fù)責(zé)任地委托給語(yǔ)言及其工具—將開(kāi)發(fā)人員的資源集中在發(fā)布新功能上,而不是花費(fèi)無(wú)數(shù)的時(shí)間來(lái)解決競(jìng)爭(zhēng)條件和鎖。
Java/Scala開(kāi)發(fā)人員?Takipi檢測(cè)代碼中的所有異常和錯(cuò)誤,并告訴您它們發(fā)生的原因。只需1分鐘即可安裝:請(qǐng)嘗試Takipi。
作者介紹
熱門(mén)博客推薦