背景介紹
在當(dāng)今數(shù)據(jù)驅(qū)動(dòng)的時(shí)代,Apache?Spark已經(jīng)成為了處理大規(guī)模數(shù)據(jù)集的首選框架。作為一個(gè)開(kāi)源的分布式計(jì)算系統(tǒng),Spark因其高效的大數(shù)據(jù)處理能力而在各行各業(yè)中廣受歡迎。無(wú)論是金融服務(wù)、電信、零售、醫(yī)療保健還是物聯(lián)網(wǎng),Spark的應(yīng)用幾乎遍及所有需要處理海量數(shù)據(jù)和復(fù)雜計(jì)算的領(lǐng)域。它的快速、易用和通用性,使得數(shù)據(jù)科學(xué)家和工程師能夠輕松實(shí)現(xiàn)數(shù)據(jù)挖掘、數(shù)據(jù)分析、實(shí)時(shí)處理等任務(wù)。
然而,在Spark的燦爛光環(huán)背后,一個(gè)核心的技術(shù)挑戰(zhàn)一直困擾著用戶(hù)和開(kāi)發(fā)者?--?Shuffle過(guò)程中的網(wǎng)絡(luò)瓶頸。
在大規(guī)模數(shù)據(jù)處理時(shí),Shuffle是Spark中不可或缺的一環(huán),它涉及大量數(shù)據(jù)在不同節(jié)點(diǎn)間的交換,是整個(gè)數(shù)據(jù)處理過(guò)程中最耗時(shí)的部分之一。隨著數(shù)據(jù)量的不斷增長(zhǎng),網(wǎng)絡(luò)傳輸成為了顯著的性能瓶頸,這不僅影響了處理速度,還影響了整體的資源利用效率和系統(tǒng)的可擴(kuò)展性。
Apache?Spark?Shuffle
在Spark中,Shuffle是數(shù)據(jù)處理過(guò)程的一個(gè)關(guān)鍵階段,發(fā)生在數(shù)據(jù)需要redistribute的情況。
圖一:?shuffle中的數(shù)據(jù)流向
每個(gè)左上角的彩色條帶代表Spark在Shuffle前計(jì)算得到的一個(gè)數(shù)據(jù)塊。假設(shè)這些數(shù)據(jù)塊分別存放在集群的不同的節(jié)點(diǎn)上。此刻,假設(shè)我們希望“根據(jù)顏色將這些數(shù)據(jù)塊進(jìn)行分組”,那么Shuffle過(guò)程就會(huì)啟動(dòng):
首先,每臺(tái)機(jī)器上的數(shù)據(jù)塊會(huì)按顏色進(jìn)行本地第一次聚合(從左上角的彩色條帶變?yōu)橹猩喜康牟噬珬l帶)。這些經(jīng)過(guò)聚合的數(shù)據(jù)就成了Shuffle的中間數(shù)據(jù)。接下來(lái),Spark會(huì)將中間數(shù)據(jù)以文件的形式暫存到各自節(jié)點(diǎn)的硬盤(pán)上(從中上部的條帶變?yōu)?File")。這一部分稱(chēng)為Shuffle的Map階段。
在這之后,所有相同顏色的數(shù)據(jù)塊會(huì)通過(guò)網(wǎng)絡(luò)第二次聚合到一個(gè)指定的節(jié)點(diǎn)上(從中上部的彩色條帶移動(dòng)至中下部)。這一階段稱(chēng)為Shuffle的Reduce階段。
至此,Spark完成了“根據(jù)顏色將數(shù)據(jù)塊進(jìn)行分組”這個(gè)要求,Shuffle過(guò)程結(jié)束。
在實(shí)際的操作中,Shuffle是一個(gè)非常耗時(shí)的過(guò)程,因?yàn)樗婕暗酱罅康臄?shù)據(jù)在網(wǎng)絡(luò)中的傳輸。如果Shuffle管理得不好,它會(huì)成為Spark作業(yè)性能瓶頸的主要原因。
解決Spark?Shuffle網(wǎng)絡(luò)傳輸性能瓶頸的關(guān)鍵
為了克服這一挑戰(zhàn),近年來(lái),遠(yuǎn)程直接內(nèi)存訪(fǎng)問(wèn)(RDMA)技術(shù)逐漸進(jìn)入了專(zhuān)家們的視野。RDMA允許內(nèi)存數(shù)據(jù)直接從一個(gè)系統(tǒng)傳輸?shù)搅硪粋€(gè)系統(tǒng),而無(wú)需通過(guò)操作系統(tǒng)的干預(yù),這顯著減少了數(shù)據(jù)傳輸過(guò)程中的延遲和CPU的使用率。在高性能計(jì)算和大規(guī)模數(shù)據(jù)中心環(huán)境中,RDMA已經(jīng)顯示出了其強(qiáng)大的網(wǎng)絡(luò)加速能力。
將RDMA技術(shù)應(yīng)用于Apache?Spark,尤其是在Shuffle過(guò)程中,可以大幅度減輕網(wǎng)絡(luò)瓶頸帶來(lái)的影響。通過(guò)利用RDMA的高帶寬和低延遲特性,Spark的數(shù)據(jù)處理性能有望得到顯著的提升。
RDMA相比傳統(tǒng)網(wǎng)絡(luò)技術(shù)的優(yōu)勢(shì)
Kernel?Bypass:
- 傳統(tǒng)的網(wǎng)絡(luò)通信需要操作系統(tǒng)內(nèi)核參與數(shù)據(jù)的發(fā)送和接收,這會(huì)增加額外的延遲。每個(gè)數(shù)據(jù)包在傳輸過(guò)程中都需要經(jīng)過(guò)操作系統(tǒng)的網(wǎng)絡(luò)協(xié)議棧,這個(gè)過(guò)程中涉及多次上下文切換和數(shù)據(jù)拷貝。如下圖所示。
圖二:?傳統(tǒng)網(wǎng)絡(luò)通信中數(shù)據(jù)的發(fā)送和接收
- RDMA技術(shù)允許網(wǎng)絡(luò)設(shè)備直接訪(fǎng)問(wèn)應(yīng)用程序內(nèi)存空間,實(shí)現(xiàn)了內(nèi)核旁路(kernel?bypass)。這意味著數(shù)據(jù)可以直接從發(fā)送方的內(nèi)存?zhèn)鬏數(shù)浇邮辗降膬?nèi)存,無(wú)需CPU介入,減少了傳輸過(guò)程中的延遲。如下圖所示。
圖三:?RDMA網(wǎng)絡(luò)通信中數(shù)據(jù)的發(fā)送和接收
- 對(duì)于Spark的Shuffle過(guò)程,這意味著數(shù)據(jù)塊可以更快地在節(jié)點(diǎn)間傳輸,因?yàn)樗鼈儾辉傩枰谟脩?hù)空間和內(nèi)核空間之間進(jìn)行多次拷貝。
CPU?Offloading:
- 在傳統(tǒng)的網(wǎng)絡(luò)通信中,CPU需要處理包括TCP協(xié)議棧在內(nèi)的大量網(wǎng)絡(luò)協(xié)議處理任務(wù),這不僅消耗了大量的計(jì)算資源,而且還增加了通信的延遲。
- RDMA通過(guò)其協(xié)議和硬件的設(shè)計(jì),允許網(wǎng)絡(luò)設(shè)備處理大部分?jǐn)?shù)據(jù)傳輸?shù)募?xì)節(jié),從而釋放CPU資源。這意味著CPU可以專(zhuān)注于執(zhí)行計(jì)算任務(wù),而不是網(wǎng)絡(luò)數(shù)據(jù)的傳輸,從而提高了整體的計(jì)算效率。
- 在Spark中,這樣可以確保CPU更多地用于執(zhí)行Map和Reduce階段之外的實(shí)際計(jì)算工作,而不是在網(wǎng)絡(luò)通信上。
RDMA技術(shù)在Apache?Spark中的應(yīng)用
- 在Spark中集成RDMA
Spark允許將外部實(shí)現(xiàn)的ShuffleManager插入到其架構(gòu)中。下圖中通過(guò)實(shí)現(xiàn)Spark的接口,可以創(chuàng)建專(zhuān)有的ShuffleManager從而將RDMA技術(shù)引入到Shuffle過(guò)程中。
圖四:?通過(guò)Spark接口將RDMA集成到Apache?Spark
- RDMA加速的實(shí)現(xiàn)
圖五:?RDMA在Spark?Shuffle過(guò)程中的位置
上圖中展示了RDMA引入Apache?Spark前后的Shuffle過(guò)程中的數(shù)據(jù)傳輸方式。
在上半部分,展示了Apache?Spark使用Netty作為網(wǎng)絡(luò)傳輸層的傳統(tǒng)方法。數(shù)據(jù)從磁盤(pán)讀取,通過(guò)Netty服務(wù)器傳輸,然后由Netty客戶(hù)端接收,并放入隊(duì)列中供進(jìn)一步處理。
在下半部分,展示了使用RDMA作為網(wǎng)絡(luò)傳輸層的方法。在這種方式中,?Netty客戶(hù)端被RDMA客戶(hù)端替換,而由于RDMA單邊操作的特性,不再需要服務(wù)器端,Disk上的數(shù)據(jù)通過(guò)MMAP加載進(jìn)入用戶(hù)空間的內(nèi)存,之后Client使用RDMA直接在網(wǎng)絡(luò)上進(jìn)行內(nèi)存訪(fǎng)問(wèn)操作,避免了數(shù)據(jù)在操作系統(tǒng)內(nèi)存和網(wǎng)絡(luò)接口之間的多次復(fù)制,從而提高了數(shù)據(jù)傳輸速度,并減少了延遲和CPU負(fù)載。
性能數(shù)據(jù)和比較分析
為了驗(yàn)證我們的實(shí)現(xiàn),我們?cè)诙喾N數(shù)據(jù)集和查詢(xún)負(fù)載下進(jìn)行了性能測(cè)試。測(cè)試結(jié)果如下圖所示
圖六:SQL的性能提升效果
這些測(cè)試結(jié)果表明,在多種場(chǎng)景下使用RDMA均能實(shí)現(xiàn)大約10%左右的性能提升。然而,值得注意的是,具體的加速效果會(huì)受到業(yè)務(wù)邏輯和數(shù)據(jù)處理工作負(fù)載的影響,因此我們推薦在實(shí)施RDMA解決方案前,對(duì)特定的應(yīng)用場(chǎng)景進(jìn)行詳細(xì)評(píng)估。
應(yīng)用場(chǎng)景建議
通過(guò)RDMA和Spark的特性分析,結(jié)合測(cè)試,可得到針對(duì)RDMA技術(shù)在Spark中適用和不適用的場(chǎng)景的優(yōu)化建議:
- 適合RDMA的場(chǎng)景
- 大數(shù)據(jù)量的復(fù)雜SQL操作:在處理包含復(fù)雜操作(如Order?by)的大數(shù)據(jù)量SQL查詢(xún)時(shí),RDMA技術(shù)可顯著提升效率。
- 大量小數(shù)據(jù)分區(qū):當(dāng)分區(qū)數(shù)量較多,且每個(gè)分區(qū)處理的數(shù)據(jù)量較小,傳送的數(shù)據(jù)包較多時(shí),RDMA的加速效果尤為顯著。
- 不適合RDMA的場(chǎng)景
- 數(shù)據(jù)量大幅減少的操作:如SQL中的Group?by聚合操作等,這些減少數(shù)據(jù)量的計(jì)算可能不會(huì)從RDMA中獲得顯著加速。
- 基于HDD的磁盤(pán)集群:在使用HDD磁盤(pán)的集群中,由于讀寫(xiě)速度較慢,磁盤(pán)I/O所占的時(shí)間較長(zhǎng),這可能限制RDMA技術(shù)的加速潛力。
- 數(shù)據(jù)高度本地化:?如果數(shù)據(jù)本地化良好,則意味著網(wǎng)絡(luò)傳輸占比較少,這種計(jì)算難以通過(guò)RDMA獲得加速。
總結(jié)
盡管面臨一些挑戰(zhàn),RDMA技術(shù)在Apache?Spark中的應(yīng)用仍然有著顯著的優(yōu)勢(shì),體現(xiàn)在以下幾個(gè)方面:
- 提高數(shù)據(jù)傳輸效率:RDMA通過(guò)提供低延遲和高帶寬的數(shù)據(jù)傳輸,顯著加快了Spark中的數(shù)據(jù)處理速度。這是因?yàn)镽DMA直接在網(wǎng)絡(luò)設(shè)備和應(yīng)用程序內(nèi)存之間傳輸數(shù)據(jù),減少了CPU的干預(yù),從而降低了數(shù)據(jù)傳輸過(guò)程中的延遲。
- 減少CPU占用:RDMA的Kernel?Bypass特性允許數(shù)據(jù)繞過(guò)內(nèi)核直接從內(nèi)存?zhèn)鬏?,減少了CPU在數(shù)據(jù)傳輸過(guò)程中的工作量。這不僅提高了CPU的有效利用率,還留出了更多資源用于Spark的計(jì)算任務(wù)。
- 改善端到端處理時(shí)間:在對(duì)比測(cè)試中,使用RDMA相比傳統(tǒng)的TCP傳輸方式,在端到端的數(shù)據(jù)處理時(shí)間上有顯著的降低。這意味著整體的數(shù)據(jù)處理流程更加高效,能夠在更短的時(shí)間內(nèi)完成相同的計(jì)算任務(wù)。
- 優(yōu)化Shuffle階段的性能:在Spark中,Shuffle階段是一個(gè)關(guān)鍵的、對(duì)性能影響較大的階段。RDMA通過(guò)減少數(shù)據(jù)傳輸和處理時(shí)間,有效地優(yōu)化了Shuffle階段的性能,從而提升了整個(gè)數(shù)據(jù)處理流程的效率。
- 增強(qiáng)大規(guī)模數(shù)據(jù)處理能力:對(duì)于處理大規(guī)模數(shù)據(jù)集的場(chǎng)景,RDMA提供的高效數(shù)據(jù)傳輸和低延遲特性尤為重要。它使得Spark能夠更加高效地處理大數(shù)據(jù)量,提高了大規(guī)模數(shù)據(jù)處理的可擴(kuò)展性和效率。
總而言之,RDMA技術(shù)在Apache?Spark中的應(yīng)用顯著提升了數(shù)據(jù)處理的效率和性能。在未來(lái),相信隨著數(shù)據(jù)量的持續(xù)增長(zhǎng)和計(jì)算需求的日益復(fù)雜化,RDMA技術(shù)在Apache?Spark以及更廣泛的大數(shù)據(jù)處理和高性能計(jì)算領(lǐng)域的應(yīng)用將越來(lái)越廣。