陳金煥
(中國石油化工股份有限公司石油物探技術(shù)研究院,江蘇南京211103)
在地震勘探中,基于射線理論的地震初至波走時(shí)層析方法用于反演近地表速度模型,對靜校正量計(jì)算及偏移速度模型的建立至關(guān)重要。該算法適用于地形起伏較大、近地表結(jié)構(gòu)復(fù)雜的地區(qū),但是實(shí)現(xiàn)過程較復(fù)雜,計(jì)算量大、計(jì)算效率不高[1-3]。
經(jīng)過多年的研究,許多學(xué)者提出了多種優(yōu)化方法以提高近地表層析反演的計(jì)算效率,其中并行計(jì)算是解決層析反演存儲量大和計(jì)算量大的有效途徑之一。羅省賢等[4]使用消息傳遞接口(MPI)技術(shù)將求解大型稀疏矩陣方程的LSQR串行算法并行化,在地震表層速度模型層析反演中得到了有效應(yīng)用;張建中等[5]應(yīng)用MPI技術(shù)在Linux環(huán)境下實(shí)現(xiàn)了Fresnel層析成像的并行計(jì)算,具有較高的并行度和加速比;魏星等[6]應(yīng)用高性能計(jì)算系統(tǒng)進(jìn)行三維正演模擬,對模型進(jìn)行切割,將計(jì)算任務(wù)劃分至多節(jié)點(diǎn),通過MPI通信協(xié)同完成并行計(jì)算;蔡志成等[7]基于MPI并行變網(wǎng)格方法進(jìn)行大規(guī)模三維正演數(shù)值模擬,該方法能夠減少內(nèi)存消耗,提高效率。然而這種基于共享存儲、采用MPI并行的高性能計(jì)算方法存在一些不足:共享存儲的物理結(jié)構(gòu)決定了所有進(jìn)程都向主進(jìn)程傳遞規(guī)約數(shù)據(jù)體,當(dāng)并行進(jìn)程增多時(shí),極易形成網(wǎng)絡(luò)I/O競爭,不能通過擴(kuò)大集群規(guī)模提高計(jì)算效率[8];盡管MPI提供了并行計(jì)算標(biāo)準(zhǔn)及消息傳遞接口,但是程序員需要通盤考慮程序的容錯(cuò)性、可擴(kuò)展性、負(fù)載平衡等問題[9],使得程序設(shè)計(jì)及實(shí)現(xiàn)效果差異性較大。
近年來,隨著大數(shù)據(jù)技術(shù)的不斷發(fā)展,Spark技術(shù)逐漸應(yīng)用于地球物理的高性能計(jì)算領(lǐng)域。蔣楠[10]基于Spark大數(shù)據(jù)處理框架進(jìn)行了逆時(shí)偏移成像研究,在保證成像精度的前提下實(shí)現(xiàn)計(jì)算效率的提升;朱麗萍等[11]進(jìn)行了Spark框架下地震屬性處理方法研究,解決了單機(jī)環(huán)境下地震屬性計(jì)算效率低的問題。為了進(jìn)一步提高近地表層析反演的計(jì)算效率,增強(qiáng)該技術(shù)的生產(chǎn)應(yīng)用能力,本文在大數(shù)據(jù)技術(shù)研究的基礎(chǔ)上,提出了一種基于Spark技術(shù)的近地表層析反演實(shí)現(xiàn)方法,該方法充分利用Spark彈性分布式數(shù)據(jù)集(resilient distributed datasets,RDD)的技術(shù)特征,構(gòu)建基于RDD的數(shù)據(jù)組織及數(shù)據(jù)處理邏輯,將三維反演數(shù)據(jù)體扁平化為深度方向的一維反演數(shù)據(jù),作為分布式數(shù)據(jù)規(guī)約單元,有效解決了高性能環(huán)境下基于常規(guī)MPI并行實(shí)現(xiàn)產(chǎn)生的網(wǎng)絡(luò)I/O問題,提高了并行計(jì)算效率。
近地表層析反演的基本原理是將地下模型分解成一系列網(wǎng)格化的基本速度單元體,通常依據(jù)地震初至波射線追蹤進(jìn)行正演,以實(shí)際走時(shí)與正演走時(shí)之差迭代反演所有單元體的速度。主要步驟如下:①在完成初至拾取的基礎(chǔ)上,建立慢度模型;②根據(jù)觀測系統(tǒng)參數(shù),正演計(jì)算所有炮的射線路徑和旅行時(shí);③根據(jù)實(shí)際走時(shí)與正演走時(shí)之差以及射線路徑,利用同時(shí)迭代重建技術(shù)(simultaneous iterative reconstruction technique,SIRT)[12]計(jì)算各基本速度單元的慢度修正量;④利用慢度修正量修正慢度模型;⑤如果走時(shí)殘差無法達(dá)到給定標(biāo)準(zhǔn),則重新正演,否則輸出速度模型。
上述步驟中射線追蹤正演最為耗時(shí),其計(jì)算時(shí)間與速度模型體、單炮道數(shù)以及三維網(wǎng)格單元體的不同面上射線穿過的節(jié)點(diǎn)密度等都有關(guān)系。在某些工區(qū),單炮計(jì)算時(shí)間多達(dá)30 s,甚至更多,當(dāng)炮集數(shù)據(jù)達(dá)到1.0×105炮時(shí),串行運(yùn)行至少需要833 h才能完成一次迭代。事實(shí)上這些影響因素在不同炮內(nèi)互不影響,可以采用并行計(jì)算解決這些問題,且理論上并行節(jié)點(diǎn)越多,計(jì)算效率越高。
基于MPI的近地表層析反演常規(guī)并行程序設(shè)計(jì)通常基于共享存儲,并行程序在結(jié)構(gòu)上采用主從模式,主進(jìn)程承擔(dān)組織分配、數(shù)據(jù)收集、數(shù)據(jù)規(guī)約、模型平滑等工作,從進(jìn)程承擔(dān)計(jì)算工作。在通信方面,采用標(biāo)準(zhǔn)通信模式,調(diào)用MPI消息傳遞庫函數(shù)MPI_SEND()和MPI_RECV()分別實(shí)現(xiàn)對數(shù)據(jù)的發(fā)送和接收。
圖1為基于MPI技術(shù)的近地表層析反演并行實(shí)現(xiàn)流程圖。中間為主進(jìn)程,左、右為從進(jìn)程。其中,藍(lán)色箭頭表示主進(jìn)程使用MPI_SEND()函數(shù)分發(fā)各從進(jìn)程的計(jì)算任務(wù),即有效炮集野外文件號(ffid)列表;綠色箭頭表示從進(jìn)程使用MPI_RECV()函數(shù)傳遞其計(jì)算的中間數(shù)據(jù)給主進(jìn)程,主進(jìn)程收集全部通信信息后,求解慢度變化體,更新速度模型體;粉色箭頭表示當(dāng)走時(shí)殘差不滿足條件時(shí),需要進(jìn)行迭代,主進(jìn)程通過MPI_SEND()函數(shù)傳遞給所有從進(jìn)程更新后的速度模型和繼續(xù)迭代的指令,進(jìn)入下一次迭代;黃色箭頭表示當(dāng)走時(shí)殘差滿足條件或者達(dá)到迭代次數(shù)上限時(shí),主進(jìn)程通過MPI_SEND()函數(shù)傳遞給所有從進(jìn)程結(jié)束工作的指令,主進(jìn)程輸出速度模型和射線密度模型,程序結(jié)束。
圖1 基于MPI技術(shù)的近地表層析反演并行實(shí)現(xiàn)流程
當(dāng)所有進(jìn)程并行完成各自的計(jì)算任務(wù)后,中間結(jié)果以網(wǎng)絡(luò)通信方式傳遞給主進(jìn)程,生成慢度變化體和走時(shí)殘差。當(dāng)所有從進(jìn)程的反演數(shù)據(jù)體傳遞給主進(jìn)程時(shí),如綠色箭頭線所示,傳輸速率將受限于網(wǎng)絡(luò)傳輸量、網(wǎng)絡(luò)帶寬、主進(jìn)程所在節(jié)點(diǎn)的性能上限等。具體表現(xiàn)為:①由于共享存儲的I/O帶寬有限,當(dāng)層析反演數(shù)據(jù)規(guī)模不變時(shí),使用更多的計(jì)算節(jié)點(diǎn)雖然能夠有效縮短計(jì)算時(shí)間,但I(xiàn)/O量也隨之增長,當(dāng)節(jié)點(diǎn)規(guī)模持續(xù)增大時(shí),必將導(dǎo)致I/O競爭,甚至堵塞;②高性能計(jì)算環(huán)境中,每個(gè)計(jì)算節(jié)點(diǎn)一般采用相同的物理配置,因此每次迭代,各個(gè)計(jì)算節(jié)點(diǎn)完成反演體計(jì)算的時(shí)間基本相同,傳輸過程中幾乎所有從進(jìn)程同時(shí)向主進(jìn)程發(fā)送規(guī)約請求,此時(shí)程序從計(jì)算密集階段進(jìn)入I/O密集階段,會表現(xiàn)出明顯的突發(fā)I/O特性,短時(shí)間內(nèi)產(chǎn)生大量的I/O請求,甚至超過存儲系統(tǒng)的最大處理能力,造成嚴(yán)重的I/O競爭,降低了I/O效率。
Spark最初是在2009年由UC Berkeley AMP實(shí)驗(yàn)室在Hadoop MapReduce基礎(chǔ)上提出的高效大數(shù)據(jù)并行計(jì)算技術(shù)。目前Spark已經(jīng)成為Apache基金會的一個(gè)頂級開源工程軟件,并成為互聯(lián)網(wǎng)領(lǐng)域廣為使用的基于內(nèi)存的大數(shù)據(jù)并行計(jì)算系統(tǒng)[13]。
大數(shù)據(jù)計(jì)算環(huán)境具有分布式存儲、統(tǒng)一資源管理和并行計(jì)算框架等特征。結(jié)合地球物理反問題特點(diǎn),基于Spark技術(shù)的大數(shù)據(jù)環(huán)境可以利用下述5個(gè)特征提高算法計(jì)算效率。
1)Spark的核心概念是RDD,它能統(tǒng)一使用集群上各節(jié)點(diǎn)內(nèi)存,充分利用集群總體內(nèi)存存儲數(shù)據(jù);
2)Spark程序的核心是描述RDD分區(qū)的數(shù)據(jù)變換及RDD的生成邏輯鏈條有向無環(huán)圖(directed acyclic graph,DAG),尤其適合迭代型高性能計(jì)算的算法實(shí)現(xiàn);
3)Spark與Hadoop無縫集成,充分利用Hadoop分布式資源調(diào)度機(jī)制,使得計(jì)算最大程度地向數(shù)據(jù)遷移,這樣能有效減緩網(wǎng)絡(luò)I/O壓力,提高數(shù)據(jù)I/O效率;
4)Spark具有高度的容錯(cuò)機(jī)制,若出現(xiàn)個(gè)別節(jié)點(diǎn)異常,可根據(jù)RDD血統(tǒng)在其它節(jié)點(diǎn)對丟失的數(shù)據(jù)進(jìn)行恢復(fù),有利于提高算法實(shí)現(xiàn)的穩(wěn)定性;
5)Spark基于Scala語言開發(fā),Scala是一種基于Java虛擬機(jī)(java virtual machine,JVM)純面向?qū)ο笳Z言,完全兼容Java,對于計(jì)算密集型算法可采用Java本地接口(java native interface,JNI)集成相應(yīng)的C++算法,提高計(jì)算效率。
本文算法具體實(shí)現(xiàn)過程如圖2所示,其中,ffidi表示第i炮的野外文件號,通過多次正反演迭代逼近實(shí)際地下速度。相對于基于共享存儲、常規(guī)MPI并行的實(shí)現(xiàn)方式,在大數(shù)據(jù)環(huán)境下基于分布式存儲,采用Spark并行技術(shù)的程序設(shè)計(jì)過程包含持久化炮屬性信息、復(fù)雜核心算法實(shí)現(xiàn)、設(shè)計(jì)規(guī)約邏輯和基于Spark Shuffle實(shí)現(xiàn)規(guī)約邏輯幾部分。文中所使用的數(shù)據(jù)結(jié)構(gòu)定義如下。
圖2 近地表層析反演算法流程
2.2.1 持久化炮屬性信息
根據(jù)層析反演算法,每次迭代都要使用炮屬性信息。在單機(jī)中或是基于MPI并行方法中,通常實(shí)時(shí)計(jì)算獲取該數(shù)據(jù)信息,但用時(shí)較長。本文利用分布式內(nèi)存管理技術(shù)存儲中間數(shù)據(jù)的特征,計(jì)算一次,然后持久化到分布式內(nèi)存中。采用的持久化級別為MEMORY_AND_DISK,即當(dāng)內(nèi)存不足時(shí),存放到磁盤,因此能充分利用內(nèi)存空間,減少計(jì)算時(shí)間。例如,某測試數(shù)據(jù)共3 317炮,每炮3 200道,需要持久化的炮屬性信息數(shù)據(jù)量為493.6 MB,若在具有13個(gè)計(jì)算節(jié)點(diǎn)的集群上進(jìn)行如下資源配置:每個(gè)計(jì)算節(jié)點(diǎn)啟動2個(gè)執(zhí)行(Executor)進(jìn)程,單個(gè)進(jìn)程的內(nèi)存為5 GB,一個(gè)執(zhí)行進(jìn)程中同時(shí)運(yùn)行兩個(gè)任務(wù)(Task)線程。在這種條件下,一次迭代計(jì)算炮屬性信息時(shí)間為102 s,持久化炮屬性信息時(shí)間則為30 s,因此,迭代次數(shù)越多,節(jié)省的計(jì)算用時(shí)就越多。
2.2.2 復(fù)雜核心算法實(shí)現(xiàn)
層析反演算法中,炮檢關(guān)系匹配、射線追蹤、速度模型平滑等算法較為耗時(shí)。本文以C++函數(shù)實(shí)現(xiàn),程序設(shè)計(jì)時(shí)采用JNI接口調(diào)用,并通過序列化和反序列化進(jìn)行C++和Java空間內(nèi)的數(shù)據(jù)傳輸和交換,充分利用C++程序執(zhí)行效率高的優(yōu)勢,提高層析反演方法的運(yùn)行效率。
2.2.3 設(shè)計(jì)規(guī)約邏輯
常規(guī)MPI并行方法以反演數(shù)據(jù)體為基本規(guī)約單元,如1.2節(jié)介紹,每個(gè)從進(jìn)程在計(jì)算任務(wù)結(jié)束后將反演數(shù)據(jù)體通過網(wǎng)絡(luò)傳輸給主進(jìn)程,反演數(shù)據(jù)體包含大量的無效數(shù)據(jù),傳輸過程中,過多的無效數(shù)據(jù)加劇了網(wǎng)絡(luò)I/O競爭,降低了網(wǎng)絡(luò)I/O性能。因此只傳輸有效數(shù)據(jù)是解決網(wǎng)絡(luò)I/O瓶頸的關(guān)鍵。
本文以深度方向的一維反演數(shù)據(jù)作為規(guī)約基本單元,且只對有效數(shù)據(jù)進(jìn)行規(guī)約。在Spark并行計(jì)算中使用flatMap算子高效地將三維反演數(shù)據(jù)體扁平化為深度方向的一維反演數(shù)據(jù)集合。
2.2.4 基于Spark Shuffle實(shí)現(xiàn)規(guī)約邏輯
文中規(guī)約邏輯的實(shí)現(xiàn)在執(zhí)行過程中分為兩個(gè)階段,同一節(jié)點(diǎn)上所有以主測線和聯(lián)絡(luò)線平面上搜索網(wǎng)格點(diǎn)(ILm,XLn)為鍵(Key)的規(guī)約基本單元進(jìn)行規(guī)約;不同節(jié)點(diǎn)上同一搜索網(wǎng)格點(diǎn)規(guī)約后的深度方向的一維反演數(shù)據(jù)再進(jìn)行規(guī)約。兩個(gè)階段的特點(diǎn)如下。
1)避免同一節(jié)點(diǎn)內(nèi)的各進(jìn)程出現(xiàn)網(wǎng)絡(luò)I/O。
如圖3所示,紅色范圍表示第i炮的覆蓋范圍,綠色范圍表示第j炮的覆蓋范圍,兩炮中有一部分重合,定義紅色點(diǎn)標(biāo)識搜索網(wǎng)格點(diǎn)為(ILm,XLn),假設(shè)某一計(jì)算節(jié)點(diǎn)啟動兩個(gè)執(zhí)行進(jìn)程,一個(gè)進(jìn)程負(fù)責(zé)計(jì)算第i炮的反演體,另一個(gè)進(jìn)程負(fù)責(zé)計(jì)算第j炮的反演體,通過扁平化操作后,兩炮中以(ILm,XLn)為Key的規(guī)約基本單元數(shù)據(jù)不同,規(guī)約后的值稱為對應(yīng)搜索網(wǎng)格點(diǎn)(ILm,XLn)的規(guī)約深度方向的一維反演數(shù)據(jù)。
圖3 集群某一節(jié)點(diǎn)上深度方向的一維反演數(shù)據(jù)的規(guī)約過程
Spark技術(shù)提供兩種不同的算子完成上述功能,分別為groupByKey和reduceByKey,本文選擇reduceByKey執(zhí)行規(guī)約操作,這是由于在規(guī)約階段前,reduceByKey會在RDD存在的每個(gè)節(jié)點(diǎn)上對每一個(gè)Key做一次聚合,即輸出一個(gè)中間結(jié)果,規(guī)約之后,reduceByKey算子內(nèi)的匿名函數(shù)被調(diào)用,此時(shí)會將RDD所有分區(qū)中間結(jié)果做規(guī)約,從而產(chǎn)生一個(gè)最終的結(jié)果。groupByKey算子只是簡單地把搜索網(wǎng)格點(diǎn)為(ILm,XLn)的鍵值對放在一起,并不做任何額外的操作,因此所有的鍵值對都被規(guī)約,使得網(wǎng)絡(luò)傳輸數(shù)據(jù)量增多,網(wǎng)絡(luò)I/O量增大。
2)減少主節(jié)點(diǎn)規(guī)約I/O量。
利用Spark Shuffle減少主節(jié)點(diǎn)數(shù)據(jù)規(guī)約量。程序設(shè)計(jì)中不是所有的節(jié)點(diǎn)都同時(shí)鏈接主節(jié)點(diǎn),而是不同網(wǎng)格位置的反演數(shù)據(jù)在不同的節(jié)點(diǎn)間規(guī)約,如圖4所示。所有節(jié)點(diǎn)以粉色點(diǎn)標(biāo)識位置作為Key的反演數(shù)據(jù),都規(guī)約到節(jié)點(diǎn)1上,所有節(jié)點(diǎn)以黑色點(diǎn)標(biāo)識位置作為Key的反演數(shù)據(jù),都規(guī)約到節(jié)點(diǎn)2上,同理,所有節(jié)點(diǎn)以紫色點(diǎn)標(biāo)識位置作為Key的反演數(shù)據(jù),都規(guī)約到節(jié)點(diǎn)3上。這種規(guī)約方式能夠有效減少瞬間所有節(jié)點(diǎn)都與主節(jié)點(diǎn)鏈接的壓力,降低網(wǎng)絡(luò)I/O堵塞發(fā)生的概率。
圖4 基于Spark技術(shù)的近地表層析反演實(shí)現(xiàn)在集群間進(jìn)行數(shù)據(jù)規(guī)約過程
根據(jù)前文對層析反演算法數(shù)據(jù)流的分析和并行規(guī)約邏輯的闡述,文中共設(shè)計(jì)8類不同的RDD,如表1 所示。有效炮集列表RDD描述工區(qū)內(nèi)有效炮集野外文件號列表集合;炮屬性RDD描述炮屬性信息集合;反演體RDD描述所有炮的反演數(shù)據(jù)體集合;一維反演數(shù)據(jù)RDD是反演數(shù)據(jù)體RDD中有效數(shù)據(jù)的扁平化形式,即一系列的基本規(guī)約單元集合;一維規(guī)約反演數(shù)據(jù)RDD是對所有一維反演數(shù)據(jù)RDD的規(guī)約,采用2.2節(jié)中的方式進(jìn)行規(guī)約;旅行時(shí)殘差RDD描述了旅行時(shí)殘差值‖ΔT‖iter;慢度變化體RDD描述了根據(jù)一維反演數(shù)據(jù)計(jì)算得到的慢度變化體;射線密度體RDD描述迭代中的射線密度模型。
表1 基于Spark技術(shù)的近地表層析反演RDD數(shù)據(jù)操作及特點(diǎn)
當(dāng)所有RDD設(shè)計(jì)完成后,按照圖5所示的有向無環(huán)圖實(shí)現(xiàn)基于Spark技術(shù)的層析反演計(jì)算,該圖隨著迭代次數(shù)的增多而變長,其依賴關(guān)系明確,當(dāng)某一塊數(shù)據(jù)丟失時(shí),可以根據(jù)上述依賴關(guān)系重新生成所需數(shù)據(jù),其中綠色模塊表示持久化的中間數(shù)據(jù)。
圖5 基于Spark技術(shù)的近地表層析反演一次迭代過程的有向無環(huán)圖
圖6給出了大數(shù)據(jù)環(huán)境下基于Spark技術(shù)的近地表層析反演并行實(shí)現(xiàn)流程,其在集群上的實(shí)現(xiàn)過程主要包含以下步驟:
圖6 大數(shù)據(jù)環(huán)境下基于Spark技術(shù)的近地表層析反演并行實(shí)現(xiàn)流程
1)主節(jié)點(diǎn)負(fù)責(zé)進(jìn)行炮檢關(guān)系匹配、初始速度模型平滑、工區(qū)內(nèi)ffid列表收集等任務(wù),并向其它執(zhí)行節(jié)點(diǎn)廣播初始速度模型,由于節(jié)點(diǎn)內(nèi)的不同進(jìn)程可以共享數(shù)據(jù),因此向各執(zhí)行節(jié)點(diǎn)廣播一次即可;
2)Spark調(diào)度器根據(jù)有向無環(huán)圖在各個(gè)執(zhí)行節(jié)點(diǎn)分配計(jì)算任務(wù),主節(jié)點(diǎn)通過調(diào)用SparkContext的parallelize方法,創(chuàng)建有效炮集列表RDD,并根據(jù)初至數(shù)據(jù)所在位置將任務(wù)分發(fā)給各個(gè)節(jié)點(diǎn)的執(zhí)行進(jìn)程;
3)每個(gè)執(zhí)行進(jìn)程首先整理并持久化炮屬性信息,然后以單炮為單位進(jìn)行射線追蹤,得到反演數(shù)據(jù)體RDD;
4)Spark調(diào)度器在每個(gè)執(zhí)行進(jìn)程中將反演數(shù)據(jù)體RDD扁平化為一維反演數(shù)據(jù)RDD,該RDD的每個(gè)分區(qū)是深度方向的一維反演數(shù)據(jù);
5)Spark調(diào)度器在各個(gè)節(jié)點(diǎn)對一維反演數(shù)據(jù)進(jìn)行規(guī)約,形成一維規(guī)約反演數(shù)據(jù)RDD;
6)Spark調(diào)度器在各個(gè)節(jié)點(diǎn)執(zhí)行reduce操作,生成旅行時(shí)殘差值,reduce后的一維規(guī)約反演數(shù)據(jù)仍舊分布在各個(gè)節(jié)點(diǎn);
7)主節(jié)點(diǎn)對一維規(guī)約反演數(shù)據(jù)執(zhí)行collect操作,將各個(gè)執(zhí)行節(jié)點(diǎn)上的規(guī)約數(shù)據(jù)收集到主節(jié)點(diǎn),計(jì)算出慢度變化體和射線密度體,并根據(jù)慢度變化體求出速度模型體,對其進(jìn)行平滑,根據(jù)旅行時(shí)殘差值確定是否進(jìn)入下一次迭代。
為驗(yàn)證本文基于Spark技術(shù)的近地表層析反演程序設(shè)計(jì)應(yīng)用效果,選取國內(nèi)西南地區(qū)A工區(qū)實(shí)際資料進(jìn)行測試。工區(qū)地表高程變化比較大,有些地表基巖出露,靜校正問題比較嚴(yán)重。該數(shù)據(jù)共48 286炮,所需參數(shù)如2.2.3節(jié)所述。測試集群包含125個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)配有2塊16核CPU,型號為Intel?Xeon?CPU E%-2682 v4@2.50 GHz,單個(gè)節(jié)點(diǎn)內(nèi)存256 GB;Spark作業(yè)并行進(jìn)程數(shù)目為2 000,執(zhí)行進(jìn)程的內(nèi)存配置為16 GB,每個(gè)節(jié)點(diǎn)上啟動16個(gè)進(jìn)程。
圖7給出了采用相同的輸入數(shù)據(jù)和參數(shù)得到的基于Spark技術(shù)的近地表層析反演速度模型與基于MPI技術(shù)的近地表層析反演速度模型差值。兩條剖面為第201條主測線和第198條聯(lián)絡(luò)線,整體誤差范圍位于[-0.001,0.001],局部誤差值較小且具有隨機(jī)性,表明反演結(jié)果一致。
圖7 基于Spark技術(shù)計(jì)算的近地表速度模型與基于MPI計(jì)算的近地表速度模型差值
以該工區(qū)為例,對比分析采用MPI并行技術(shù)和Spark并行技術(shù)隨著計(jì)算節(jié)點(diǎn)增多時(shí)程序的計(jì)算性能。令主測線方向、聯(lián)絡(luò)線方向和深度方向的網(wǎng)格距分別為50,50,10 m,3個(gè)方向的網(wǎng)格數(shù)目分別為429,401,251,在這種網(wǎng)格規(guī)模下,速度模型大小為328.7 MB。基于MPI并行計(jì)算和基于Spark并行計(jì)算的層析反演程序分別在5節(jié)點(diǎn)、20節(jié)點(diǎn)、40節(jié)點(diǎn)、60節(jié)點(diǎn)、80節(jié)點(diǎn)和100節(jié)點(diǎn)集群規(guī)模下運(yùn)行,迭代次數(shù)為30次,每個(gè)節(jié)點(diǎn)內(nèi)存為256 GB,配有2塊16核CPU。表2給出了在MPI并行框架和Spark并行框架下該工區(qū)不同計(jì)算節(jié)點(diǎn)的網(wǎng)絡(luò)I/O量和程序運(yùn)行總時(shí)間。圖8給出了不同并行框架下的運(yùn)行時(shí)間和并行加速比。
由表2和圖8可以看出:
表2 不同并行框架下集群規(guī)模與網(wǎng)絡(luò)I/O量及程序運(yùn)行時(shí)間
1)隨著節(jié)點(diǎn)規(guī)模的不斷擴(kuò)大,兩種并行實(shí)現(xiàn)的網(wǎng)絡(luò)I/O量都會增加,但Spark并行實(shí)現(xiàn)的網(wǎng)絡(luò)I/O量只有常規(guī)MPI并行實(shí)現(xiàn)的1/500~1/120,且節(jié)點(diǎn)規(guī)模越多,網(wǎng)絡(luò)I/O量占比越小,因此,Spark并行框架下通過網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量相對于MPI并行具有明顯優(yōu)勢;
2)隨著節(jié)點(diǎn)規(guī)模的不斷擴(kuò)大,尤其是從5節(jié)點(diǎn)增加至40節(jié)點(diǎn)時(shí),兩種并行實(shí)現(xiàn)程序的運(yùn)行時(shí)間都在大幅減小,當(dāng)節(jié)點(diǎn)規(guī)模繼續(xù)擴(kuò)大時(shí)(達(dá)到80左右),MPI并行實(shí)現(xiàn)程序由于出現(xiàn)了網(wǎng)絡(luò)I/O風(fēng)暴導(dǎo)致程序運(yùn)行時(shí)間延長,而Spark并行實(shí)現(xiàn)程序隨著并行節(jié)點(diǎn)的增多,程序運(yùn)行時(shí)間不斷減少,當(dāng)節(jié)點(diǎn)規(guī)模達(dá)到100時(shí),Spark并行程序運(yùn)行時(shí)間只有MPI并行程序運(yùn)行時(shí)間的1/4;
3)隨著節(jié)點(diǎn)規(guī)模的不斷擴(kuò)大,基于Spark技術(shù)的層析反演和基于MPI的層析反演實(shí)現(xiàn)的并行加速比都逐步增大,MPI并行的加速比先增大后降低,Spark并行的加速比呈現(xiàn)類線性增長的趨勢,總體上,節(jié)點(diǎn)規(guī)模越多,Spark并行計(jì)算相對于常規(guī)MPI并行計(jì)算的運(yùn)行效率越高。
大數(shù)據(jù)環(huán)境下的Spark技術(shù)在地震勘探中的應(yīng)用尚處于起步階段,雖然在地震數(shù)據(jù)屬性提取、地震偏移成像等方面已經(jīng)有一些研究,但還沒有像互聯(lián)網(wǎng)領(lǐng)域的應(yīng)用那么成功。本文針對常規(guī)MPI并行程序設(shè)計(jì)在近地表速度模型層析反演方面存在的不足,采用Spark技術(shù)進(jìn)行并行實(shí)現(xiàn)。
通過與基于共享存儲、常規(guī)MPI并行計(jì)算層析反演實(shí)現(xiàn)方式的對比,基于Spark技術(shù)的并行實(shí)現(xiàn),以一維深度方向的反演數(shù)據(jù)為基本單位的分布式規(guī)約效果明顯,均衡了網(wǎng)絡(luò)I/O量,有效解決了隨著計(jì)算節(jié)點(diǎn)數(shù)的增大,常規(guī)MPI高性能計(jì)算環(huán)境下近地表層析反演并行計(jì)算導(dǎo)致的網(wǎng)絡(luò)I/O瓶頸問題,實(shí)現(xiàn)了并行加速比的類線性增長。
近地表速度模型層析反演是一類迭代型密集計(jì)算問題,本文基于Spark大數(shù)據(jù)技術(shù),構(gòu)建了基于RDD的數(shù)據(jù)組織及數(shù)據(jù)處理邏輯,形成了多次迭代的DAG,該并行實(shí)現(xiàn)思路和實(shí)現(xiàn)框架具有較好的穩(wěn)定性和對大規(guī)模集群的適應(yīng)性,為地震資料處理領(lǐng)域迭代型密集計(jì)算的實(shí)現(xiàn)提供了一種可借鑒的解決方案。