任曉鴿
(許昌電氣職業(yè)學(xué)院信息工程系 河南 許昌 461000)
近年來(lái),計(jì)算機(jī)技術(shù)的快速發(fā)展以及互聯(lián)互通的網(wǎng)絡(luò)普及,數(shù)據(jù)采集和傳輸變得越來(lái)越快速、便捷,從而形成了日益龐大而復(fù)雜的數(shù)據(jù)集。網(wǎng)絡(luò)通用數(shù)據(jù)格式是面向海量矩陣數(shù)據(jù)的一種數(shù)據(jù)存儲(chǔ)格式,能夠存儲(chǔ)高維監(jiān)測(cè)數(shù)據(jù),但NetCDF格式數(shù)據(jù)不便共享及移植。Hadoop可實(shí)現(xiàn)對(duì)數(shù)據(jù)的分布式存儲(chǔ),避免了傳統(tǒng)服務(wù)器的高成本、低共享等弊端。然而Hadoop不能直接存儲(chǔ)NetCDF格式數(shù)據(jù)[1]。
鑒于大數(shù)據(jù)系統(tǒng)缺乏對(duì)科學(xué)數(shù)據(jù)格式的支持,是數(shù)據(jù)驅(qū)動(dòng)科學(xué)進(jìn)一步采用大數(shù)據(jù)技術(shù)、進(jìn)一步提高科學(xué)生產(chǎn)力的嚴(yán)重障礙。因此,本文基于Hadoop大數(shù)據(jù)框架,深入分析HDFS數(shù)據(jù)存寫、分塊架構(gòu),增加了Hadoop對(duì)NetCDF數(shù)據(jù)讀寫接口,提高了數(shù)據(jù)的可移植性和訪問(wèn)效率,使HDFS能夠支持對(duì)NetCDF數(shù)據(jù)的存儲(chǔ)。
Hadoop是一個(gè)由Apache基金會(huì)開發(fā)維護(hù)的開源分布式計(jì)算與存儲(chǔ)框架[2],可以支持Java等程序設(shè)計(jì)語(yǔ)言二次開發(fā)。Hadoop框架主要應(yīng)用于對(duì)海量數(shù)據(jù)的存儲(chǔ)與計(jì)算分析中,廣義上的Hadoop是一個(gè)完整的生態(tài)系統(tǒng),包括HDFS、Map Reduce、Hive、HBase等,架構(gòu)如圖1所示。而核心是HDFS文件存儲(chǔ)及Map Reduce分布式計(jì)算[3]。
圖1 Hadoop架構(gòu)
HDFS全稱Hadoop Distributed File System,是大數(shù)據(jù)文件系統(tǒng),主要負(fù)責(zé)存儲(chǔ)和管理文件,幫助解決文件在底層的存儲(chǔ)問(wèn)題[4]。HDFS支持對(duì)海量數(shù)據(jù)的存儲(chǔ),并可以擴(kuò)充節(jié)點(diǎn)以增加存儲(chǔ)能力。HDFS開發(fā)需求源自對(duì)流數(shù)據(jù)模式的訪問(wèn)及對(duì)超大文件的處理,是分布式存儲(chǔ)的基礎(chǔ),可在廉價(jià)的商用服務(wù)器上運(yùn)行,并具有強(qiáng)大的容錯(cuò)能力,集群中的節(jié)點(diǎn)出現(xiàn)故障不會(huì)對(duì)系統(tǒng)使用產(chǎn)生影響。HDFS具有高容錯(cuò)、高效率、高可靠、高吞吐、高可伸縮、高獲得性等特點(diǎn)。HDFS采用主從架構(gòu),集群中包含一個(gè)NameNode節(jié)點(diǎn)及若干DataNode節(jié)點(diǎn)。NameNode作為master,負(fù)責(zé)管理文件系統(tǒng)命名及客戶端對(duì)文件操作,DataNode作為slave,負(fù)責(zé)管理節(jié)點(diǎn)數(shù)據(jù)存儲(chǔ),通常一個(gè)物理節(jié)點(diǎn)對(duì)應(yīng)一個(gè)DataNode。其架構(gòu)圖如圖2所示。
圖2 HDFS系統(tǒng)架構(gòu)
Map Reduce是處理大規(guī)模數(shù)據(jù)的一種并行計(jì)算模型,由Google公司提出。該編程框架可由眾多普通服務(wù)器構(gòu)成集群,把大規(guī)模的數(shù)據(jù)集分發(fā)到單個(gè)節(jié)點(diǎn),采用“分而治之、化繁為簡(jiǎn)”的思想[5],集群分節(jié)點(diǎn)并行處理所分發(fā)計(jì)算任務(wù),主節(jié)點(diǎn)管理分節(jié)點(diǎn)并匯總?cè)蝿?wù)結(jié)果。簡(jiǎn)而言之,Map Reduce由Map和Reduce兩個(gè)階段組成,Map服務(wù)任務(wù)分發(fā),Reduce服務(wù)任務(wù)匯總,即可實(shí)現(xiàn)分布式并行計(jì)算[6]。
Zookeeper是一個(gè)分布式協(xié)調(diào)服務(wù)框架,該框架可實(shí)現(xiàn)對(duì)分布式應(yīng)用配置項(xiàng)管理,提供狀態(tài)同步、集群管理等服務(wù)。Zookeeper是基于觀察者的設(shè)計(jì)模式,主要負(fù)責(zé)對(duì)數(shù)據(jù)狀態(tài)的監(jiān)管,一旦變化,則通知已注冊(cè)觀察者。Zookeeper集群中節(jié)點(diǎn)數(shù)目往往是大于等于3的奇數(shù),若主節(jié)點(diǎn)出現(xiàn)故障,剩余節(jié)點(diǎn)大于一半時(shí),則產(chǎn)生新的主節(jié)點(diǎn),繼續(xù)提供服務(wù)。
Hive是基于Hadoop體系的一個(gè)數(shù)據(jù)倉(cāng)庫(kù)工具,是Facebook公司管理海量社交數(shù)據(jù)所研發(fā)的倉(cāng)庫(kù)工具。HDFS可存儲(chǔ)結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù),Hive處理其中的結(jié)構(gòu)化數(shù)據(jù)文件,可將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)表。另外,Hive提供有SQL查詢功能,該功能可將SQL語(yǔ)句轉(zhuǎn)化為Map Reduce任務(wù)進(jìn)行并行計(jì)算。
HBase是面向分布式、面向列的一個(gè)開源數(shù)據(jù)庫(kù)。HBase源于Fay Chang的一篇名為《Bigtable:一個(gè)結(jié)構(gòu)化數(shù)據(jù)的分布式存儲(chǔ)系統(tǒng)》論文。如Bigtable使用Google File System所提供分布式存儲(chǔ),HBase在Hadoop上提供了類似Bigtable的功能。不同于一般關(guān)系型數(shù)據(jù)庫(kù),HBase是基于列模式適用于非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)庫(kù)。
隨著計(jì)算機(jī)技術(shù)的快速發(fā)展以及互聯(lián)互通的網(wǎng)絡(luò)普及,數(shù)據(jù)采集和傳輸變得越來(lái)越快速、便捷,從而形成了日益龐大而復(fù)雜的數(shù)據(jù)集。面對(duì)海量數(shù)據(jù),我們需要從中挖掘出一般信息來(lái)指導(dǎo)各種各樣決策。氣象衛(wèi)星、水文監(jiān)測(cè)站等數(shù)據(jù)監(jiān)測(cè)設(shè)備種類繁多,因每個(gè)設(shè)備的數(shù)據(jù)采集系統(tǒng)接收和存儲(chǔ)的數(shù)據(jù)格式不一致,所以采集的數(shù)據(jù)在共享上存在相互不兼容的現(xiàn)象。地表徑流等科學(xué)數(shù)據(jù)為解決多源數(shù)據(jù)格式差異問(wèn)題,避免因生成的數(shù)據(jù)文件格式類型不同造成的差異,以方便科研數(shù)據(jù)共享、提高研發(fā)效率,使用在國(guó)內(nèi)外科研領(lǐng)域有一定執(zhí)行標(biāo)準(zhǔn)的規(guī)范格式作為數(shù)據(jù)格式轉(zhuǎn)換的目標(biāo)格式。網(wǎng)絡(luò)通用數(shù)據(jù)格式,全稱Network Common Data Form(NetCDF),就是面向海量矩陣數(shù)據(jù)的一種數(shù)據(jù)存儲(chǔ)格式,能夠存儲(chǔ)高維科研監(jiān)測(cè)數(shù)據(jù)。現(xiàn)已成為氣象、海洋等科學(xué)研究領(lǐng)域廣泛采用的一種通用的數(shù)據(jù)存儲(chǔ)格式。本文測(cè)試數(shù)據(jù)集為地表徑流數(shù)據(jù)集,就是基于NetCDF格式存儲(chǔ)。
地表徑流數(shù)據(jù)往往是多維的,包含時(shí)間、空間及變量等信息,數(shù)據(jù)存儲(chǔ)以單文件為單位。NetCDF中的維、變量、屬性需要用標(biāo)準(zhǔn)的語(yǔ)法結(jié)構(gòu)來(lái)進(jìn)行說(shuō)明,數(shù)據(jù)文件結(jié)構(gòu)包含如下內(nèi)容:
NetCDF的數(shù)學(xué)意義相當(dāng)于具有多個(gè)自變量的單值函數(shù)。該單值函數(shù)的數(shù)學(xué)表達(dá)式可描述為f(x,y,z)=value。其中,f函數(shù)中的自變量x,y,z在NetCDF中叫作維,函數(shù)值value在NetCDF中叫作變量。函數(shù)值和自變量的性質(zhì),如單位等,在NetCDF中就叫作屬性。
地表徑流數(shù)據(jù)集是由大量傳感器等觀測(cè)設(shè)備采集匯聚而成,除了具備高維度、高規(guī)模、高增速、高實(shí)時(shí)等特點(diǎn)外,還具備一些其他特點(diǎn)。首先,地表徑流數(shù)據(jù)集具有高訪問(wèn)性,寫入數(shù)據(jù)后,系統(tǒng)要多次訪問(wèn),修改刪除操作較少,事務(wù)性要求低,而Hadoop分布式存儲(chǔ)框架具有較高的讀取效率,符合對(duì)該類數(shù)據(jù)的存儲(chǔ)。其次,地表徑流數(shù)據(jù)內(nèi)容中,具有時(shí)空信息屬性。地理空間信息以經(jīng)緯度來(lái)體現(xiàn),時(shí)間以數(shù)據(jù)觀測(cè)采集時(shí)間點(diǎn)來(lái)體現(xiàn)。數(shù)據(jù)滿足散列性原則,可以提高多機(jī)負(fù)載均衡,降低同時(shí)空數(shù)據(jù)的熱點(diǎn)集中。將地表徑流數(shù)據(jù)進(jìn)行分布式存儲(chǔ)也面臨一些問(wèn)題,如對(duì)非結(jié)構(gòu)化的小文件存儲(chǔ),每一個(gè)文件都會(huì)在HDFS中占據(jù)一個(gè)block,這些block會(huì)在NameNode中占據(jù)一定的內(nèi)存空間以便映射到DataNode,一定程度增加了NameNode的高負(fù)載,影響集群性能。因此,需要對(duì)數(shù)據(jù)文件進(jìn)行預(yù)處理,以提高集群性能。
綜上所述,對(duì)于地表徑流數(shù)據(jù)的分布式存儲(chǔ),Hadoop分布式存儲(chǔ)具有較高的效率。
對(duì)于NetCDF格式的地表徑流數(shù)據(jù),本文采用HDFS分布式存儲(chǔ)架構(gòu),將地表徑流數(shù)據(jù)分塊存儲(chǔ)于集群中的節(jié)點(diǎn)上,通過(guò)設(shè)置分塊大小及數(shù)據(jù)副本,提高系統(tǒng)容錯(cuò)性,以實(shí)現(xiàn)對(duì)數(shù)據(jù)的高效存儲(chǔ)及安全維護(hù)。Unidata提供了針對(duì)NetCDF的Java庫(kù),本文基于Java庫(kù)改進(jìn)了接口對(duì)于NetCDF數(shù)據(jù)的讀取,寫入數(shù)據(jù)到HDFS集群上,如圖3所示。
圖3 NetCDF寫入HDFS
集群主客戶端對(duì)地表徑流數(shù)據(jù)集進(jìn)行分片,由于地表徑流數(shù)據(jù)的時(shí)空緊密性,因此很難對(duì)一個(gè)完整的NetCDF分片時(shí)保證完整性。本文編寫自定義映射程序來(lái)分析NetCDF數(shù)據(jù)屬性等信息,依賴索引使Hadoop可以按鍵進(jìn)行數(shù)據(jù)解析。首先,創(chuàng)建HDFSClient的實(shí)例,即Distributed File System,調(diào)用create方法創(chuàng)建文件;其次,Distributed File System實(shí)例對(duì)象在NameNode節(jié)點(diǎn)創(chuàng)建新文件;再次,當(dāng)文件檢查通過(guò)后,返回一個(gè)FSDataOutputStream寫入數(shù)據(jù)的輸出流對(duì)象,調(diào)用create方法,就可寫入NetCDF數(shù)據(jù)到DataNode節(jié)點(diǎn)。
對(duì)于NetCDF格式的地表徑流數(shù)據(jù),Unidata提供的NetCDF的Java庫(kù)只適用于讀取本地文件。本文在深入分析接口讀寫邏輯基礎(chǔ)上,復(fù)寫了函數(shù)庫(kù)的讀寫接口,該接口可以方便地對(duì)HDFS存儲(chǔ)文件進(jìn)行讀取操作,設(shè)計(jì)流程圖如圖4所示。
圖4 HDFS下NetCDF讀取
分布式文件系統(tǒng)的存儲(chǔ)性能可由文件操作響應(yīng)速度及可靠性來(lái)體現(xiàn)。對(duì)于Hadoop分布式框架來(lái)講,其節(jié)點(diǎn)是可擴(kuò)展的,因此分布式存儲(chǔ)節(jié)點(diǎn)的拓展性可保證數(shù)據(jù)的安全可靠。而響應(yīng)速度依賴于Hadoop框架的啟動(dòng)時(shí)間、單節(jié)點(diǎn)的耗時(shí)及集群的并發(fā)數(shù)。而并發(fā)數(shù)依賴于并發(fā)任務(wù)極值數(shù)和數(shù)據(jù)分塊極值數(shù),并發(fā)任務(wù)極值數(shù)和服務(wù)器性能呈正相關(guān),數(shù)據(jù)分塊極值數(shù)和寫入HDFS分塊大小值呈負(fù)相關(guān)。
其中,T總為響應(yīng)總時(shí)長(zhǎng);THadoop為Hadoop框架啟動(dòng)時(shí)長(zhǎng);T單節(jié)點(diǎn)為單節(jié)點(diǎn)響應(yīng)時(shí)長(zhǎng);CPU為服務(wù)器核心數(shù);H閾值為HDFS分布式存儲(chǔ)框架存放文件分塊大小,相對(duì)其他影響因素,分塊大小成為可調(diào)參數(shù)。因此,可通過(guò)調(diào)整分塊大小測(cè)試其效率。通過(guò)設(shè)置分塊大小依次為32 M、64 M、128 M、256 M,并執(zhí)行3次實(shí)驗(yàn),其響應(yīng)速度如表1所示。
表1 HDFS數(shù)據(jù)塊參數(shù)調(diào)優(yōu)實(shí)驗(yàn)
對(duì)比實(shí)驗(yàn)結(jié)果,數(shù)據(jù)響應(yīng)時(shí)間受數(shù)據(jù)塊大小影響明顯。如果數(shù)據(jù)塊閾值設(shè)置過(guò)小,則會(huì)產(chǎn)生大量數(shù)據(jù)文件,從而產(chǎn)生大量任務(wù),增加了任務(wù)開銷。如果數(shù)據(jù)塊閾值設(shè)置過(guò)大,則數(shù)據(jù)文件降低,任務(wù)數(shù)隨之降低,但單節(jié)點(diǎn)數(shù)據(jù)處理時(shí)間遞增,會(huì)耗費(fèi)集群資源,降低響應(yīng)速度。本實(shí)驗(yàn)結(jié)果表明,將集群數(shù)據(jù)塊閾值設(shè)置為64 M時(shí),對(duì)地表徑流數(shù)據(jù)的響應(yīng)速度最快。
通過(guò)上文對(duì)該架構(gòu)的需求分析、架構(gòu)設(shè)計(jì)與功能實(shí)現(xiàn),完成了基于Hadoop的NetCDF數(shù)據(jù)存儲(chǔ)架構(gòu)。借助3臺(tái)16G內(nèi)存、6核12線程、2T硬盤服務(wù)器搭建Hadoop集群。數(shù)據(jù)集為2012年黃河某段地表徑流數(shù)據(jù),大小為45G。如表2所示。
表2 Hadoop分布式框架與本地文件系統(tǒng)效率對(duì)比
對(duì)比實(shí)驗(yàn)結(jié)果,采用Hadoop分布式存儲(chǔ)框架處理地表徑流數(shù)據(jù),相比傳統(tǒng)的本地文件存儲(chǔ)系統(tǒng)速度要快,并在數(shù)據(jù)集越大時(shí),效率越高。如在數(shù)據(jù)集為45 G時(shí),Hadoop分布式存儲(chǔ)僅僅需要26 min就可完成數(shù)據(jù)的寫入處理,而本地文件系統(tǒng)需要5~6 min才能完成。實(shí)驗(yàn)表明,Hadoop分布式存儲(chǔ)框架在對(duì)地表徑流數(shù)據(jù)存儲(chǔ)方面效率更高,為后續(xù)科學(xué)計(jì)算提供了基礎(chǔ)。
綜上所述,Hadoop分布式架構(gòu)自身具有的高容錯(cuò)、高效率、高可靠、高吞吐量、高可伸縮、高獲得性等優(yōu)點(diǎn),對(duì)于解決海量數(shù)據(jù)分布式存儲(chǔ)、計(jì)算具有重要意義。本文基于Hadoop的NetCDF數(shù)據(jù)存儲(chǔ)研究,設(shè)計(jì)了HDFS針對(duì)NetCDF數(shù)據(jù)的讀寫訪問(wèn)接口,實(shí)現(xiàn)了NetCDF格式數(shù)據(jù)的共享及移植和用Hadoop存儲(chǔ)NetCDF數(shù)據(jù)。通過(guò)該方法避免了Hadoop讀寫NetCDF時(shí)預(yù)先轉(zhuǎn)換NetCDF數(shù)據(jù)所產(chǎn)生的大量中間數(shù)據(jù)集問(wèn)題,降低了存儲(chǔ)開銷,提高了讀取操作響應(yīng)效率,為NetCDF的分布式計(jì)算奠定了一定基礎(chǔ)。