蔣 楠
(中國(guó)石油化工集團(tuán)有限公司信息和數(shù)字化管理部,北京100728)
地震逆時(shí)偏移成像計(jì)算是一種計(jì)算密集和數(shù)據(jù)密集的算法,因此地震逆時(shí)偏移成像技術(shù)的推廣應(yīng)用在很大程度上依賴于高性能計(jì)算技術(shù)的發(fā)展[1-3]。近年來(lái),隨著計(jì)算機(jī)技術(shù)的不斷發(fā)展,計(jì)算機(jī)的計(jì)算性能也隨之有了較大提升,與此同時(shí),多種并行計(jì)算框架的發(fā)展為高性能計(jì)算提供了強(qiáng)大的技術(shù)支持[4-6],持續(xù)推動(dòng)了地震逆時(shí)偏移成像技術(shù)的快速發(fā)展。FOLTINEK等[7]分析了基于GPU的逆時(shí)偏移在計(jì)算性能上的明顯優(yōu)勢(shì)。ARAYA-POLO[8]提出了基于眾核處理器的三維疊前逆時(shí)深度偏移成像技術(shù)??紫閷幍萚9]提出了利用多GPU聯(lián)合的并行計(jì)算技術(shù)加速逆時(shí)偏移算法。李博等[10]提出了利用CPU/GPU作為數(shù)值計(jì)算中心并建立隨機(jī)邊界模型,提升了逆時(shí)偏移的計(jì)算效率。張向陽(yáng)等[11]基于GPU實(shí)現(xiàn)了逆時(shí)偏移的并行加速算法并與單程波動(dòng)方程偏移進(jìn)行了對(duì)比分析,證明了基于GPU的逆時(shí)偏移的高效性。總的來(lái)看,目前主要的效率優(yōu)化方式采取的是集中存儲(chǔ)框架下聯(lián)合GPU的并行策略,解決的是偏移算法中的計(jì)算密集問(wèn)題。而隨著地震勘探目標(biāo)的日益復(fù)雜,勘探技術(shù)向精細(xì)化發(fā)展,單點(diǎn)高密度地震等技術(shù)的成功應(yīng)用使得地震采集的數(shù)據(jù)量成倍增加,常規(guī)計(jì)算框架的數(shù)據(jù)集中存儲(chǔ)方式難以滿足生產(chǎn)要求。此外,地震數(shù)據(jù)處理周期不斷縮短,要求地震處理技術(shù)能夠融合更多最新的計(jì)算機(jī)技術(shù),以更大程度提高地震處理技術(shù)的計(jì)算效率。分布式并行框架是一種可有效支持?jǐn)?shù)據(jù)密集型應(yīng)用程序的框架,可進(jìn)行海量數(shù)據(jù)的并行運(yùn)算。Spark框架作為一種典型的分布式并行框架由伯克利大學(xué)開(kāi)發(fā),屬于該校的研究性項(xiàng)目,由于其計(jì)算的優(yōu)越性已經(jīng)被應(yīng)用于多個(gè)領(lǐng)域,如聚類算法、文本分類以及數(shù)據(jù)監(jiān)測(cè)和分析等[13-16]。
為了進(jìn)一步提高逆時(shí)偏移成像技術(shù)的計(jì)算效率,增強(qiáng)技術(shù)的生產(chǎn)應(yīng)用能力,本文以Spark框架為基礎(chǔ),充分利用分布式文件存儲(chǔ)系統(tǒng)海量數(shù)據(jù)管理以及Spark并行框架分布式內(nèi)存計(jì)算高效等優(yōu)勢(shì),形成了一套計(jì)算高效的逆時(shí)偏移成像處理技術(shù)。
逆時(shí)偏移成像是一種全波場(chǎng)成像技術(shù),而其算法核心則是正演問(wèn)題,對(duì)應(yīng)的三維聲波方程為:
(1)
式中:u為地表記錄的壓力波場(chǎng);v為縱橫向可變的介質(zhì)速度。
成像條件的選擇是地震偏移成像算法的關(guān)鍵之一,可采用互相關(guān)算法進(jìn)行成像,即對(duì)同一時(shí)刻的接收點(diǎn)外推波場(chǎng)uR(x,y,z,t)和震源外推波場(chǎng)uS(x,y,z,t)進(jìn)行互相關(guān)計(jì)算,得到成像值,如下式:
(2)
式中,被積函數(shù)uR(x,y,z,t)uS(x,y,z,t)表示t時(shí)刻對(duì)波場(chǎng)做一次成像運(yùn)算,積分說(shuō)明成像空間I(x,y,z)中的像是多個(gè)時(shí)間步長(zhǎng)成像的疊加。
逆時(shí)偏移成像的實(shí)現(xiàn)過(guò)程主要包括震源波場(chǎng)正向延拓,接收點(diǎn)波場(chǎng)反向延拓以及互相關(guān)成像3個(gè)部分。計(jì)算時(shí)以單個(gè)炮集為基本單元,每一個(gè)炮集的偏移計(jì)算相互獨(dú)立,各個(gè)進(jìn)程無(wú)需進(jìn)行數(shù)據(jù)交換。不同計(jì)算節(jié)點(diǎn)之間任務(wù)的起止時(shí)間互不影響,而且同一個(gè)計(jì)算節(jié)點(diǎn)可以持續(xù)獲取數(shù)據(jù)進(jìn)行計(jì)算,不必等待其它計(jì)算節(jié)點(diǎn)的任務(wù)同步,這種多數(shù)據(jù)單程序的算法特征具有較強(qiáng)的并行性,能在多種并行框架中實(shí)現(xiàn)。逆時(shí)偏移成像的并行計(jì)算流程如圖1所示,將單炮數(shù)據(jù)進(jìn)行任務(wù)分配,各個(gè)進(jìn)程完成各自作業(yè)后對(duì)成像結(jié)果進(jìn)行規(guī)約,得到最終的成像結(jié)果。
圖1 逆時(shí)偏移成像的并行計(jì)算流程
目前主要有3種高性能計(jì)算框架及并行編程接口可以實(shí)現(xiàn)逆時(shí)偏移算法的并行計(jì)算,分別是MPI,MapReduce,Spark。下面對(duì)這3種實(shí)現(xiàn)方式進(jìn)行對(duì)比分析。
MPI是一個(gè)信息傳遞應(yīng)用程序接口,其目標(biāo)是高性能、大規(guī)模性和可移植性,具有完備的異步通信功能以及較強(qiáng)的可擴(kuò)展性,是目前應(yīng)用范圍較為廣泛的一種并行編程接口,但其實(shí)現(xiàn)難度相對(duì)較大。MPI基于消息傳遞,可以根據(jù)需求進(jìn)行任務(wù)劃分或數(shù)據(jù)劃分,一次作業(yè)的進(jìn)程數(shù)由作業(yè)發(fā)布前通過(guò)一次調(diào)度完成,若在集群上運(yùn)行,集群的各節(jié)點(diǎn)之間通過(guò)互聯(lián)網(wǎng)絡(luò)進(jìn)行消息傳遞,節(jié)點(diǎn)通信一般會(huì)產(chǎn)生較大的通信開(kāi)銷,且各節(jié)點(diǎn)進(jìn)程之間相互依存,若一個(gè)進(jìn)程任務(wù)失敗,則整個(gè)作業(yè)失敗,所有的計(jì)算將重新開(kāi)始。此外,作業(yè)的容錯(cuò)性較差。
MPI編程接口主要基于集中式存儲(chǔ),底層缺乏分布式文件存儲(chǔ)系統(tǒng)的支持,因此難以滿足海量數(shù)據(jù)的存儲(chǔ)和讀寫(xiě)。MPI的數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)處理是分開(kāi)的,每次計(jì)算開(kāi)始時(shí),MPI需要從數(shù)據(jù)存儲(chǔ)節(jié)點(diǎn)讀取需要處理的數(shù)據(jù)分配給各個(gè)計(jì)算節(jié)點(diǎn),然后進(jìn)行數(shù)據(jù)處理。即使基于分布式文件存儲(chǔ)系統(tǒng)進(jìn)行MPI并行作業(yè)運(yùn)算,仍無(wú)法進(jìn)行分布式文件讀取,而且在數(shù)據(jù)讀寫(xiě)尤其針對(duì)TB級(jí)乃至PB級(jí)數(shù)據(jù)的數(shù)據(jù)密集型應(yīng)用,需要大量的數(shù)據(jù)交換,此時(shí)網(wǎng)絡(luò)通信時(shí)間將成為影響系統(tǒng)性能的重要因素,導(dǎo)致并行性能大大降低。
基于MPI的偏移成像實(shí)現(xiàn)方式如圖2所示。
圖2 基于MPI框架的偏移成像實(shí)現(xiàn)方式
MapReduce是Google公司提出的一個(gè)軟件架構(gòu),用于大規(guī)模數(shù)據(jù)集的并行運(yùn)算。MapReduce模型簡(jiǎn)單易用,降低了軟件開(kāi)發(fā)人員在并行程序結(jié)構(gòu)研發(fā)上的工作量,為地震數(shù)據(jù)處理軟件開(kāi)發(fā)人員提供了新的算法開(kāi)發(fā)思路。MapReduce實(shí)現(xiàn)過(guò)程主要分為兩個(gè)階段:Map(映射)階段和Reduce(歸納)階段。圖3給出了基于MapReduce框架的偏移成像實(shí)現(xiàn)方式,其中Map階段的主要任務(wù)是對(duì)分割好的數(shù)據(jù)進(jìn)行并行處理,處理后的結(jié)果傳輸給Reduce,由Reduce對(duì)多個(gè)并發(fā)的Map進(jìn)程的結(jié)果進(jìn)行規(guī)約。每個(gè)運(yùn)行作業(yè)中包含一個(gè)主節(jié)點(diǎn)和多個(gè)計(jì)算節(jié)點(diǎn),主節(jié)點(diǎn)負(fù)責(zé)所有的作業(yè)調(diào)度并對(duì)計(jì)算節(jié)點(diǎn)的作業(yè)情況進(jìn)行監(jiān)控,各個(gè)計(jì)算進(jìn)程間的通信純粹是用文件去聯(lián)系的,即每個(gè)Map的處理結(jié)果都要以文件的形式寫(xiě)在分布式文件存儲(chǔ)系統(tǒng)上,然后Reduce階段再讀取Map階段生成的數(shù)據(jù),這個(gè)特性使得MapReduce有著良好的作業(yè)容錯(cuò)性,當(dāng)某一級(jí)的某一個(gè)進(jìn)程出錯(cuò)時(shí),主節(jié)點(diǎn)會(huì)重新調(diào)度這個(gè)進(jìn)程到另外一個(gè)計(jì)算節(jié)點(diǎn)上重新運(yùn)行,但重新調(diào)度產(chǎn)生的開(kāi)銷會(huì)比較大。
圖3 基于MapReduce框架的偏移成像實(shí)現(xiàn)方式
Spark是一種專為大規(guī)模數(shù)據(jù)處理而設(shè)計(jì)的類MapReduce的通用并行框架,它通過(guò)完善的分布式內(nèi)存計(jì)算以及處理優(yōu)化機(jī)制來(lái)提升作業(yè)的運(yùn)行速度。與MapReduce不同的是,Spark處理的中間結(jié)果可以全部在內(nèi)存中實(shí)現(xiàn)數(shù)據(jù)流轉(zhuǎn),可根據(jù)需要將數(shù)據(jù)進(jìn)行落盤(pán)。圖4給出了基于Spark框架的偏移成像實(shí)現(xiàn)方式,在整個(gè)計(jì)算過(guò)程中不需要頻繁讀寫(xiě)數(shù)據(jù),以節(jié)省數(shù)據(jù)I/O帶來(lái)的較大開(kāi)銷,因而作業(yè)的計(jì)算性能得到大幅度的提升。
圖4 基于Spark框架的偏移成像實(shí)現(xiàn)方式
Spark的核心是建立一種彈性分布式數(shù)據(jù)集(RDD),以實(shí)現(xiàn)數(shù)據(jù)在內(nèi)存中的批計(jì)算,RDD是一種抽象概念,代表了一種有容錯(cuò)機(jī)制的數(shù)據(jù)集,其值存在于內(nèi)存中,并且只讀不能修改,但可以通過(guò)執(zhí)行轉(zhuǎn)換操作生成新的RDD,即Spark算法實(shí)現(xiàn)過(guò)程中是通過(guò)RDD的轉(zhuǎn)換等操作實(shí)現(xiàn)數(shù)據(jù)流轉(zhuǎn)的。Spark作業(yè)執(zhí)行過(guò)程中,每個(gè)RDD的生成與轉(zhuǎn)換都有記錄并與對(duì)應(yīng)的磁盤(pán)數(shù)據(jù)進(jìn)行關(guān)聯(lián),因此若某一階段的RDD丟失,則根據(jù)記錄關(guān)系,可以重新生成新的RDD,以保證作業(yè)的高容錯(cuò)性。而記錄RDD這種依賴關(guān)系的工具叫做有向無(wú)環(huán)圖(DAG),Spark通過(guò)提前分析作業(yè)實(shí)現(xiàn)過(guò)程設(shè)計(jì)特定的DAG,以設(shè)定作業(yè)運(yùn)行所需要的全部操作。
基于Spark框架的逆時(shí)偏移成像技術(shù),其輸入數(shù)據(jù)的存儲(chǔ)以及讀寫(xiě)基于Hadoop分布式文件存儲(chǔ)系統(tǒng)(HDFS)。HDFS具有較為完備的錯(cuò)誤檢測(cè)和快速、自動(dòng)的恢復(fù)機(jī)制,實(shí)現(xiàn)了較高的容錯(cuò)性,對(duì)于海量數(shù)據(jù)的管理具有重要作用。此外,HDFS是“塊”級(jí)別的分布式系統(tǒng),即進(jìn)行文件存儲(chǔ)時(shí)會(huì)根據(jù)預(yù)設(shè)的數(shù)據(jù)塊大小將文件進(jìn)行分塊,并以鍵值(key-value)對(duì)的形式將各個(gè)數(shù)據(jù)塊存儲(chǔ)到不同節(jié)點(diǎn)上,同時(shí)將鍵值對(duì)映射到內(nèi)存中,作為文件索引以便文件的快速定位和讀取。不同于MPI的集中式存儲(chǔ)方式,基于HDFS的并行作業(yè)在計(jì)算時(shí)各節(jié)點(diǎn)優(yōu)先讀取存儲(chǔ)在自己節(jié)點(diǎn)的數(shù)據(jù)進(jìn)行處理,避免了大量數(shù)據(jù)的網(wǎng)絡(luò)傳輸,實(shí)現(xiàn)“計(jì)算向存儲(chǔ)的遷移”,從而大大提高系統(tǒng)的計(jì)算效率,這對(duì)處理TB級(jí)乃至PB級(jí)的海量數(shù)據(jù)具有很大優(yōu)勢(shì)?;赟park框架的作業(yè)并行進(jìn)程數(shù)是由存儲(chǔ)數(shù)據(jù)的分塊數(shù)目決定的,為了保證作業(yè)運(yùn)行的負(fù)載均衡以及并行處理,本文主要采取了以下兩項(xiàng)技術(shù)方案。
1) 為了充分利用集群計(jì)算資源并滿足負(fù)載均衡,根據(jù)需要處理的地震數(shù)據(jù)量和可用計(jì)算資源設(shè)定數(shù)據(jù)塊大小(如128MB)以生成合理大小的RDD。具體實(shí)現(xiàn)過(guò)程為,若當(dāng)前節(jié)點(diǎn)資源數(shù)為M,總數(shù)據(jù)量大小為N,那么一個(gè)數(shù)據(jù)塊的大小可設(shè)定為n=N/(M×k),其中k為并行粒度的合理動(dòng)態(tài)調(diào)整,以防止一個(gè)RDD數(shù)據(jù)量過(guò)大引起的并行粒度過(guò)粗。
2) 根據(jù)HDFS各計(jì)算節(jié)點(diǎn)讀取數(shù)據(jù)時(shí)優(yōu)先讀取本節(jié)點(diǎn)數(shù)據(jù)的特點(diǎn),為了保證負(fù)載均衡,采用數(shù)據(jù)均衡服務(wù)使得分塊數(shù)據(jù)的存儲(chǔ)滿足均衡分布。具體實(shí)現(xiàn)過(guò)程為:首先HDFS的NameNode根據(jù)集群內(nèi)每個(gè)DataNode磁盤(pán)使用情況生成一份數(shù)據(jù)分布分析報(bào)告,并根據(jù)需要移動(dòng)的數(shù)據(jù)分布情況計(jì)算具體數(shù)據(jù)塊遷移路線圖,最后根據(jù)計(jì)算好的數(shù)據(jù)遷移路線圖完成數(shù)據(jù)遷移,以達(dá)到數(shù)據(jù)均衡標(biāo)準(zhǔn)。
以上兩項(xiàng)技術(shù)方案的應(yīng)用最大程度滿足了作業(yè)的負(fù)載均衡,輸入數(shù)據(jù)的讀取減少了網(wǎng)絡(luò)通信開(kāi)銷,極大地提升了數(shù)據(jù)讀取效率。
由于Spark框架在算法過(guò)程中以輸入RDD為并行單元進(jìn)行偏移計(jì)算,而RDD是以數(shù)據(jù)塊的形式存儲(chǔ),因此,對(duì)數(shù)據(jù)塊進(jìn)行分割時(shí),需要對(duì)當(dāng)前數(shù)據(jù)的道頭先進(jìn)行判斷再進(jìn)行分割,以保證一個(gè)RDD內(nèi)包含的炮集為整數(shù)。對(duì)于包含多個(gè)炮集的RDD數(shù)據(jù)在計(jì)算過(guò)程中各個(gè)炮集會(huì)按序進(jìn)行計(jì)算并完成偏移結(jié)果的實(shí)時(shí)疊加,中間結(jié)果無(wú)需落盤(pán),只在內(nèi)存中流轉(zhuǎn),因而無(wú)消息通信和數(shù)據(jù)等待時(shí)間,降低了I/O耗時(shí),進(jìn)一步提升了計(jì)算效率。每個(gè)輸入的RDD(炮集數(shù)據(jù))在偏移計(jì)算完成后會(huì)轉(zhuǎn)換成新的RDD(偏移結(jié)果)并保存在內(nèi)存之中,新生成的RDD的鍵值對(duì)以主測(cè)線號(hào)-偏移剖面的形式存儲(chǔ),每完成一個(gè)并行作業(yè)就會(huì)對(duì)新生成的偏移結(jié)果RDD按照既定的鍵值對(duì)進(jìn)行疊加,直至全部作業(yè)完成,最后按照既定的鍵值對(duì)中的主測(cè)線號(hào)對(duì)數(shù)據(jù)進(jìn)行排序生成最終的偏移結(jié)果并輸出。
逆時(shí)偏移成像計(jì)算過(guò)程中另一個(gè)重要的環(huán)節(jié)是斷點(diǎn)保護(hù)的實(shí)現(xiàn),由于本文方法基于Spark框架,算法實(shí)現(xiàn)過(guò)程是以輸入炮集RDD為并行單元進(jìn)行計(jì)算而且數(shù)據(jù)均是在內(nèi)存中流轉(zhuǎn),因此在實(shí)現(xiàn)斷點(diǎn)保護(hù)時(shí)以輸入RDD的偏移結(jié)果為最小并行粒度將數(shù)據(jù)落盤(pán),同時(shí)記錄當(dāng)前已完成的RDD序號(hào),并將其作為斷點(diǎn)續(xù)航的標(biāo)志,與MapReduce的中間結(jié)果全部落盤(pán)再規(guī)約的方式相比,Spark僅將已完成疊加后的偏移結(jié)果作為副本保存在HDFS上,實(shí)際計(jì)算的數(shù)據(jù)體仍在內(nèi)存中流轉(zhuǎn)。作業(yè)續(xù)發(fā)時(shí)若啟動(dòng)斷點(diǎn)續(xù)發(fā),作業(yè)首先會(huì)判斷中間結(jié)果文件是否存在,若存在就讀取當(dāng)前結(jié)果并跳過(guò)已經(jīng)完成的RDD續(xù)發(fā)作業(yè),進(jìn)行剩余RDD的偏移,最終實(shí)現(xiàn)作業(yè)的斷點(diǎn)保護(hù)。圖5給出了基于Spark框架的偏移成像算法實(shí)現(xiàn)流程圖。
圖5 基于Spark框架的偏移成像算法實(shí)現(xiàn)流程
為了進(jìn)一步說(shuō)明本文方法的實(shí)現(xiàn)過(guò)程,我們給出了主體算法的偽代碼(如圖6所示),同時(shí)也給出了斷點(diǎn)保護(hù)的實(shí)現(xiàn)機(jī)制,整個(gè)作業(yè)過(guò)程主要分為兩個(gè)階段(如圖7所示),第一階段主要是從分布式文件系統(tǒng)中讀取地震炮集數(shù)據(jù)生成所需RDD即seisData,并通過(guò)Spark的mapPartitions函數(shù)進(jìn)行RDD轉(zhuǎn)換和數(shù)據(jù)分區(qū),同時(shí)通過(guò)pair操作返回炮號(hào)-數(shù)據(jù)鍵值對(duì),根據(jù)返回的鍵值對(duì)進(jìn)行單炮偏移并將每個(gè)單炮數(shù)據(jù)的偏移結(jié)果進(jìn)行疊加存放于如圖6中所示的result變量中,直至完成該RDD內(nèi)的所有炮數(shù)據(jù);第二階段主要是通過(guò)如圖7中所示的向量轉(zhuǎn)換(Shuffle)操作對(duì)輸入RDD的偏移結(jié)果按照鍵值重新轉(zhuǎn)換得到新的成像結(jié)果RDD并進(jìn)行偏移結(jié)果規(guī)約,進(jìn)一步對(duì)最終的偏移結(jié)果按鍵值排序并輸出結(jié)果resData。
圖6 主體算法偽代碼
圖7 有向無(wú)環(huán)圖(DAG)
為了檢驗(yàn)基于Spark大數(shù)據(jù)處理框架逆時(shí)偏移成像技術(shù)的應(yīng)用效果,選取了國(guó)內(nèi)西部某工區(qū)的一塊實(shí)際資料進(jìn)行了測(cè)試。該資料中淺層信噪比較高,以串珠成像和小斷裂成像為目標(biāo)。工區(qū)總計(jì)施工36516炮,采集的數(shù)據(jù)體大小約為3.04TB,數(shù)據(jù)存儲(chǔ)于HDFS文件系統(tǒng),并行讀取,使用的計(jì)算集群為125個(gè)Tesla P100的GPU節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)兩個(gè)GPU卡,顯存為16GB,共250個(gè)GPU卡,每個(gè)節(jié)點(diǎn)的內(nèi)存為256GB,每個(gè)節(jié)點(diǎn)配置24TB的機(jī)械硬盤(pán)以及兩個(gè)1TB的固態(tài)硬盤(pán),配置集群HDFS總存儲(chǔ)容量為2.6PB。由此可見(jiàn),HDFS充分利用了每個(gè)節(jié)點(diǎn)的存儲(chǔ)資源,無(wú)需大容量的集中存儲(chǔ)就能實(shí)現(xiàn)PB乃至更高級(jí)別的數(shù)據(jù)存儲(chǔ)。這里設(shè)定512MB為數(shù)據(jù)塊分割的基本單位,共6086個(gè)數(shù)據(jù)塊,即并行進(jìn)程數(shù)為6086,平均每塊卡處理約24塊數(shù)據(jù),每塊數(shù)據(jù)包含6炮數(shù)據(jù)。該設(shè)定的并行粒度合理,節(jié)點(diǎn)間數(shù)據(jù)分配均衡,因而可有效提升數(shù)據(jù)讀取效率。成像結(jié)果參數(shù)為Nx=1901,Ny=1071,Nz=1001,即成像結(jié)果大小為7.6GB。圖8給出了基于Spark框架下的兩條線的偏移成像結(jié)果,可以看出,偏移成像結(jié)果具有較高的分辨率,串珠收斂,斷層接觸關(guān)系清晰。
圖8 偏移成像剖面a line 390; b line 550
為檢驗(yàn)基于Spark大數(shù)據(jù)處理框架的地震偏移成像技術(shù)的計(jì)算效率優(yōu)勢(shì),利用上述數(shù)據(jù)分別進(jìn)行了3種并行計(jì)算實(shí)現(xiàn)方式的地震偏移成像計(jì)算,由于3種方式的核心計(jì)算方法一致,因此得到的偏移成像結(jié)果是一樣的,此外,對(duì)應(yīng)的單炮偏移時(shí)間效率相同。影響3種實(shí)現(xiàn)方式計(jì)算效率的主要因素是數(shù)據(jù)的I/O以及規(guī)約通信。其中,利用基于MPI并行方式進(jìn)行測(cè)試時(shí),由于存儲(chǔ)和計(jì)算相互獨(dú)立,因而將數(shù)據(jù)集中存儲(chǔ)在一套特定的存儲(chǔ)節(jié)點(diǎn)上,各計(jì)算節(jié)點(diǎn)通過(guò)網(wǎng)絡(luò)通信進(jìn)行輸入炮集數(shù)據(jù)讀取,經(jīng)統(tǒng)計(jì),網(wǎng)絡(luò)傳輸速率均值穩(wěn)定在150MB/s。而基于MapReduce和Spark的并行方式均基于HDFS讀寫(xiě),優(yōu)先獲取存儲(chǔ)在本地磁盤(pán)的炮集數(shù)據(jù),而本地磁盤(pán)的讀寫(xiě)速率一般穩(wěn)定在400MB/s,即基于HDFS的數(shù)據(jù)讀寫(xiě)效率是基于網(wǎng)絡(luò)傳輸效率的2.6倍,因此基于Spark框架的偏移算法在輸入數(shù)據(jù)尤其針對(duì)海量數(shù)據(jù)時(shí)的效率要明顯優(yōu)于MPI。此外,關(guān)于偏移結(jié)果數(shù)據(jù)規(guī)約,此次數(shù)據(jù)共包含36516炮數(shù)據(jù),對(duì)于MPI在此次測(cè)試集群中并行度設(shè)定為250,總共250個(gè)進(jìn)程,平均每個(gè)進(jìn)程處理146炮,即在偏移過(guò)程中每個(gè)進(jìn)程除了需要從管理輸入的主進(jìn)程0(圖2)進(jìn)行146次數(shù)據(jù)讀取之外,在數(shù)據(jù)規(guī)約時(shí)還需和管理輸出的主進(jìn)程1進(jìn)行146次成像結(jié)果的傳輸并落盤(pán),由此在實(shí)際計(jì)算過(guò)程產(chǎn)生了較大的數(shù)據(jù)通訊以及數(shù)據(jù)I/O開(kāi)銷。對(duì)于MapReduce,在每完成一個(gè)Map偏移時(shí),其對(duì)應(yīng)的偏移結(jié)果都會(huì)單獨(dú)落盤(pán),進(jìn)而在Reduce階段對(duì)所有Map的結(jié)果進(jìn)行疊加(圖3),即基于MapReduce框架對(duì)應(yīng)的偏移過(guò)程和規(guī)約過(guò)程完全分離,該模式雖具有高度作業(yè)容錯(cuò)性但帶來(lái)了巨大的數(shù)據(jù)I/O開(kāi)銷,因而降低了作業(yè)效率。此次測(cè)試中,炮集數(shù)據(jù)共分割為6086個(gè)數(shù)據(jù)塊,即對(duì)應(yīng)的Map數(shù)為6086并對(duì)應(yīng)產(chǎn)生6086個(gè)成像結(jié)果文件,每個(gè)文件大小為7.6GB,共產(chǎn)生45TB中間結(jié)果,在Reduce階段,對(duì)這些數(shù)據(jù)進(jìn)行規(guī)約,不僅對(duì)儲(chǔ)存產(chǎn)生較大壓力,同時(shí)也造成巨大的I/O開(kāi)銷。而Spark框架基于分布式內(nèi)存計(jì)算,在偏移計(jì)算過(guò)程中數(shù)據(jù)在內(nèi)存中流轉(zhuǎn)直接完成疊加,疊加耗時(shí)基本隱藏在偏移計(jì)算過(guò)程中,沒(méi)有額外的數(shù)據(jù)I/O開(kāi)銷,計(jì)算效率的優(yōu)勢(shì)較為明顯。數(shù)據(jù)測(cè)試時(shí)間的統(tǒng)計(jì)結(jié)果表明,假設(shè)MPI的運(yùn)行時(shí)間為1,則基于MapReduce的運(yùn)行時(shí)間為1.3,而基于Spark框架的運(yùn)行時(shí)間為0.9,表1給出了3種實(shí)現(xiàn)方式的數(shù)據(jù)讀取速率和相對(duì)總運(yùn)行時(shí)間。
表1 3種并行實(shí)現(xiàn)方式運(yùn)行時(shí)間對(duì)比
本次測(cè)試數(shù)據(jù)大小為3.04TB,這種規(guī)模的數(shù)據(jù)對(duì)集中存儲(chǔ)方式的硬盤(pán)容量有較高的要求,隨著數(shù)據(jù)量的進(jìn)一步提升,集中存儲(chǔ)的容量將難以滿足存儲(chǔ)要求。此外,在實(shí)際計(jì)算過(guò)程中,集中存儲(chǔ)的數(shù)據(jù)頻繁讀取會(huì)大量使用網(wǎng)絡(luò)通信從而嚴(yán)重影響數(shù)據(jù)讀取效率,此時(shí)基于Spark的分布式文件存儲(chǔ)將體現(xiàn)出更大的優(yōu)勢(shì)。
本文提出了一種基于Spark大數(shù)據(jù)處理框架的地震偏移成像技術(shù),并通過(guò)實(shí)際數(shù)據(jù)測(cè)試從數(shù)據(jù)I/O、規(guī)約通信等方面與MPI和MapReduce兩種并行實(shí)現(xiàn)方式下的逆時(shí)偏移成像技術(shù)進(jìn)行了對(duì)比論述,驗(yàn)證了該技術(shù)的成像精度以及計(jì)算高效性。近年來(lái),隨著地震勘探目標(biāo)的逐漸精細(xì)化,單點(diǎn)高密度地震技術(shù)不斷發(fā)展,由此產(chǎn)生了海量地震數(shù)據(jù)。本文方法充分利用了Spark框架分布式存儲(chǔ)的特性以及分布式內(nèi)存的優(yōu)勢(shì),實(shí)現(xiàn)了海量數(shù)據(jù)存儲(chǔ)并有效提升了讀寫(xiě)效率,并且隨著地震數(shù)據(jù)量的進(jìn)一步增加,分布式存儲(chǔ)的優(yōu)勢(shì)將會(huì)得到更好的體現(xiàn)。本文方法尚未對(duì)逆時(shí)偏移的核心算法進(jìn)行Spark框架的全面融合,因此下一步可將分布式內(nèi)存計(jì)算應(yīng)用到逆時(shí)偏移核心算法如波場(chǎng)延拓過(guò)程中的波場(chǎng)存儲(chǔ)等階段,從而進(jìn)一步減少數(shù)據(jù)I/O,提升算法效率。Spark作為一種專為海量數(shù)據(jù)處理而設(shè)計(jì)的高效通用計(jì)算框架,可針對(duì)地震數(shù)據(jù)處理過(guò)程中的多個(gè)階段進(jìn)行優(yōu)化,基于Spark框架進(jìn)行地震資料處理技術(shù)的開(kāi)發(fā),對(duì)于提升海量數(shù)據(jù)的處理效率具有重要意義。