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

表1 不同數量子網個數和計算節點數下的解算時間
由表1可知,隨著子網個數和計算節點數的增加,運行時間在逐步減少,這說明計算效率也在增加。Spark將大數據處理任務分為n塊并行處理,其計算能力優勢隨著計算任務復雜程度增加而擴大。在同樣處理41個IGS連續運行跟蹤站數據工程中,從運行消耗加速比來看,計算節點越多時間越短,計算效率越高。Spark大數據平臺會比Hadoop速度提高約20倍[4],但實際中因環境及應用的不同等原因理論速度通常無法達到,因此,需要做到盡可能合理地分配計算資源,使效率最大化。
本文針對傳統的單機方法無法應對現今對大規模復雜的GNSS觀測數據的處理需求,利用Spark大數據平臺和子網劃分思想實現了基于Spark的基線解算過程的分布式處理,大大提高了計算的效率??梢栽趯嶋H工程中合理有效地分配計算資源,在保證解算精度的前提下,降低執行時間,提高對海量GNSS數據處理能力。