王繼民,劉賽佳,李嘉瑋
(河海大學 計算機與信息學院,江蘇 南京 211100)
網(wǎng)格水文模型屬于分布式水文模型[1]的一種,它將流域劃分為多個網(wǎng)格單元,每個網(wǎng)格具有獨立的參數(shù),能夠更加精細化考慮流域各種地理要素的空間異質(zhì)性,是解決眾多水文實際問題的有效工具。姚成等[2]提出網(wǎng)格新安江模型并將其應用于密賽流域,實驗驗證網(wǎng)格新安江模型相比于傳統(tǒng)的新安江模型能取得較高的模擬精度。
目前提高水文模型計算效率的方法多采用并行化計算框架[3]。Yue等[4]提出一種將分布式水文模型的計算流域劃分為大量子流域的并行計算方案,提高了模型計算效率。Chu等[5]提出了基于靜態(tài)任務分解的坡面-河道并行計算策略,提高了河流演算的并行效率。但并行計算方式當模擬單元單一化時性能提升效率有限[6],數(shù)據(jù)分區(qū)可以根據(jù)節(jié)點的計算能力為其分配不同的計算任務,從而提高并行計算的效率[7]。陳迪等[8]對Spark數(shù)據(jù)分區(qū)機制進行優(yōu)化,基于微任務的思想,減輕了數(shù)據(jù)傾斜對整體系統(tǒng)性能的影響。朱迅等[9]提出了一種基于異構(gòu)Spark集群的分區(qū)動態(tài)負載的調(diào)度算法,加快了Spark在異構(gòu)集群及集群復雜負載情況時的運行速度。
雖然已有的并行化計算研究取得了一定的成果,但沒有細致考慮每個網(wǎng)格、模型每個步驟之間的并行關(guān)系。基于此,本文首先根據(jù)網(wǎng)格匯流流向特點,提出了動態(tài)數(shù)據(jù)分區(qū)方法,并在此基礎(chǔ)上提出了基于Spark的網(wǎng)格化水文模型分布式計算模型,并通過實驗驗證了所提模型的計算效果。
在網(wǎng)格水文模型分布式計算過程中,通常網(wǎng)格計算次序?qū)木W(wǎng)格數(shù)量不同且差異較大,直接使用Spark的數(shù)據(jù)分區(qū)器會因計算次序選取不當出現(xiàn)數(shù)據(jù)分區(qū)不平衡形成的數(shù)據(jù)傾斜現(xiàn)象[10]。這里的數(shù)據(jù)傾斜是指每個分區(qū)內(nèi)網(wǎng)格數(shù)量差異很大,這使得各分區(qū)任務執(zhí)行時間差異較大,網(wǎng)格數(shù)量較少的任務執(zhí)行完畢后對應的worker節(jié)點將處于空閑狀態(tài),這導致了集群資源的極大浪費。
本節(jié)根據(jù)網(wǎng)格匯流流向的參數(shù)特點,將多個網(wǎng)格單元動態(tài)合并為若干個大小近似且可同時計算的網(wǎng)格集合,有效地解決了數(shù)據(jù)傾斜問題,并為分布式模型的計算提供了有力的支撐。
網(wǎng)格數(shù)據(jù)分區(qū)主要包括網(wǎng)格數(shù)據(jù)分區(qū)單次計算過程以及網(wǎng)格單元更新操作。單次的數(shù)據(jù)分區(qū)計算過程包括計算集群的可用資源、根據(jù)網(wǎng)格流向計算上游網(wǎng)格坐標、根據(jù)網(wǎng)格計算次序計算每個次序?qū)木W(wǎng)格個數(shù),根據(jù)上述3個步驟計算結(jié)果對流域網(wǎng)格進行動態(tài)分區(qū);網(wǎng)格單元更新操作是對上一輪數(shù)據(jù)分區(qū)的上游網(wǎng)格參數(shù)進行更新,剔除已完成計算的網(wǎng)格,重新進行動態(tài)數(shù)據(jù)分區(qū)操作。根據(jù)單次數(shù)據(jù)分區(qū)計算結(jié)果對網(wǎng)格單元信息進行更新并再次進行數(shù)據(jù)分區(qū)的過程稱為網(wǎng)格數(shù)據(jù)分區(qū)循環(huán)計算流程。
網(wǎng)格數(shù)據(jù)分區(qū)單次計算方法可以將滿足分區(qū)要求的計算次序?qū)木W(wǎng)格及其所有的上游網(wǎng)格根據(jù)分區(qū)數(shù)進行均等劃分,減輕在集群計算的過程中出現(xiàn)數(shù)據(jù)傾斜現(xiàn)象,并且在之后的計算過程中對參與分區(qū)的所有網(wǎng)格同時計算,不再需要大量的數(shù)據(jù)聚合操作,減少了數(shù)據(jù)交互的次數(shù)。網(wǎng)格數(shù)據(jù)分區(qū)單次計算流程如圖1所示。
圖1 網(wǎng)格數(shù)據(jù)分區(qū)單次計算流程
網(wǎng)格數(shù)據(jù)分區(qū)單次計算的具體過程如下所示:
(1)計算集群的最大并行數(shù)Max。記集群中共有N個同構(gòu)的計算機作為Worker節(jié)點,第CeilNum個節(jié)點中有Ei個Executor執(zhí)行器,每個執(zhí)行器有Ci個Core。集群的最大并行數(shù)由式(1)決定
(1)
(2)計算每個網(wǎng)格單元對應的所有上游網(wǎng)格坐標和數(shù)量。根據(jù)網(wǎng)格匯流流向參數(shù)計算出每個網(wǎng)格對應的所有上游網(wǎng)格坐標并以 “x1,y1,x2,y2…” 的格式存儲在字符串數(shù)組UpCeil中。遍歷UpCeil數(shù)組,其長度記為Len, 則該上游網(wǎng)格的個數(shù)為Len/2, 并用數(shù)組UpCeilLen存儲,即UpCeilLen[x][y]=k表示坐標為 (x,y) 的網(wǎng)格單元的上游網(wǎng)格為k個。
(3)計算每個網(wǎng)格計算次序?qū)木W(wǎng)格坐標及數(shù)量。令無上游網(wǎng)格的網(wǎng)格單元計算次序為1,其余網(wǎng)格的計算次序由上游網(wǎng)格的最大計算次序加1。每個計算次序?qū)木W(wǎng)格坐標以 “x1,y1,x2,y2…” 的格式存儲在字符串數(shù)組Order-Ceil中。計算每個網(wǎng)格計算次序?qū)木W(wǎng)格數(shù)量,用整型數(shù)組OrderCeilNum存儲。即OrderCeilNum[p]=q表示計算次序p對應網(wǎng)格個數(shù)為q個。
(4)初始化分區(qū)數(shù)。劃分的分區(qū)數(shù)用CeilNum表示,在模型計算初始化時令分區(qū)數(shù)為Max。
(5)從大到小選擇網(wǎng)格個數(shù)大于等于CeilNum的計算次序。如果該次序不存在,執(zhí)行CeilNum遞減操作,最大程度的利用集群資源。假設滿足條件的最大計算次序為P,對應的網(wǎng)格單元個數(shù)有K個,其中K≥CeilNum。 這K個網(wǎng)格單元對應的上游網(wǎng)格數(shù)量用集合T表示,如式(2)所示
T={c1,c2,c3,…,ck}
(2)
其中,ci表示第i個網(wǎng)格單元對應的上游網(wǎng)格數(shù)量。
(6)計算分區(qū)理想情況下的網(wǎng)格個數(shù)GNumequals并定義數(shù)據(jù)傾斜可接受范圍Q。數(shù)據(jù)傾斜即為分區(qū)之間數(shù)據(jù)量大小不同,Q越大表示分區(qū)之間數(shù)據(jù)大小差值的接受度越高。為了防止因Q過小出現(xiàn)無滿足條件的計算次序的問題,Q隨著循環(huán)計算次數(shù)的增加而增大,即每循環(huán)一次Q為原來的二倍。理想情況下各個分區(qū)網(wǎng)格個數(shù)GNumequals的計算方法如式(3)所示
(3)
(7)對于滿足條件的K個網(wǎng)格單元,將每個網(wǎng)格坐標及其對應上游網(wǎng)格坐標作為一個整體進行數(shù)據(jù)劃分,根據(jù)數(shù)組UpCeilLen中K個網(wǎng)格的上游網(wǎng)格長度將這K份網(wǎng)格盡可能均等劃分為CeilNum份,得到的分區(qū)網(wǎng)格數(shù)量可以用集合Nums表示,如式(4)所示
Nums{num1,num2,num3,…,numCeilNum}
(4)
其中,Numi表示第i個分區(qū)劃分得到的網(wǎng)格單元數(shù)量。
(8)若最終的分區(qū)個數(shù)小于等于集群最大并行數(shù)Max, 不再進行分區(qū)條件判斷,直接結(jié)束數(shù)據(jù)分區(qū)過程。否則需要對集合Nums中的網(wǎng)格個數(shù)進行判斷,若對于集合Nums中任意的numi, 都滿足式(5),則此次分區(qū)操作結(jié)束。否則意味著出現(xiàn)了不可接受的數(shù)據(jù)傾斜現(xiàn)象,需要重新進行網(wǎng)格數(shù)據(jù)分區(qū)操作,直到滿足條件為止。為了快速尋找到下一個滿足條件的計算次序,本方法將CeilNum的增量設置為Max, 即下次的分區(qū)操作的分區(qū)個數(shù)CeilNum=CeilNum+Max
GNumequals*(1-Q)≤numi≤GNumequals*(1+Q)
(5)
1.2節(jié)詳細的介紹了網(wǎng)格數(shù)據(jù)分區(qū)方法的單次計算流程,該方法在保證水文模擬過程正確的情況下,盡可能將網(wǎng)格動態(tài)劃分為多個大小相近、可以同時計算的網(wǎng)格集合。但是一次的網(wǎng)格分區(qū)操作并不能完成整個流域的水文模擬過程,因此,本小節(jié)設計了網(wǎng)格數(shù)據(jù)分區(qū)循環(huán)計算方法。該方法對上次分區(qū)結(jié)果對存儲網(wǎng)格信息變量進行更新并重新進行數(shù)據(jù)分區(qū)操作。網(wǎng)格數(shù)據(jù)分區(qū)循環(huán)計算具體的過程如下:
(1)初始化網(wǎng)格單元標志位參數(shù)flag[][]。 若flag[i][j]=0則表示坐標為 (i,j) 的網(wǎng)格未進行分區(qū)計算,若flag[i][j]=1則表示坐標為 (i,j) 的網(wǎng)格已經(jīng)完成分區(qū)計算。
(2)調(diào)用網(wǎng)格數(shù)據(jù)分區(qū)單次計算方法。由于上游網(wǎng)格信息更新取決于上次的數(shù)據(jù)分區(qū)涉及的網(wǎng)格,所以需要先進行一次數(shù)據(jù)分區(qū)操作。
(3)獲取網(wǎng)格數(shù)據(jù)分區(qū)操作中選擇的計算次序K。若K等于當前流域網(wǎng)格的最大計算次序,則說明所有網(wǎng)格計算完畢,結(jié)束數(shù)據(jù)分區(qū)循環(huán)操作。否則進入步驟(4)。
(4)獲取已分區(qū)網(wǎng)格坐標。對于步驟(2)計算過程中已進行分區(qū)的網(wǎng)格坐標使用字符串數(shù)組進行存儲,網(wǎng)格坐標形式依然為 “x,y”。 令flag[x][y]=1, 表示這些網(wǎng)格不再進行分區(qū)計算。
(5)遍歷計算次序大于K的網(wǎng)格對應的上游網(wǎng)格坐標,從中剔除flag為1的網(wǎng)格單元。根據(jù)更新之后的上游網(wǎng)格坐標數(shù)組UpCeil, 計算上游網(wǎng)格個數(shù)并對上游網(wǎng)格數(shù)量數(shù)組UpCeilLen進行更新。更新完之后再次調(diào)用網(wǎng)格數(shù)據(jù)劃分單次計算方法,直至步驟(3)中的計算次序等于流域網(wǎng)格的最大計算次序。
模型的總體結(jié)構(gòu)如圖2所示,共包括四大部分:模型參數(shù)描述規(guī)范、模型構(gòu)建及依賴描述規(guī)范、構(gòu)件任務調(diào)度及計算、計算結(jié)果整合。模型參數(shù)描述采用了NetCDF(network common data form)規(guī)范對網(wǎng)格水文模型參數(shù)進行統(tǒng)一的描述[11,12];模型構(gòu)件及依賴關(guān)系描述采用XML(extensible markup language)規(guī)范進行描述;構(gòu)件任務調(diào)度及計算指的是通過解析NetCDF的網(wǎng)格水文模型參數(shù)文件以及模型構(gòu)件及依賴關(guān)系描述文件,獲取參數(shù)與構(gòu)件信息,在分布式計算過程中采用不同的數(shù)據(jù)分區(qū)方法進行網(wǎng)格分區(qū),調(diào)用構(gòu)件計算文件進行計算;計算結(jié)果的整合以NetCDF的形式進行保存。
圖2 模型總體結(jié)構(gòu)
網(wǎng)格水文模型參數(shù)包括三大類型:模型參數(shù)、流域基本信息參數(shù)和流域?qū)崟r信息參數(shù)。
(1)模型參數(shù)
模型參數(shù)在程序設計中對應的是數(shù)值型變量。對標量參數(shù)的描述從變量標準名稱(standard_name)、單位(units)和取值范圍(valid_range)這3個方面進行描述。其中standard_name在參數(shù)描述中為必要屬性,valid屬性和units屬性為非必要屬性。
(2)流域基本信息參數(shù)
流域基本信息參數(shù)的存儲形式為二維數(shù)組。在上述信息描述的基礎(chǔ)上,從標準名稱(standard_name)、取值范圍(valid_range)、無效值(_FillValue)和單位(units)這4個方面對流域基本信息參數(shù)進行描述。
(3)流域?qū)崟r信息參數(shù)
流域?qū)崟r信息參數(shù)比流域基本信息參數(shù)多一維時間維度為三維數(shù)組。因此在流域基本信息描述的基礎(chǔ)上增加對時間序列的描述即為流域?qū)崟r信息參數(shù)的描述方法。流域?qū)崟r信息參數(shù)的時間序列分為兩種類型,一類由連續(xù)的時間序列構(gòu)成,這類數(shù)據(jù)的時間維度變量值可以為空,參數(shù)值的時間點個數(shù)根據(jù)模型參數(shù)中的開始時間、結(jié)束時間和時間間隔計算得出;第二類為包含間隔點的時間序列,當時間出現(xiàn)斷點的時候,需要用數(shù)組的形式對有記錄的時間點進行存儲。
網(wǎng)格水文模型一般是由多個構(gòu)件組成,根據(jù)各構(gòu)件的計算特點,將網(wǎng)格水文模型構(gòu)件分為獨立計算構(gòu)件、數(shù)據(jù)依賴構(gòu)件和參數(shù)聚合構(gòu)件。
獨立計算構(gòu)件是在單個網(wǎng)格單元中的計算過程并不涉及其它網(wǎng)格單元的參數(shù)信息的一類構(gòu)件,數(shù)據(jù)依賴構(gòu)件指的是在計算過程中需要依賴網(wǎng)格的上游網(wǎng)格的參數(shù)信息的一類構(gòu)件,參數(shù)聚合構(gòu)件用于各個構(gòu)件計算結(jié)果的聚合以及結(jié)果保存操作,負責將各個模塊的計算結(jié)果以NetCDF的形式保存到指定路徑中,不屬于按照水文模擬過程劃分的構(gòu)件。
網(wǎng)格水文模型的構(gòu)件(components)描述屬性一般包括構(gòu)件名稱(componentName)、構(gòu)件編號(conponentId)、構(gòu)件存儲路徑(componentPath)、構(gòu)件函數(shù)入口(componentFuction)、參數(shù)路徑(paramPath)、前置構(gòu)件標識(precoms)、結(jié)果輸出路徑(resultOutPath)、依賴參數(shù)標識(relParamId)、構(gòu)件計算類型(componentType)和構(gòu)件保存類型(saveType)這10個方面的基本信息,其中依賴參數(shù)標識為數(shù)據(jù)依賴構(gòu)件特有的子元素,用來存儲依賴參數(shù)的標識,便于依賴數(shù)據(jù)交互操作。構(gòu)件描述的結(jié)構(gòu)如圖3所示,其中componentType屬性取值有0、1和2這3種,0代表該構(gòu)件為獨立計算構(gòu)件,1代表該構(gòu)件為數(shù)據(jù)依賴構(gòu)件,2代表該構(gòu)件為參數(shù)聚合構(gòu)件;saveType屬性取值為0和1兩種,0代表exe存儲方式,1代表Jar包存儲方式。
2.3.1 獨立計算構(gòu)件分布式計算過程
獨立計算構(gòu)件的分布式計算相對簡單,不需要考慮網(wǎng)格單元之間的數(shù)據(jù)依賴問題。關(guān)于獨立計算構(gòu)件分布式計算流程具體步驟如下:
(1)獲取構(gòu)件計算所需參數(shù)。首先解析NetCDF文檔得到構(gòu)件計算所需參數(shù)。將解析到的流域基本和實時參數(shù)以網(wǎng)格為單位使用字符串數(shù)組的形式進行存儲。
(2)參數(shù)格式轉(zhuǎn)換。獲取網(wǎng)格參數(shù)信息之后,將其轉(zhuǎn)化為Spark的RDD的形式。解析網(wǎng)格參數(shù)字符串信息,獲取網(wǎng)格單元的計算次序作為Key,將整個參數(shù)字符串作為Value,將RDD轉(zhuǎn)換為PairRDD形式[13-15]。
(3)根據(jù)網(wǎng)格計算次序進行排序操作。該步驟主要是根據(jù)Key值對PairRDD進行排序,便于數(shù)據(jù)依賴構(gòu)件的計算。
(4)網(wǎng)格參數(shù)分區(qū)操作。獨立計算構(gòu)件使用Spark中自帶的HashPartitioner分區(qū)器進行分區(qū),因為該構(gòu)件計算與網(wǎng)格單元的計算次序無關(guān),所以不需要根據(jù)網(wǎng)格流向進行數(shù)據(jù)劃分。
(5)構(gòu)件計算。該步驟主要是執(zhí)行構(gòu)件算法的代碼,將解析之后的網(wǎng)格參數(shù)傳遞到構(gòu)件函數(shù)中。
(6)結(jié)果處理。完成步驟(5)之后就可以得到構(gòu)件的計算結(jié)果,計算結(jié)果一般為與時間相關(guān)的一組參數(shù)。構(gòu)件的計算結(jié)果以NetCDF的形式進行存儲。
2.3.2 數(shù)據(jù)依賴構(gòu)件分布式計算過程
數(shù)據(jù)依賴構(gòu)件的計算過程并不完全是網(wǎng)格獨立的,在計算過程中涉及到上游網(wǎng)格單元的計算結(jié)果,需要使用基于網(wǎng)格流向的Spark動態(tài)數(shù)據(jù)分區(qū)算法,可以減少各分區(qū)網(wǎng)格數(shù)量的差異,同一計算次序?qū)木W(wǎng)格及其上游網(wǎng)格也可以同時計算,從而提高模型的計算效率。數(shù)據(jù)依賴構(gòu)件分布式計算流程如圖4所示。
圖4 數(shù)據(jù)依賴構(gòu)件分布式計算流程
數(shù)據(jù)依賴構(gòu)件計算的具體過程如下:
(1)參數(shù)預處理。通過分析構(gòu)件計算流程,確定網(wǎng)格依賴參數(shù)。將讀取的參數(shù)轉(zhuǎn)化為Spark計算需要的PariRDD格式,其中Key為網(wǎng)格坐標,Value為參數(shù)值。
(2)動態(tài)數(shù)據(jù)分區(qū)方法進行分區(qū)操作。通過動態(tài)數(shù)據(jù)分區(qū)方法,確定每個Worker節(jié)點需要計算的網(wǎng)格,將對應的網(wǎng)格參數(shù)傳輸?shù)较鄳墓?jié)點上,Worker節(jié)點調(diào)用構(gòu)件計算接口,進行構(gòu)件計算,執(zhí)行完成之后將該網(wǎng)格的flag[x][y] 置為1。
(3)計算結(jié)果聚合。Master節(jié)點聚合各個Worker節(jié)點的計算結(jié)果,并將網(wǎng)格依賴的參數(shù)存儲到廣播變量中。
(4)更新廣播變量。步驟(3)所計算的網(wǎng)格單元的部分計算結(jié)果需要作為下一批網(wǎng)格的輸入?yún)?shù),對計算結(jié)果進行解析,獲取共享變量對應的計算結(jié)果并進行更新,將更新的結(jié)果重新分發(fā)出去。
(5)判斷網(wǎng)格是否計算完畢,若沒有計算完畢,則進行步驟(2)再次進行分布式計算操作,直至所有網(wǎng)格計算完成。
本節(jié)以網(wǎng)格新安江模型為實驗模型,以屯溪流域為實驗流域,實驗分為兩部分,第一部分驗證動態(tài)數(shù)據(jù)分區(qū)的有效性。第二部分驗證本文模型在Spark本地模式和Standalone模式下計算效率的提高。
第一部分實驗采用Java編寫的網(wǎng)格新安江水文模型對屯溪流域水文模擬的匯流過程數(shù)據(jù)分區(qū)進行對比,實驗數(shù)據(jù)為屯溪流域網(wǎng)格劃分數(shù)據(jù)、網(wǎng)格流向參數(shù)和網(wǎng)格單元計算次序參數(shù)。
實驗分別使用本文提出的基于網(wǎng)格匯流的Spark動態(tài)數(shù)據(jù)分區(qū)方法與基于集群最大并行數(shù)的Spark靜態(tài)數(shù)據(jù)分區(qū)方法對屯溪流域進行網(wǎng)格單元劃分,并對使用這兩種方法劃分得到的分區(qū)網(wǎng)格數(shù)量差異進行對比,設置分區(qū)數(shù)分別為4和6,Q為0.1。
4分區(qū)當且僅當計算次序為21時候滿足動態(tài)分區(qū)的閾值要求且并行數(shù)為4,將本次實驗的結(jié)果與Spark靜態(tài)分區(qū)方法進行對比,4分區(qū)結(jié)果對比如圖5所示。
圖5 4分區(qū)結(jié)果對比
如圖5所示,網(wǎng)格計算次序21對應的動態(tài)數(shù)據(jù)分區(qū)方法得到的分區(qū)結(jié)果的最大值331與最小值292的差值在平均值的10%以內(nèi),但是Spark靜態(tài)數(shù)據(jù)分區(qū)方法對應的分區(qū)網(wǎng)格個數(shù)的最大值504與最小值366的差值超過了平均值的20%。
6分區(qū)時需要8次分區(qū)即可完成屯溪流域網(wǎng)格的劃分操作。將前兩次分區(qū)數(shù)為6的分區(qū)結(jié)果合并與Spark靜態(tài)分區(qū)方法得到的分區(qū)結(jié)果進行對比,6分區(qū)結(jié)果對比如圖6所示。
圖6 6分區(qū)結(jié)果對比
圖6中的動態(tài)分區(qū)方法的結(jié)果各個分區(qū)的最大值與最小值的差值均小于平均值的10%;使用Spark靜態(tài)分區(qū)方法得到的分區(qū)結(jié)果的最大分區(qū)網(wǎng)格個數(shù)為388,最小分區(qū)網(wǎng)格個數(shù)為198,兩者之間的差值遠高于平均值的10%。
由第一部分實驗可以得到本文提出的動態(tài)數(shù)據(jù)分區(qū)方法能保持較好的分區(qū)數(shù)據(jù)平衡性,且適應于不同的分區(qū)數(shù)情況。通過與Spark靜態(tài)分區(qū)結(jié)果進行對比,驗證了本文方法在解決網(wǎng)格水文模型數(shù)據(jù)分區(qū)中的數(shù)據(jù)傾斜問題的有效性。
第二部分實驗分為兩組,第一組使用一臺PC機,內(nèi)存大小為24 G,CPU型號為i5-7900HQ。第二組集群由3臺1核CPU、4 G內(nèi)存虛擬機構(gòu)成,兩組實驗的分布式計算模型的分區(qū)數(shù)均為4。
(1)Spark本地模式本文方法與網(wǎng)格新安江模型串行計算方法對比。
對于第一組實驗中3天~27天的預熱期(從實測開始時間到預報開始時間的時間間隔),分別使用上述兩種模型對網(wǎng)格新安江模型進行計算,網(wǎng)格新安江模型計算時間結(jié)果對比如圖7所示。每一次計算的具體時間見表1。
圖7 網(wǎng)格新安江模型計算時間結(jié)果對比
由圖7和表1可知,隨著水文計算時間的延長,本文提出的網(wǎng)格水文模型分布式計算模型的優(yōu)勢逐步顯示出來。在預熱期小于24天的時候,與已有的網(wǎng)格新安江模型串行計算方法相比,分布式計算模型的加速比逐步增加。水文模擬時間為15天時,分布式計算模型的運行效率是串行計算模型計算效率的2.46倍,水文模擬時間達到24天時,計算效率提升至2.68倍。水文模擬時間為27天時,已有網(wǎng)格新安江模型串行計算方法出現(xiàn)了內(nèi)存溢出的情況,無法再進行模型計算,而分布式依然保持著較好的運行速率。
表1 串行計算與分布式計算方法結(jié)果
圖8為網(wǎng)格新安江模型長歷時水文模擬分布式計算方法運行結(jié)果圖,分別對1個月、2個月、3個月時長水文模擬進行計算。為了延長模型可計算的水文模擬時間,本模型根據(jù)計算的水文模擬時長度,每增長一個月的預熱期,就增加分區(qū)數(shù),即一個月水文模擬計算的分區(qū)數(shù)為4,兩個月水文模擬計算分區(qū)數(shù)為8,3個月水文模擬計算的分區(qū)數(shù)為12,防止單個任務過大引起的內(nèi)存溢出問題。
圖8 網(wǎng)格新安江模型長歷時水文模擬分布式計算運行時間結(jié)果
(2)Spark的Standalone模式下本文模型與基于網(wǎng)格計算次序并行化的計算思想實現(xiàn)的分布式計算模型對比。
由于實驗環(huán)境的限制,無法在Standalone模式下進行長時間的水文模擬計算。分別在Standalone集群模式下對3天水文模擬時長至27天水文模擬時長中的8組時長進行實驗。圖9為兩種方法在Standalone集群模式下的運行時間結(jié)果,每次計算的具體時間見表2。
表2 Standalone模式下模型計算時間結(jié)果
圖9 Standalone模式下模型計算時間結(jié)果
屯溪流域網(wǎng)格新安江模型的網(wǎng)格單元計算次序最大為100,在基于網(wǎng)格計算次序分布式計算模型中,對于相同計算次序的網(wǎng)格單元計算完成之后進行數(shù)據(jù)聚合操作,再進行
下一步的計算。因此,該模型在匯流構(gòu)件至少有100次數(shù)據(jù)聚合操作。而本文的分布式計算模型根據(jù)網(wǎng)格流向?qū)⒘饔蚓W(wǎng)格劃分為多個網(wǎng)格集合,在整個分布式計算過程中只需要4次的數(shù)據(jù)聚合操作,解決了因為頻繁的數(shù)據(jù)交互操作造成計算時間過長的現(xiàn)象。從表2可以看出,使用動態(tài)數(shù)據(jù)分區(qū)方法構(gòu)建的分布式計算模型,在Standalone集群模式下計算效率有大幅度的提升。
從上述兩組實驗可知,無論是在一臺計算機中使用Spark的本地模式還是由多臺計算機構(gòu)成的Standalone模式,本文提出的網(wǎng)格水文模型分布式計算模型均能夠明顯提高模型計算效率,且能夠有效延長水文模擬總體時長。在第二組實驗中,將網(wǎng)格新安江模型的數(shù)據(jù)交互次數(shù)從100降至4次,再次驗證了本文提出的基于網(wǎng)格流向的Spark動態(tài)數(shù)據(jù)分區(qū)方法在減少數(shù)據(jù)聚合操作方面的有效性。
為了提高網(wǎng)格水文模型的計算效率,本文致力于研究基于多臺性能有限的計算機集群環(huán)境下的網(wǎng)格水文模型高效計算方法,根據(jù)網(wǎng)格流向參數(shù)特點,提出了基于網(wǎng)格流向參數(shù)特點的動態(tài)數(shù)據(jù)分區(qū)方法,有效解決了網(wǎng)格水文模型分布式計算過程中出現(xiàn)的數(shù)據(jù)傾斜問題,并在此基礎(chǔ)上提出了基于Spark的網(wǎng)格水文模型分布式計算模型,并通過實驗驗證了該模型帶來的計算效果的提升。