景妍 彭成
摘要:針對現(xiàn)有地震數(shù)據(jù)存取效率不足的問題,在參考谷歌文件系統(tǒng)設計理念并吸收其關鍵分布式處理技術的基礎上,利用三維空間下八叉樹結構與編碼的快速空間定位機制,實現(xiàn)對三維大數(shù)據(jù)體的結構分塊存儲。這一方法減少了單機存儲空間開銷,并通過備份降低了數(shù)據(jù)丟失的風險。同時,采用八叉樹結構的分塊存儲,對于相近區(qū)域的屬性計算和三維渲染在文件訪問速度上具有優(yōu)勢。
關鍵詞:分布式;八叉樹;地震數(shù)據(jù);子塊切分;哈希編碼
中圖分類號:P311.5, TP311.1 文獻標識碼:A
文章編號:1009-3044(2024)10-0081-03
0 引言
如果能夠充分利用最新的信息科學技術方便地調取上游板塊基礎資料,例如地震數(shù)據(jù),并無縫地融合于油氣資源評價參數(shù)獲取與勘探部署決策過程中,對實現(xiàn)油氣高效勘探具有重要的現(xiàn)實意義[1]??紤]到以SEGY格式存儲的三維地震數(shù)據(jù),一個文件就可以達到幾百GB甚至TB級別,在業(yè)內不斷應用計算機存儲新技術的情況下,設計、調整并形成了一系列網(wǎng)絡文件存儲技術與部署方案[2]。例如,以直連式存儲、網(wǎng)絡附加存儲、存儲區(qū)域網(wǎng)為代表的網(wǎng)絡存儲技術,配套高性能計算集群來提高單位時間內執(zhí)行的任務數(shù),體現(xiàn)出大吞吐量、低延遲數(shù)據(jù)讀取的特點[3-4]。由于采用的是直接存儲整個大數(shù)據(jù)文件的方式,面向集群的大文件存取存在對存儲和執(zhí)行環(huán)境要求高、網(wǎng)絡互聯(lián)設備昂貴、地理上連接距離有限、需要配備專業(yè)人員維護、訪問速度瓶頸等問題[5-6]。特別是,單個大文件I/O節(jié)點不僅因大量數(shù)據(jù)交換而變得很慢,還存在單點故障、容易造成集群癱瘓等實際問題[7]。
隨著地震采集及電子掃描技術的發(fā)展,獲取地震資料的量級快速增長。盡管用來處理數(shù)據(jù)的計算機性能在不斷提高,但數(shù)據(jù)規(guī)模爆炸式的增長仍然超越了內存的發(fā)展速度[8]。從存儲、加載到顯示,需要重新審視現(xiàn)有的主流文件存儲格式,并配套研發(fā)相適應的渲染、大數(shù)據(jù)挖掘等一系列支持大數(shù)據(jù)體的核心技術[9]。隨著三維地震數(shù)據(jù)采集、油氣田開發(fā)等系列新技術帶來的快速數(shù)據(jù)更新,大數(shù)據(jù)背景下三維數(shù)據(jù)體的高效存儲與處理分析變得越來越復雜[10]。在參考谷歌文件系統(tǒng)設計理念和消化其關鍵分布式處理技術的基礎上,本方法利用三維空間下八叉樹結構與編碼的快速空間定位機制,實現(xiàn)對三維大數(shù)據(jù)體的結構分塊存儲。
1 分布式存儲節(jié)點及八叉樹切分參數(shù)配置
地震數(shù)據(jù)八叉樹分布式存儲是指對地震數(shù)據(jù)通過八叉樹結構進行切分,切分成多個子塊文件后傳輸?shù)讲煌鎯?jié)點中進行存儲,實現(xiàn)分布式存儲。分布式存儲的結構包括本地、服務器、存儲節(jié)點三個類型的對象,其中本地存放了待切分的源地震數(shù)據(jù),服務器中存放切分和存儲節(jié)點的參數(shù)配置,以及各個子塊的編碼及存儲位置信息,存儲節(jié)點中存放切分生成的子塊以及索引文件。
分布式存儲節(jié)點的配置包括服務器的地址以及存儲節(jié)點的地址配置。在進行八叉樹切分時,服務器及存儲節(jié)點會運行數(shù)據(jù)存取服務程序,其可以實現(xiàn)不同計算機之間的數(shù)據(jù)發(fā)送和接收功能,此服務程序基于RCF的開源代碼實現(xiàn)。在配置服務器地址時,輸入服務器的網(wǎng)絡地址和網(wǎng)絡端口號進行連接,服務器會返回當前已經(jīng)存在的分布式地震數(shù)據(jù)對象列表,用戶新建一個分布式地震數(shù)據(jù)名表示切分后的地震數(shù)據(jù)對象,然后輸入各個存儲節(jié)點的網(wǎng)絡地址和網(wǎng)絡端口號,之后的地震切塊會發(fā)送到這些存儲節(jié)點中。
八叉樹切分參數(shù)的配置是基于八叉樹結構。源地震數(shù)據(jù)可以看作一個三維的數(shù)據(jù)立方體,長寬高分別對應主測線、聯(lián)絡線和深度。用戶配置時會指定小立方體的長寬高方向上的數(shù)據(jù)量,通過小立方體的長寬高和源地震數(shù)據(jù)的長寬高比較,得到源地震數(shù)據(jù)在三個方向上與小立方體三個方向上長度的比值,取比值最大的一個方向并計算滿足大于此比值的最小的2 的次冪,這個次冪數(shù)即為八叉樹切分的層級數(shù)。
索引文件中會記錄源地震數(shù)據(jù)三個方向上的數(shù)據(jù)量以及八叉樹的切分方式。通過這兩個參數(shù)可以推導出地震數(shù)據(jù)和八叉樹子塊在空間位置上的對應關系,通過對應關系可以從空間位置得到子塊的編號,也可以通過子塊編號得到其對應的空間范圍。對于源地震數(shù)據(jù)三個方向上與2的次冪不整除的情況,在計算生成某個子塊時,這個子塊所在的空間位置可能沒有對應的地震數(shù)據(jù)或者只有一部分地震數(shù)據(jù),那么不生成此子塊或者只生成有數(shù)據(jù)部分的子塊即可。
2 切塊編碼及存儲節(jié)點的分配
八叉樹空間結構的三維空間編碼通常采用線性莫頓編碼,如圖1所示,每一位八進制數(shù)位可以看成3 位二進制數(shù),由所在節(jié)點的空間位置編碼而來(其中,n 表示子體數(shù)據(jù)塊所處的空間結構位置):Morton =[(x0,y0,z0),(x1,y1,z1),...,(xn-1,yn-1,zn-1)]。切分時的每個子塊都會有其對應的莫頓碼,從莫頓碼也可以反推出子塊對應的空間范圍。
八叉樹節(jié)點體現(xiàn)了空間坐標信息,同時易于實現(xiàn)自然數(shù)的映射,即某一體數(shù)據(jù)塊的具體文件存儲位置。莫頓碼按照大小排序得到子塊的自然數(shù)編碼(Tile ID) ,進而映射到不同體數(shù)據(jù)塊文件存儲位置。讀取子塊數(shù)據(jù)時,當給出三維空間數(shù)據(jù)獲取范圍時,通過計算八叉樹中所在的空間位置得到莫頓碼,進而以Tile ID為索引定位數(shù)據(jù)在文件中的存儲位置;同樣,給出數(shù)據(jù)存儲位置,也可以計算 Tile ID,得到它在體數(shù)據(jù)或八叉樹中的空間位置。Tile ID從零開始,對應最終層級中莫頓碼最小的子塊,依次類推。
為了使分布式存儲節(jié)點在存儲多個不同地震數(shù)據(jù)體子塊時,文件名稱不相重復,需要對地震數(shù)據(jù)體的子塊命名獨有的文件名,本文采用生成隨機64位無符號整型數(shù)來表示子塊的哈希編碼(UUID) ,每個子塊文件命名為“XXX(UUID).afs”。
子塊有莫頓碼、Tile ID、UUID三種碼,與子塊一一對應,從莫頓碼和子塊長寬高范圍也可以推導出其所在的空間位置,從而實現(xiàn)編碼和位置信息的關聯(lián)。
在分配存儲節(jié)點時,要確定一個子塊需要傳輸?shù)侥男┐鎯?jié)點中,采用的是一致性哈希算法,如圖2所示,整數(shù)0到2^64-1構成一個圓環(huán),每個存儲節(jié)點生成一個隨機64位無符號整型數(shù)據(jù)表示存儲節(jié)點的哈希值,根據(jù)哈希值在圓環(huán)中所處的位置,將存儲節(jié)點放在相應位置上,如圖中ABCD四個節(jié)點。每個子塊也有一個UUID,根據(jù)UUID落在圓環(huán)中的位置,例如在AB之間那么這個子塊就分配給A,在BC之間就分配給B,在CD之間就分配給C,在DA之間就分配給D。對于多副本的情況,只需在圓環(huán)上順時針往后面找相應數(shù)量的存儲節(jié)點進行分配,例如有兩個副本,那么一個子塊分配給A,則再順時針往下找到B,最后子塊會傳輸?shù)紸和B兩個存儲節(jié)點實現(xiàn)多副本。
本地將存儲節(jié)點配置和子塊切分參數(shù)配置傳給服務器,服務器端完成每個子塊生成UUID以及計算其對應的存儲節(jié)點的工作,并將分布式地震數(shù)據(jù)名、子塊與UUID的對應列表、子塊與存儲節(jié)點的對應列表保存。
3 切分地震數(shù)據(jù)生成子塊
切分地震數(shù)據(jù)生成子塊的流程如圖3所示:
1) 初始化網(wǎng)絡環(huán)境,啟動RCF中用來連接服務端的接口,分別啟動連接服務器的接口以及連接存儲節(jié)點的接口。
2) 本地根據(jù)子塊切分參數(shù)配置生成各個子塊的莫頓編碼和總的子塊個數(shù)。
3) 打開源地震數(shù)據(jù)文件,準備讀取數(shù)據(jù)。
4) 將存儲節(jié)點配置和子塊切分參數(shù)配置傳給服務器,服務器端完成每個子塊生成UUID以及計算其對應的存儲節(jié)點的工作,并將每個子塊的文件名返回給本地。
5) 初始化當前切分狀態(tài)信息,包括切分時的當前子塊,帶寬,數(shù)據(jù)傳輸量,上傳的最長最短用時等。
6) 切分源地震數(shù)據(jù)體生成子塊,具體生成一個子塊的步驟為:首先根據(jù)當前子塊的Tile ID得到其莫頓編碼,再通過莫頓編碼轉換為具體的空間范圍,對于三維地震數(shù)據(jù)體,空間范圍即主測線、聯(lián)絡線、深度三個方向上的范圍,然后循環(huán)遍歷主測線和聯(lián)絡線,一對主測線號和聯(lián)絡線號確定的平面上的位置稱作CDP點,這個CDP點對應一個地震道,按照深度方向的范圍從源地震文件中讀取這個地震道,然后將數(shù)據(jù)寫入到子塊中。
源地震數(shù)據(jù)的組織方式是按照地震道來排列的,每個地震道的長度相同,在地震道道頭中有其主測線號和聯(lián)絡線號,本地首先讀取所有地震道頭,建立CDP點位置與對應地震道在文件中位置的對應關系(gridpos_filepos) ,有些地震數(shù)據(jù)里面地震道并不是按照主測線和聯(lián)絡線順序排列的,可能順序是亂的。所以在從源地震數(shù)據(jù)讀取地震道時,需要利用grid?pos_filepos來找到其正確的位置。
對于疊前地震數(shù)據(jù),每個CDP點對應一組地震道而不是一條地震道,此時需要讀取一組地震道在子塊深度范圍內的數(shù)據(jù),也是利用gridpos_filepos,此時這個對應關系是一對多的,將所有相同CDP點號的地震道數(shù)據(jù)讀出,然后順序地寫入子塊中。gridpos_filepos 會在后續(xù)步驟寫入索引文件傳到存儲節(jié)點。子塊的數(shù)據(jù)排列方式如圖4所示,平面上兩個方向分別為切分后的主測線和聯(lián)絡線部分,每個CDP點號對應一個道集,為相同CDP號的一組地震道在子塊深度區(qū)間范圍內的數(shù)據(jù)。
4 傳輸子塊及索引到存儲節(jié)點
對于生成的子塊文件,傳輸?shù)綄拇鎯?jié)點中。首先向服務器發(fā)送子塊的Tile ID,服務器通過自身存儲的子塊與存儲節(jié)點的對應列表,將需要上傳的存儲節(jié)點返回給本地,本地通過與存儲節(jié)點的數(shù)據(jù)傳輸接口,將子塊上傳到存儲節(jié)點中。在前面配置參數(shù)的步驟中,配置存儲節(jié)點時需要配置文件存放的具體路徑,表示子塊在存儲節(jié)點計算機中存放的位置。存儲節(jié)點根據(jù)當前切分地震數(shù)據(jù)體的分布式文件名稱,對其名稱進行MD5哈希得到一個無符號整型數(shù)字,在文件存放路徑下建立名為此數(shù)字的子文件夾,所有當前切分地震數(shù)據(jù)體的子塊都存放在這個子文件夾中,之后子塊獲取也是根據(jù)MD5哈希找到正確的目錄去加載。
索引文件內容包括源地震數(shù)據(jù)主測線和聯(lián)絡線組成的測網(wǎng)形狀信息,八叉樹參數(shù)(層數(shù)、子塊等方向的大?。?,子塊數(shù)量,各子塊文件名,gridpos_filepos,源地震數(shù)據(jù)體深度范圍及測網(wǎng)范圍。最后,將索引傳輸?shù)矫總€存儲節(jié)點中。
5 加載并使用分布式地震數(shù)據(jù)
用戶指定要加載的分布式地震數(shù)據(jù)名稱,選擇后從存儲節(jié)點中下載索引文件并加載到本地,完成分布式文件的加載。在使用分布式地震數(shù)據(jù)時,例如想查看某一條主測線的地震道剖面,則根據(jù)剖面的主測線號、聯(lián)絡線號、深度范圍以及八叉樹切分參數(shù),得到對應的子塊編號。然后將下載子塊的編號發(fā)送給服務器端,服務器端根據(jù)子塊與存儲節(jié)點的對應關系以及子塊編號與子塊文件名對應關系,找到子塊對應的存儲節(jié)點及文件路徑返回給本地,本地再從相應的存儲節(jié)點下載子塊。子塊下載完成后,從子塊中對應的位置讀取地震數(shù)據(jù)并形成地震剖面。
一個具體的地震剖面查詢流程如圖5所示。
1) 通過輸入的主測線號或者聯(lián)絡線號,生成一組CDP點位置及起止時間。
2) 對于每一個CDP點位置以及起止時間,首先從緩存中查詢,如果緩存中有,則直接返回數(shù)據(jù),如果沒有,則將CDP點位置轉換為在數(shù)據(jù)立方體長寬平面上的偏移量,將起止時間轉換為數(shù)據(jù)立方體在高方向上的偏移量。
3) 根據(jù)偏移量,得到具體的空間坐標范圍。
4) 根據(jù)空間坐標范圍及八叉樹切分配置,得到對應的一組莫頓編碼。
5) 對于每個莫頓編碼,獲取對應的Tile ID。
6) 根據(jù)Tile ID,在緩存中查詢,如果緩存中有,則直接返回數(shù)據(jù),如果沒有則獲取對應的UUID及子塊文件名。
7) 如果本地有對應的子塊文件,則讀取數(shù)據(jù)并返回,如果沒有則向服務器詢問子塊所在存儲節(jié)點,服務器根據(jù)子塊與存儲節(jié)點的對應列表返回子塊所在存儲節(jié)點,本地再向存儲節(jié)點下載子塊,存儲節(jié)點根據(jù)當前地震數(shù)據(jù)體的分布式文件名稱及子塊文件名,找到對應的存儲路徑,將文件傳回本地。
6 結論
本文設計了一種地震數(shù)據(jù)八叉樹分布式存儲方法,通過分布式哈希方法對地震子塊分配,支持疊前地震數(shù)據(jù)的子塊切分存儲,同時提供冗余存儲降低數(shù)據(jù)丟失風險?;诎瞬鏄涞姆植际酱鎯p少了單機存儲空間開銷,并且對于相近區(qū)域的屬性計算和三維渲染在文件訪問速度上具有優(yōu)勢。
參考文獻:
[1] 陳通,韓雪君,馬延路.時序數(shù)據(jù)庫在海量地震波形數(shù)據(jù)分布式存儲與處理中的應用初探[J].中國地震,2022,38(4):799-809.
[2] 龐銳,許自龍,朱海偉,等.面向地震數(shù)據(jù)交互分析場景的高效分布式緩存框架[J].石油物探,2022,61(6):1090-1098,1114.
[3] 李彩華,滕云田,周健超,等.分布式地震數(shù)據(jù)采集器的高精度時間同步系統(tǒng)研制[J].地震學報,2022,44(6):1111-1120.
[4] 吳崢,王方建,董翔,等.地震觀測數(shù)據(jù)融合存儲技術研究[J]. 地震地磁觀測與研究,2023,44(1):115-119.
[5] 周勃,劉萬偉.基于HDF5的地震解釋成果數(shù)據(jù)存儲技術研究[J].信息系統(tǒng)工程,2022(5):132-135,140.
[6] 朱少華,魏緒云,胡旭輝.從模擬時期到數(shù)字時代地震業(yè)務數(shù)據(jù)檔案存儲研究[J].山東檔案,2023(2):79-80.
[7] 楊河山,張世明,曹小朋,等.基于Hadoop分布式文件系統(tǒng)的地震勘探大數(shù)據(jù)樣本采集及存儲優(yōu)化[J].油氣地質與采收率,2022,29(1):121-127.
[8] 蔣治剛.StorNext并行存儲技術在遼河油田地震資料處理中的應用[J].信息系統(tǒng)工程,2021(9):35-37.
[9] 呂作勇,黃文輝,康英,等.海量多源異構地震監(jiān)測數(shù)據(jù)存儲和共享服務系統(tǒng)[J].華南地震,2021,41(2):13-18.
[10] 趙輝.地震監(jiān)測數(shù)據(jù)的Hadoop存儲解決方案[J].華南地震,2020,40(3):70-75.
【通聯(lián)編輯:梁書】