白帆,孫寧
(1.92941部隊(duì),遼寧 葫蘆島125000;2.遼寧工程技術(shù)大學(xué) 軟件學(xué)院,遼寧 葫蘆島 125105)
隨著CORS建立得越來越多,全球衛(wèi)星導(dǎo)航系統(tǒng)(GNSS)觀測(cè)的數(shù)據(jù)量也越來越大,因此,數(shù)據(jù)的存儲(chǔ)及計(jì)算面臨著巨大的挑戰(zhàn)[1]。由于計(jì)算機(jī)和網(wǎng)絡(luò)技術(shù)的迅猛發(fā)展,大規(guī)模海量數(shù)據(jù)的分布式存儲(chǔ)以及計(jì)算也不斷發(fā)展起來,并在現(xiàn)實(shí)社會(huì)中得到了廣泛的應(yīng)用。Spark是專為大規(guī)模數(shù)據(jù)處理而設(shè)計(jì)的快速通用計(jì)算引擎,Spark的出現(xiàn)改善了Hadoop反復(fù)在磁盤上進(jìn)行讀寫操作的缺陷,提高了計(jì)算大規(guī)模海量數(shù)據(jù)的計(jì)算效率?,F(xiàn)如今,已經(jīng)有很多企業(yè)引入Spark大數(shù)據(jù)集群平臺(tái)以解決計(jì)算大規(guī)模復(fù)雜數(shù)據(jù)的瓶頸。針對(duì)目前全球衛(wèi)星導(dǎo)航系統(tǒng)GNSS數(shù)據(jù)量大、計(jì)算效率低等問題,本文將Spark大數(shù)據(jù)集群引入到GNSS網(wǎng)的基線解算中,對(duì)預(yù)處理后的觀測(cè)文件進(jìn)行并行化計(jì)算和存儲(chǔ),通過實(shí)驗(yàn)驗(yàn)證了利用子網(wǎng)劃分思想結(jié)合Spark大數(shù)據(jù)集群平臺(tái)解算GNSS網(wǎng)基線向量的效率。
Hadoop是一個(gè)分布式系統(tǒng)基礎(chǔ)架構(gòu),用戶可以充分利用集群的計(jì)算優(yōu)勢(shì)進(jìn)行高速運(yùn)算和存儲(chǔ)。Hadoop最核心的設(shè)計(jì)是HDFS和MapReduce。
HDFS為海量的數(shù)據(jù)提供了存儲(chǔ),MapReduce為海量的數(shù)據(jù)提供了計(jì)算[2]。Hadoop采用多進(jìn)程模型,如圖1所示。
Hadoop的每個(gè)Task運(yùn)行在JVM進(jìn)程中,且Task不被復(fù)用。MapReduce不構(gòu)建可重用資源池,Task動(dòng)態(tài)申請(qǐng)資源且執(zhí)行結(jié)束后立即釋放資源。啟動(dòng)MapReduce中Task進(jìn)程的速度慢,造成了不必要的啟動(dòng)時(shí)間消耗,不適合運(yùn)行低延遲作業(yè)。
Spark是專為大規(guī)模數(shù)據(jù)處理而設(shè)計(jì)的快速通用的計(jì)算引擎,可用來構(gòu)建大型的、低延遲的數(shù)據(jù)分析應(yīng)用程序。Spark可將中間輸出結(jié)果保存在內(nèi)存中,從而不再反復(fù)讀寫HDFS。實(shí)際上,Spark是對(duì)Hadoop的補(bǔ)充,Spark通過名為Mesos的第三方集群框架可以在Hadoop文件系統(tǒng)中并行運(yùn)行。Scala用作Spark應(yīng)用程序框架,Scala可輕松地操作分布式數(shù)據(jù)集。Spark采用多線程模型,如圖2所示。
Spark的每個(gè)Executor運(yùn)行在JVM進(jìn)程中,Executor中可運(yùn)行多個(gè)ShuffleMapTask或ReduceTask,Task則是在Executor的一個(gè)線程中運(yùn)行,而且Task是可共享的,在Executor中加載一次文件或者數(shù)據(jù)后可一直被Task復(fù)用,直至程序執(zhí)行結(jié)束后釋放資源,避免了任務(wù)重復(fù)申請(qǐng)資源所造成的時(shí)間花費(fèi)。Spark可以建立可重用資源池來運(yùn)行全部的ShuffleMapTask和ReduceTask。Spark啟動(dòng)任務(wù)速度快,可大大降低運(yùn)行時(shí)間。
GAMIT軟件是目前高精度GPS基線解算軟件中最為經(jīng)濟(jì)、使用最廣泛的一個(gè)軟件。GAMIT軟件是由美國(guó)麻省理工學(xué)院(MIT)和斯克里普斯海洋研究所(SIO)聯(lián)合研制的GPS數(shù)據(jù)處理軟件[6]。當(dāng)它采用精密星歷和高精度起算點(diǎn)時(shí),其處理長(zhǎng)基線和連續(xù)時(shí)段靜態(tài)定位相對(duì)精度可達(dá)10e-8~10e-9 數(shù)量級(jí),處理短基線的精度可達(dá)1~3 mm.本文使用的GAMIT版本為GAMIT10.6.
Hadoop分布式文件系統(tǒng)(HDFS)是一種廣泛使用的文件系統(tǒng),而Spark支持讀寫很多種文件系統(tǒng),可以使用任何我們想要的文件格式,Spark能夠很好地使用HDFS。HDFS被設(shè)計(jì)為可以在廉價(jià)的硬件上工作,有彈性地對(duì)應(yīng)節(jié)點(diǎn)失敗,同時(shí)提供高吞吐量。Spark和HDFS可以部署在同一批機(jī)器上,這樣Spark可以利用數(shù)據(jù)分布來盡量避免一些網(wǎng)絡(luò)開銷。在Spark中使用HDFS只需要將輸入輸出路徑指定為hdfs://master:post/path.
YARN是在Hadoop中引入的集群管理器,它可以讓多種數(shù)據(jù)處理構(gòu)架運(yùn)行在一個(gè)共享的資源池上,并且通常安裝在與Hadoop文件系統(tǒng)(簡(jiǎn)稱HDFS)相同的物理節(jié)點(diǎn)上。在這樣配置的YARN集群上運(yùn)行Spark是很有意義的,它可以讓Spark在存儲(chǔ)數(shù)據(jù)的物理節(jié)點(diǎn)上運(yùn)行,以快速訪問HDFS中的數(shù)據(jù)。基于HDFS的觀測(cè)數(shù)據(jù)分布式文件系統(tǒng)結(jié)構(gòu)如圖3所示[4]。
在Spark中使用YARN主要偽代碼如下所示:
第一步,設(shè)置Hadoop配置目錄的環(huán)境變量hadoop-conf-dir。
第二步,使用Spark-submit提交應(yīng)用作業(yè):
exporthadoop-conf-dir=“…”;
Spark-submit——master yarn yourapp。
spark讀取HDFS中的文件和寫入數(shù)據(jù)到HDFS中,主要偽代碼如下所示:
def main(args: Array[String]): Unit={
valconf=new SparkConf()
conf.set("spark.master", "local")
conf.set("spark.app.name", "spark demo")
valsc=new SparkContext(conf);
//讀取HDFS數(shù)據(jù)
valtextFileRdd=sc.textFile("hdfs://路徑")
valfRdd=textFileRdd.flatMap {-.split(" ")}
valmrdd=fRdd.map {(-, 1)}
valrbkrdd=mrdd.reduceByKey(-+-)
//寫入數(shù)據(jù)到HDFS系統(tǒng)
rbkrdd.saveAsTextFile("hdfs://路徑")
}
第一步,由子網(wǎng)劃分創(chuàng)建索引文件,其中子網(wǎng)編號(hào)設(shè)置為文件名,測(cè)站點(diǎn)名設(shè)置為文件內(nèi)容,為了便于對(duì)文件內(nèi)容進(jìn)行操作,各名之間用空格相隔開。
第二步,客戶端上傳文件至HDFS(文件包括:觀測(cè)文件、精密星歷文件、廣播星歷文件、索引文件)。
第三步,建立GAMIT軟件執(zhí)行所需的工程文件目錄。
第四步,解析索引文件后獲取相應(yīng)的子網(wǎng)的全部測(cè)站名,從HDFS中復(fù)制相應(yīng)文件到對(duì)應(yīng)的文件夾中。
第五步,調(diào)用sh-setup鏈接外部表文件tables,再調(diào)用sh-gamit進(jìn)行基線解算。
需注意的是,在此過程中,一個(gè)索引文件對(duì)應(yīng)一個(gè)子網(wǎng)進(jìn)行處理,Spark分配Shuffle Map Task執(zhí)行索引文件?;赟park進(jìn)行基線解算過程如圖4所示。
實(shí)驗(yàn)數(shù)據(jù):采用中國(guó)及周邊地區(qū)41個(gè)IGS連續(xù)運(yùn)行跟蹤站2018年年積日第58天的30 s采樣間隔的觀測(cè)值數(shù)據(jù)文件,如圖5所示。
實(shí)驗(yàn)環(huán)境:所有的實(shí)驗(yàn)都是在實(shí)驗(yàn)室搭建的Spark平臺(tái)上運(yùn)行的。平臺(tái)由10個(gè)節(jié)點(diǎn)組成,物理機(jī)配置為Intel Core i5處理器,主頻2.30 GHz,雙核,內(nèi)存2G.軟件配置:CentOS 6.7,JDK 1.8.0,Hadoop 2.6.0,Spark 1.6.0,Scala 2.12.1.
采用劃分子網(wǎng)的思想,其中單節(jié)點(diǎn)對(duì)整網(wǎng)進(jìn)行基線解算,有幾個(gè)節(jié)點(diǎn)就劃分幾個(gè)子網(wǎng),實(shí)驗(yàn)結(jié)果如表1所示。
表1 不同數(shù)量子網(wǎng)個(gè)數(shù)和計(jì)算節(jié)點(diǎn)數(shù)下的解算時(shí)間
由表1可知,隨著子網(wǎng)個(gè)數(shù)和計(jì)算節(jié)點(diǎn)數(shù)的增加,運(yùn)行時(shí)間在逐步減少,這說明計(jì)算效率也在增加。Spark將大數(shù)據(jù)處理任務(wù)分為n塊并行處理,其計(jì)算能力優(yōu)勢(shì)隨著計(jì)算任務(wù)復(fù)雜程度增加而擴(kuò)大。在同樣處理41個(gè)IGS連續(xù)運(yùn)行跟蹤站數(shù)據(jù)工程中,從運(yùn)行消耗加速比來看,計(jì)算節(jié)點(diǎn)越多時(shí)間越短,計(jì)算效率越高。Spark大數(shù)據(jù)平臺(tái)會(huì)比Hadoop速度提高約20倍[4],但實(shí)際中因環(huán)境及應(yīng)用的不同等原因理論速度通常無法達(dá)到,因此,需要做到盡可能合理地分配計(jì)算資源,使效率最大化。
本文針對(duì)傳統(tǒng)的單機(jī)方法無法應(yīng)對(duì)現(xiàn)今對(duì)大規(guī)模復(fù)雜的GNSS觀測(cè)數(shù)據(jù)的處理需求,利用Spark大數(shù)據(jù)平臺(tái)和子網(wǎng)劃分思想實(shí)現(xiàn)了基于Spark的基線解算過程的分布式處理,大大提高了計(jì)算的效率??梢栽趯?shí)際工程中合理有效地分配計(jì)算資源,在保證解算精度的前提下,降低執(zhí)行時(shí)間,提高對(duì)海量GNSS數(shù)據(jù)處理能力。