王 鵬,周 巖
(西南民族大學 計算機科學與技術學院,成都 610225)(*通信作者電子郵箱22954936@qq.com)
消息傳遞接口(Message Passing Interface, MPI)是一種基于信息傳遞的并行編程接口,在規(guī)模化集群環(huán)境中具備高效的并行運算與數(shù)據(jù)處理能力。作為計算密集型的高性能計算標準,MPI在氣候模擬、高能物理、生命科學、工業(yè)仿真、人工智能、大數(shù)據(jù)處理等高性能計算和科學計算領域應用廣泛[1]。但MPI缺乏與其自身計算系統(tǒng)深度融合的大數(shù)據(jù)管理機制,目前的數(shù)據(jù)集中存儲模式不便于系統(tǒng)實現(xiàn)“計算向存儲遷移”的大數(shù)據(jù)思想理念。計算過程中數(shù)據(jù)分發(fā)受網(wǎng)絡傳輸時長的制約,限制了MPI在大數(shù)據(jù)領域的應用擴展。
目前業(yè)界在處理海量數(shù)據(jù)時多采用分布式系統(tǒng)模式,無論是Lustre并行文件系統(tǒng)、并行虛擬文件系統(tǒng)(Parallel Virtual File System, PVFS),還是通用并行文件系統(tǒng)(General Parallel File System, GPFS)。這些并行化系統(tǒng)各有特點,在不同領域均有相應應用。Lustre的可用性和擴展性不錯,但需要特殊存儲設備的支持,而且沒有實現(xiàn)分布式的元數(shù)據(jù)服務器管理。GPFS支持串行應用和并行應用,允許任何節(jié)點的并行應用同時訪問同一文件或不同文件。PVFS將數(shù)據(jù)文件存儲于集群的不同節(jié)點,多個客戶端可以同時訪問這些數(shù)據(jù)[2]。但這類系統(tǒng)本身都進行過封裝,應用程序在調(diào)用時只需知道文件邏輯地址,并不關心文件具體存儲位置,無法避免運算過程中大量數(shù)據(jù)的跨節(jié)點傳輸。
作為目前大數(shù)據(jù)應用領域最為廣泛的Hadoop,有一套主從式文件系統(tǒng)HDFS在底層支撐其Map/Reduce的數(shù)據(jù)處理功能。主從式基礎存儲和主從式數(shù)據(jù)處理構成Hadoop的基本架構模型。它的計算系統(tǒng)能夠通過HDFS快速定位文件存儲位置,這讓Hadoop方便地實現(xiàn)“計算向數(shù)據(jù)存儲位置的遷移”,從而大大提高系統(tǒng)計算效率,具備處理超大數(shù)據(jù)集(large data set)應用程序的能力[3]。
Hadoop采用機制完備的分布式文件系統(tǒng)是為了響應以互聯(lián)網(wǎng)商業(yè)應用為主體的復雜數(shù)據(jù)處理場景,應對大量數(shù)據(jù)的頻繁讀寫操作。MPI的應用場景是高性能計算領域,面對的數(shù)據(jù)應用機制相對簡單,通常一次大規(guī)模運算需要的源數(shù)據(jù)相對固定,得出的計算數(shù)據(jù)相對完整,不需要進行頻繁的更新迭代。
在高性能計算領域的應用場景中,擴展MPI針對海量數(shù)據(jù)的處理能力,是本文研究的主要目標。因此,以最簡化的方式,開發(fā)設計基于MPI的數(shù)據(jù)存儲組件(MPI Data Storage Plug-in, MPI-DSP),將其與MPI計算系統(tǒng)有機融合,提高其在文件管理和大數(shù)據(jù)方面的處理能力,并以實驗對組件效果進行初步驗證。MPI-DSP適用于一次寫入多次讀取的應用環(huán)境,與大多科學計算的應用場景相吻合,但對于需要頻繁寫入更新數(shù)據(jù)的計算任務,并無特別優(yōu)勢,因此希望將其作為現(xiàn)行MPI計算體系的一個擴展和補充。
MPI-DSP的設計目標是希望在高性能計算應用場景中增強MPI的大數(shù)據(jù)處理能力。與互聯(lián)網(wǎng)領域應用不同,高性能計算應用往往集中于某一科研領域[4],有如下特點:1)高頻次的文件并發(fā)訪問相對較少;2)實驗源數(shù)據(jù)相對穩(wěn)定,不會頻繁寫入,但數(shù)據(jù)量較大。根據(jù)高性能應用場景的特殊性,明確MPI-DSP的設計原則:1)簡化功能設計,避免文件管理的復雜功能,保持系統(tǒng)簡潔與輕量級;2)完成“計算向存儲遷移”,實現(xiàn)數(shù)據(jù)在本地讀取的核心功能。
采用簡潔的方式不影響構建在MPI上的原有應用,能夠減少系統(tǒng)研發(fā)和維護代價。原有MPI的集中存儲機制決定了數(shù)據(jù)的計算與存儲相分離,在MPI程序設計時,程序人員會考慮盡量增加計算操作而減少節(jié)點間的通信操作,也就是常說的“計算換通信”設計原則[5-6]。本文在不影響MPI原有系統(tǒng)的情況下,采用輕量級的數(shù)據(jù)存儲組件函數(shù),調(diào)整優(yōu)化MPI現(xiàn)有的數(shù)據(jù)集中存儲模式,使其具備“計算向存儲遷移”的能力,減少MPI實際運算時數(shù)據(jù)在網(wǎng)絡中的傳輸量。
從系統(tǒng)架構分析,MPI-DSP是現(xiàn)有MPI的一個擴展,它與MPI的計算系統(tǒng)緊密結(jié)合,這種結(jié)合通過開發(fā)新的應用程序接口(Application Program Interface, API)函數(shù)來實現(xiàn)。新開發(fā)的組件使MPI-DSP具備文件切割、分配和調(diào)用功能。MPI-DSP在整個系統(tǒng)中的定位如圖1所示。
從運行機制分析,MPI豐富的函數(shù)調(diào)用和靈活的消息傳遞機制可以讓集群各計算節(jié)點有條不紊地處理復雜運算任務[7-8]。MPI-DSP充分繼承MPI的已有優(yōu)勢,不改變MPI原有函數(shù)調(diào)用和消息傳遞機制,通過開發(fā)新的功能接口函數(shù),用最簡潔有效的方式對數(shù)據(jù)文件進行存儲管理。MPI-DSP在計算任務開始前,將任務所需目標數(shù)據(jù)以分布式形式分配到各計算節(jié)點,當執(zhí)行計算任務時,在各計算節(jié)點的本地讀取存儲數(shù)據(jù),不用跨節(jié)點讀取,可以有效規(guī)避網(wǎng)絡傳輸瓶頸,提高計算任務的處理效率。它借鑒了Hadoop中HDFS的大數(shù)據(jù)處理模式,同時保持MPI原有的高效運算能力和靈活的消息傳遞機制[9]。
圖1 MPI-DSP系統(tǒng)架構Fig. 1 MPI-DSP system architecture
具體實現(xiàn)中,分兩個階段進行:第一階段,文件上傳、切分與發(fā)送;第二階段,任務處理與結(jié)果匯總。
第一階段將計算任務所需數(shù)據(jù)文件上傳到專用存儲空間。以集群子節(jié)點進程數(shù)量為依據(jù)切分數(shù)據(jù)文件,目的是平衡各節(jié)點的計算與存儲負載,減小計算誤差。將切片文件分別發(fā)送到對應的子節(jié)點上。第二階段是MPI計算任務的核心執(zhí)行階段。各子節(jié)點根據(jù)任務要求讀取數(shù)據(jù)進行計算操作,完成計算任務后匯總結(jié)果到主節(jié)點。
其中文件的切分、傳輸和操作是MPI-DSP的核心部分。組件接口函數(shù)的設計有三條原則:1)不與現(xiàn)有MPI開發(fā)模式產(chǎn)生沖突,實現(xiàn)無縫對接;2)盡可能簡化接口函數(shù)復雜度和調(diào)用方法;3)使MPI對文件的讀取清晰明確。
Hadoop的HDFS以64 MB作為文件切塊的標準大小,這有其優(yōu)勢,但不夠靈活,作業(yè)分割力度不夠彈性[10]。Hadoop的切分方式并不合適MPI環(huán)境:如果源文件不大,切分數(shù)量不多而MPI集群子節(jié)點數(shù)目龐大,將使大量子節(jié)點閑置,造成資源浪費;如果源文件過大,將產(chǎn)生大量切片文件,在集群子節(jié)點數(shù)量有限的情況下會開啟大量進程處理切片文件,造成系統(tǒng)擁塞。因此有必要對Hadoop的切片算法進行改進,發(fā)揮MPI自有的并行特性,提高整體運行效率。
MPI-DSP以計算節(jié)點進程數(shù)作為切分依據(jù),文件切分采用等分切割、平均分配的原則,避免了文件切分大小不均勻的問題。根據(jù)集群中子節(jié)點的進程數(shù)量,將大數(shù)據(jù)源文件連續(xù)、平均地分成若干切片文件,充分利用MPI已有的并行性,實現(xiàn)文件操作并行化,確保集群中每個子節(jié)點進程分配到相應文件。同時對切片文件進行順序編號,文件順序與各計算節(jié)點順序保持一致,可以保障對源文件的有效復原。切分時將切片文件的路徑信息存入主控節(jié)點數(shù)據(jù)庫,便于各子節(jié)點讀取調(diào)用。文件切分的具體操作通過MPI-DSP中的MPI_Split實現(xiàn)。
實現(xiàn)過程如下:1)主節(jié)點通過hostfile查詢MPI集群中子節(jié)點進程數(shù)目;2)找到將要切片操作的源文件,獲取源文件大?。?)將源文件大小按子節(jié)點進程數(shù)均分后設定切片文件大??;4)通過函數(shù)get_split_name傳入源文件名前綴及切片文件編號;5)將切片文件信息存儲到數(shù)據(jù)庫中;6)從源文件中按設定的切片文件大小讀取數(shù)據(jù)寫入切片文件中;7)后一次讀取位置在源文件前一次讀取切片文件大小之后,依次循環(huán);8)直至源文件最后一部分內(nèi)容寫入最后一個切片文件中,完成文件切分操作。
MPI-DSP的運行機制是將切片文件在計算任務開始前就分別發(fā)送給各計算子節(jié)點,有效避免計算節(jié)點在執(zhí)行計算任務時從主節(jié)點調(diào)用數(shù)據(jù)文件,以提高整體任務的運行效率。MPI可以通過自有的消息傳遞機制Send和Recv來發(fā)送接收文件,但對于大數(shù)據(jù)量的文件傳輸,會產(chǎn)生大量通信,造成通信阻塞,影響系統(tǒng)穩(wěn)定性和運行效率。為實現(xiàn)切片文件的有效傳輸,MPI-DSP采用TCP協(xié)議的Socket通信方式[11],以C/S模式,開發(fā)兩個駐留程序Master和Slave。主節(jié)點運行Master,負責數(shù)據(jù)發(fā)送;子節(jié)點駐留Slave,負責數(shù)據(jù)接收[12]。當啟動文件傳輸服務時,這兩個駐留程序?qū)⒈粏訄?zhí)行,分別執(zhí)行發(fā)送和接收操作。
采用Socket方式,一次只能傳輸1 MB數(shù)據(jù),無法應對大文件的傳輸,通過對分布式存儲系統(tǒng)文件傳輸?shù)膬?yōu)化[13]和斷點續(xù)傳技術[14]可以成功突破Socket對傳輸文件大小的限制,實現(xiàn)海量數(shù)據(jù)的傳輸。Master程序通過自定義的get_trans_count函數(shù)獲取待傳文件(即已切分好的文件)需要傳輸?shù)拇螖?shù)。文件傳輸前通過自定義函數(shù)get_filename_master將待傳文件名稱、大小、每次傳輸數(shù)據(jù)量及傳輸次數(shù)發(fā)送給接收端(子節(jié)點)Slave程序。接收端確認收到信息后,主節(jié)點的Master程序開始向接收端分批發(fā)送數(shù)據(jù),直至待傳文件全部傳輸完畢。
“計算向存儲遷移”的關鍵點是讓計算程序能夠快速準確地定位數(shù)據(jù)文件位置,從而讀取文件進行相應操作。因此開發(fā)出MPI_Open函數(shù)。各計算子節(jié)點通過MPI_Open函數(shù)提取數(shù)據(jù)庫中的切片文件路徑,定位切片文件存儲位置,讀取切片文件。關鍵在于,讀取的是子節(jié)點本地存儲的數(shù)據(jù),而無需跨節(jié)點網(wǎng)絡傳輸。
相應步驟如下:1)MPI_Open函數(shù)導入源文件名和文件指針;2)連接數(shù)據(jù)庫,通過源文件名和主機名查找對應切片文件存儲信息;3)通過數(shù)據(jù)庫中切片文件路徑信息,打開該節(jié)點對應的切片文件;4)對該節(jié)點文件進行相應計算操作;5)待各節(jié)點數(shù)據(jù)讀取、操作完畢,將各節(jié)點運算結(jié)果發(fā)送給主節(jié)點,最終由主節(jié)點統(tǒng)一匯總輸出結(jié)果。
MPI_Open函數(shù)設計采用二級指針作為參數(shù),利用參數(shù)的返回值進行值傳遞。實現(xiàn)流程如圖2所示。
MPI_Open接口函數(shù)部分核心代碼如下:
void MPI_Open(char *file_name,FILE **fp)
{
…
node_file=(char*)malloc(100*sizeof(char));
MPI_Get_processor_name(node_name,&namelen);
//獲取節(jié)點名稱
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
//獲取節(jié)點當前進程號
node_name[strlen(node_name)]=′ 迁西县| 夏河县| 宿州市| 开封县| 嘉兴市| 马关县| 登封市| 沧州市| 电白县| 双桥区| 瓮安县| 玛纳斯县| 上思县| 东乡县| 邢台市| 芜湖县| 顺平县| 广饶县| 定远县| 萨嘎县| 临夏市| 旬阳县| 大冶市| 中山市| 彩票| 徐水县| 即墨市| 桦甸市| 赤壁市| 皮山县| 厦门市| 达州市| 建德市| 英超| 梓潼县| 锡林郭勒盟| 专栏| 中卫市| 德保县| 仁怀市| 商南县|