李 濤 馮仲科 孫素芬 程文生
(1.北京林業(yè)大學(xué)精準(zhǔn)林業(yè)北京市重點實驗室, 北京 100083; 2.北京市農(nóng)林科學(xué)院農(nóng)業(yè)科技信息研究所, 北京 100097)
海量的氣象數(shù)據(jù)可以通過物聯(lián)網(wǎng)天氣傳感器設(shè)備或者網(wǎng)絡(luò)爬蟲收集,這些數(shù)據(jù)生成源以連續(xù)的方式生成大量數(shù)據(jù)[1-3],這種氣候數(shù)據(jù)大多是傳統(tǒng)數(shù)據(jù)處理工具和技術(shù)無法處理的結(jié)構(gòu)化、半結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)[4-6]。傳統(tǒng)數(shù)據(jù)挖掘算法和統(tǒng)計方法難以存儲并處理這類數(shù)據(jù)[7-9],氣候數(shù)據(jù)需要一個可擴展的分布式框架來存儲和處理,并在季節(jié)性氣候中獲得更有意義的變化信息[10-11]。雖然國內(nèi)外有許多氣候氣象WebGIS數(shù)據(jù)管理分析系統(tǒng),但由于氣象站和計量中心在不間斷地產(chǎn)生新的實時數(shù)據(jù),這些數(shù)據(jù)在傳統(tǒng)WebGIS平臺中是無法進行存儲與計算的[12-15]。因此,需要可擴展的分布式地理空間WebGIS系統(tǒng)來分析和利用氣象數(shù)據(jù)[16]。本文結(jié)合Hadoop的分布式計算和存儲技術(shù)、地理信息系統(tǒng)相關(guān)技術(shù)、數(shù)據(jù)庫技術(shù),以實際需要的設(shè)計要求,實現(xiàn)氣象地理信息的采集、篩選、儲存、分析、顯示應(yīng)用等功能,采用瀏覽器端進行數(shù)據(jù)的展示與分析。
氣象地理信息主要包括氣象屬性信息以及對應(yīng)的地理空間信息。隨著互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,如今可以利用網(wǎng)絡(luò)爬蟲技術(shù)抓取相關(guān)的網(wǎng)絡(luò)平臺數(shù)據(jù),通過篩選所需要的數(shù)據(jù)并轉(zhuǎn)換為云計算可用的數(shù)據(jù)結(jié)構(gòu),便可以積累海量的可進行分布式計算的氣象地理信息數(shù)據(jù)。
通過網(wǎng)絡(luò)爬蟲或者物聯(lián)網(wǎng)天氣傳感器設(shè)備獲取到的海量氣象地理信息數(shù)據(jù)大多是非結(jié)構(gòu)化的文本格式數(shù)據(jù),也可以通過其他方式獲取可以用于氣象分析與展示的柵格影像。這些數(shù)據(jù)一般是TB級以上的數(shù)據(jù)量,由于硬件資源限制,在單機環(huán)境下是無法進行處理或存儲的[17-21]。為了解決海量氣象數(shù)據(jù)的存儲問題,通常情況下是將數(shù)據(jù)分配到多個操作系統(tǒng)管理磁盤中,但是該種方式不便于工作人員的管理和維護,因此迫切需要一種能夠同時管理多臺機器上文件的分布式文件管理系統(tǒng)[22-25]。
分布式文件管理系統(tǒng)種類很多,但是所有的系統(tǒng)都是基于一次寫入、多次查詢的情況,不支持并發(fā)與寫入情況,本文采用Hadoop體系下開源的分布式文件管理系統(tǒng)HDFS,其采用主從架構(gòu)來管理文件,即由一個名稱節(jié)點和多個數(shù)據(jù)節(jié)點組成了一個分布式文件系統(tǒng)(Hadoop distributed file system,HDFS)集群。名稱節(jié)點的作用為:負責(zé)客戶端請求和響應(yīng);元數(shù)據(jù)的管理,包括查詢和修改。數(shù)據(jù)節(jié)點的作用為:存儲管理用戶文件塊數(shù)據(jù);定期向名稱節(jié)點匯報自身所持有的塊信息,即通過心跳信息上報自身情況。
在海量氣象數(shù)據(jù)的分析計算方面,傳統(tǒng)單節(jié)點WebGIS系統(tǒng)通過擴展到集群來分布式運行,將極大地增加程序的復(fù)雜度和開發(fā)難度,因此本文引入一個分布式運算程序的MapReduce編程框架,其核心功能是將用戶編寫的業(yè)務(wù)邏輯代碼和自帶默認組件整合成一個完整的分布式運算程序,并發(fā)運行在服務(wù)器集群上。開發(fā)人員可以將絕大部分工作集中到業(yè)務(wù)邏輯開發(fā)上,而將分布式計算中的復(fù)雜度交由框架來處理[26-27]。
本系統(tǒng)基于Hadoop生態(tài)體系進行搭建,包括數(shù)據(jù)獲取層、云計算層、云存儲層和前端顯示層。數(shù)據(jù)獲取層的數(shù)據(jù)來源于網(wǎng)絡(luò)爬蟲爬取的氣象數(shù)據(jù)[28]或者物聯(lián)網(wǎng)天氣傳感器設(shè)備中采集的數(shù)據(jù)。云存儲層、云計算層分別是Hadoop的分布式存儲框架HDFS和分布式計算框架MapReduce,主要功能是將當(dāng)前的海量空間數(shù)據(jù)進行統(tǒng)一格式化處理,并將其存入到分布式文件系統(tǒng)中,通過并行處理框架可以對包含空間屬性的氣象數(shù)據(jù)進行大數(shù)據(jù)量的快速分布式計算得到分析結(jié)果。前端顯示層則是利用Cesium進行三維可視化展現(xiàn)。整個平臺結(jié)構(gòu)如圖1所示。
圖1 平臺結(jié)構(gòu)Fig.1 Platform structure
1.2.1數(shù)據(jù)獲取模塊
從物聯(lián)網(wǎng)天氣傳感器設(shè)備獲取數(shù)據(jù),或利用網(wǎng)絡(luò)爬蟲抓取氣象相關(guān)網(wǎng)頁來獲取相關(guān)數(shù)據(jù)。利用爬蟲WebDriver和PhantomJs技術(shù)相應(yīng)接口對得到的網(wǎng)頁內(nèi)容進行解析,進而獲取需要的氣象地理信息。由于得到的信息很多雜亂無章,為了獲取真實需要的信息數(shù)據(jù),在獲取元素信息后,還需要利用正則表達式對這些屬性信息進行篩選判別,同時進行格式統(tǒng)一處理,最后將輸出后的數(shù)據(jù)以GeoJson或者其他文本格式合并保存。
1.2.2云存儲模塊
由于HDFS平臺不適合管理小文件,所以首先對采集到的大量小文件進行合并。
小文件合并有以下3種方式:①在采集數(shù)據(jù)時,將小文件合并為大文件再上傳至HDFS。②在業(yè)務(wù)處理之前,使用HDFS上的MapReduce程序?qū)π∥募M行合并。③在利用MapReduce處理小文件時,采用conbineInputFormat提高效率。
1.2.3云計算分析模塊
由MapReduce的工作流程可知,Hadoop下的空間數(shù)據(jù)并行操作共需要6個步驟:
(1)MapReduce程序啟動時,最先啟動的是MRAppMaster(MapReduce程序啟動節(jié)點),MRAppMaster啟動后根據(jù)本次作業(yè)的描述信息,計算出需要的Map任務(wù)實例數(shù)量,然后向集群申請啟動相應(yīng)數(shù)量的Map任務(wù)進程。
(2)利用客戶指定的輸入格式來獲取RecordReader并讀取數(shù)據(jù),形成輸入鍵值對。
(3)將輸入鍵值對傳遞給客戶定義的Map方法,做邏輯運算,并將Map方法輸出的鍵值對收集到緩存中。
(4)將緩存中的鍵值對按照鍵值分區(qū)排序后不斷溢寫到磁盤文件中。
(5)MRAppMaster監(jiān)控到所有Map任務(wù)完成后,根據(jù)客戶指定的參數(shù)啟動相應(yīng)數(shù)量的Reduce任務(wù)進程,并告知Reduce任務(wù)進程要處理的數(shù)據(jù)范圍,進行數(shù)據(jù)分區(qū)。
(6)Reduce任務(wù)進程啟動之后,根據(jù)MRAppMaster告知的待處理數(shù)據(jù)所在位置,從若干臺運行Map任務(wù)的機器上獲取若干個輸出結(jié)果文件,并在本地進行重新歸并排序,然后按照相同鍵值的鍵值對為一個組,調(diào)用客戶定義的Reduce方法進行邏輯運算,并收集運算輸出的結(jié)果鍵值對,然后調(diào)用客戶指定的輸出個數(shù)將結(jié)果數(shù)據(jù)輸出到外部存儲,通過空間數(shù)據(jù)轉(zhuǎn)換接口將結(jié)果保存成GeoJson類型數(shù)據(jù)并存儲在各個HDFS節(jié)點中,整個并行操作過程就此結(jié)束。
氣象數(shù)據(jù)計算流程圖如圖2所示。
圖2 氣象數(shù)據(jù)計算流程圖Fig.2 Flow chart of weather data calculation
1.2.4海量氣象數(shù)據(jù)結(jié)構(gòu)
由于云計算需要的數(shù)據(jù)類型應(yīng)該是非格式化的數(shù)據(jù),地理信息常用的格式shp或者dbf都是格式化數(shù)據(jù),因此不滿足云計算的數(shù)據(jù)要求。在地理空間非格式化數(shù)據(jù)中,GeoJson基于Json(Javascript 對象簡譜),數(shù)據(jù)以鍵值對的形式進行存儲,可以充分滿足這種數(shù)據(jù)結(jié)構(gòu)要求,也符合開放地理空間信息聯(lián)盟(OGC)標(biāo)準(zhǔn)。另一方面,在前端進行三維可視化時,通過AJAX(異步 Javascript和XML)也可以很方便地使用這種格式。GeoJson數(shù)據(jù)的geometry屬性中的type字段包含了點、線、面、多點、多線、多面等常用的地理信息系統(tǒng)幾何類型,因此本研究采用GeoJson作為Hadoop中的分布式存儲管理格式。示例數(shù)據(jù)中具有地理實體的唯一標(biāo)識符號id、地理實體坐標(biāo)信息coordinates、地理實體的氣象屬性信息數(shù)組properties等。其數(shù)據(jù)格式為:{
"type": "FeatureCollection",
"totalFeatures": 1376,∥要素數(shù)量合計
"features": [{
"type": "Feature",∥要素類型
"id": "china_air_quality20171216_0.1",∥要素編號
"geometry": {∥幾何屬性
"type": "Point",∥幾何類型為點狀要素
"coordinates": [116.366, 39.8673]∥要素的經(jīng)緯度坐標(biāo)},
"geometry_name": "the_geom",
"properties": {∥要素的屬性表
"監(jiān)測點編碼": "1001A","監(jiān)測點名稱": "YN001","經(jīng)度": 116.366,"緯度": 39.8673,"日期": 20161216,"時間": 0,"AQI": 41,"PM2_5": 14,"PM2_5_24h": 46,"PM10": 41,"PM10_24h": 41,"SO2": 1,"SO2_24h": 6,"NO2": 7,"NO2_24h": 32,"O3": 60,"O3_24h": 63,"O3_8h": 59,"O3_8h_24h": 60,"CO": 0.2,"CO_24h": 0.7}
},...],
"crs": {"type": "name",
"properties":{"name":"urn:ogc:def:crs:EPSG::4326"}}}
本文使用網(wǎng)絡(luò)爬蟲爬取的氣象數(shù)據(jù)包括逐日監(jiān)測點編碼、監(jiān)測點名稱、經(jīng)緯度、獲取日期、AQI、PM2.5含量、PM10含量、SO2含量、NO2含量、O3含量、CO含量、氣溫、降水量、相對濕度、日照時數(shù)等參數(shù)。使用的數(shù)據(jù)為從爬取的數(shù)據(jù)中篩選出的2016年云南省氣象臺站歷史數(shù)據(jù)。
系統(tǒng)代碼編寫工具為Ecplise,版本為Mars。使用Maven作為項目管理構(gòu)建工具。
獲取PhantomJSDriver的工具類實例代碼如下
public static WebDriver getPhantomJs() {
String osname=System.getProperties().getProperty("os.name");
if (osname.equals("Linux")) {
System.setProperty("phantomjs.binary.path", "/usr/bin/phantomjs");
} else {
System.setProperty("phantomjs.binary.path", "./phantomjs/win/phantomjs.exe");}
DesiredCapabilities=DesiredCapabilities.phantomjs();
desiredCapabilities.setCapability("phantomjs.page.settings.userAgent", "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0");
desiredCapabilities.setCapability("phantomjs.page.customHeaders.User-Agent", "Mozilla/5.0 (Windows NT 6.3; Win64;x64;rv:50.0)Gecko/20100101 Firefox/50.0");
if (Constant.isProxy) {
org.openqa.selenium.Proxy proxy=new org.openqa.selenium.Proxy(); proxy.setProxyType(org.openqa.selenium.Proxy.ProxyType.MANUAL);
proxy.setAutodetect(false);
String proxyStr="";
do {
proxyStr=ProxyUtil.getProxy();
} while (proxyStr.length()==0);
proxy.setHttpProxy(proxyStr);
desiredCapabilities.setCapability(CapabilityType.PROXY, proxy);
}
return new PhantomJSDriver(desiredCapabilities);
}try{
WebDriver=PhantomJsUtil.getPhantomJs();
webDriver.get(url);
SleepUtil.sleep(Constant.SEC_5);
PhantomJsUtil.screenshot(webDriver);
WebDriverWait wait=new WebDriverWait(webDriver, 10);
wait.until(ExpectedConditions.presenceOfElementLocated(By.id(inputId)));
Document=Jsoup.parse(webDriver.getPageSource());
}finally{
if (webDriver != null) {
webDriver.quit();}}
針對海量影像數(shù)據(jù)的存儲,利用HDFS技術(shù)對2TB左右容量的全球柵格地圖進行分節(jié)點管理。對于海量文本格式的氣象地理信息數(shù)據(jù),利用MapReduce框架實現(xiàn)分布式計算功能以及云南省空氣質(zhì)量監(jiān)測站點空間位置及其氣象參數(shù)的快速查詢展示。
2.2.1集群部署
Linux環(huán)境下Centos版本為7.4,Hadoop版本為Hadoop3.0,JDK版本為Java 1.8_161。本次試驗采用8個服務(wù)器節(jié)點組成的集群。配置8個節(jié)點的IP地址、機器名稱以及其代表的角色、網(wǎng)絡(luò)配置,如表1所示。
表1 集群各節(jié)點地址及其角色Tab.1 Cluster node addresses and their roles
在Master節(jié)點上的hosts文件中添加集群中各節(jié)點的主機名和IP地址。安裝jdk1.8環(huán)境、Hadoop3.0環(huán)境到名稱節(jié)點并遠程復(fù)制到其余7個數(shù)據(jù)節(jié)點上。在數(shù)據(jù)節(jié)點上修改Hadoop目錄下的/etc/hadoop/workers為數(shù)據(jù)節(jié)點的機器名稱。最后配置Hadoop集群環(huán)境:①core-site.xml是Hadoop的核心配置文件,這里需要配置兩個屬性,fs.default.name配置Hadoop的HDFS系統(tǒng)的名稱,位置為主機的9000端口。hadoop.tmp.dir配置Hadoop的臨時目錄根位置。②hdfs-site.xml是HDFS的配置文件,dfs.http.address配置HDFS的http訪問位置,dfs.replication配置文件塊的副本數(shù),一般不大于從機的個數(shù)。③配置文件mapred-site.xml是MapReduce任務(wù)的配置,由于hadoop2.x使用了Yarn框架,所以要實現(xiàn)分布式部署,必須在mapreduce.framework.name屬性下配置為Yarn。其中mapred.map.tasks和mapred.reduce.tasks分別為Map和Reduce的任務(wù)數(shù)。④配置節(jié)點yarn-site.xml,該文件為Yarn框架的配置,為一些任務(wù)的啟動位置。
為了方便集群的維護,Hadoop自帶了一個歷史服務(wù)器,可以通過歷史服務(wù)器查看已經(jīng)運行完的MapReduce作業(yè)記錄,比如用了多少個Map或者Reduce、作業(yè)提交時間、作業(yè)啟動時間、作業(yè)完成時間等信息。默認情況下,Hadoop歷史服務(wù)器是沒有啟動的,可以通過/hadoop-3.0.0/sbin/mr-jobhistory-daemon.sh start historyserver命令來啟動Hadoop歷史服務(wù)器。這樣就可以訪問主機的19888端口,查看已經(jīng)運行完的氣象數(shù)據(jù)分析作業(yè)情況。
2.2.2MapReduce分布式計算代碼
(1)Map階段代碼
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line=value.toString();
String year=line.substring(15, 19);
int airTemperature;
if(line.charAt(14)=='+' )
{airTemperature=Integer.parseInt(line.substring(11, 12));}
else{
airTemperature=Integer.parseInt(line.substring(15, 16));}
String temperature= line.substring(19, 21); if(airTemperature != MISSING && temperature.matches("[01459]"))
{ context.write(new Text(year), new IntWritable(airTemperature));}}
(2)Reduce階段代碼
public void reduce(Text key, Iterable〈IntWritable〉 values, Context context) throws IOException, InterruptedException {
int minValue=Integer.MAX_VALUE;
for(IntWritable value:values)
{minValue=Math.min(minValue, value.get()); } context.write(key, new IntWritable(minValue));}
MapReduce程序的運行步驟為:啟動HDFS和Yarn,然后在集群中的任意一臺服務(wù)器上啟動執(zhí)行程序[hadoop@lt mapreduce]$ hadoop jarhadoop-mapreduce-gis.jar geojson/ncep1979-2017.gz/geojson/out。
采用Cesium框架的三維可視化進行前端結(jié)果展示,實現(xiàn)如下功能:①海量矢量格式數(shù)據(jù)的查詢渲染展示,利用Cesium的Entity來實現(xiàn)任意渲染,有諸多點、線、面渲染形式可供選擇,點擊可查看管理其屬性,也可以利用字段模糊查詢得到結(jié)果,使用Cesium的Infobox模塊可以實現(xiàn),最終以三維可視化的方式展示給用戶。②發(fā)布分布式文件系統(tǒng)中的影像地圖為Geoserver地圖服務(wù),并加載顯示。③利用Ceisum調(diào)用OpenStreetMap的開源興趣點(POI)搜索庫,實現(xiàn)氣象站點的搜索定位功能。④利用AJAX技術(shù)調(diào)用Geoserver的Web 地圖要素服務(wù)(WFS)、Web地圖服務(wù)(WMS)、地理標(biāo)記語言服務(wù)(GML),可以獲取并發(fā)布通過云計算分析得到的矢量數(shù)據(jù)、元數(shù)據(jù)、圖例等信息,用于動態(tài)展示。⑤空間分析功能,在查詢輸入框內(nèi)輸入需求可以獲得最終的分析結(jié)果,并且疊加在三維地球上以圖形的形式展示。⑥利用Cesium實現(xiàn)常用的測量、標(biāo)繪等功能。⑦其他輔助性功能,如地圖縮放功能支持底圖顯示18個級別,點擊三維底圖上的矢量數(shù)據(jù)實體可以提取出該實體的所有氣象相關(guān)屬性信息并展示在右上角的小窗口中??梢暬缑嫒鐖D3所示。
圖3 氣象數(shù)據(jù)三維可視化界面Fig.3 3D visualization interface of meteorological data
Cesium三維可視化渲染代碼如下
function ShowAttribute(attribute) {
viewer.entities.removeAll();
var coordinate;
var attributeSizeArray=[];
for (var i=0; i < shp_data.length; i++) {
attributeSizeArray.push(shp_data[i].properties[attribute]);
}
var minattributeSize=attributeSizeArray.min();
var maxattributeSize=attributeSizeArray.max();
for ( var i=0; i < shp_data.length; i++) {
∥判斷該屬性如果是負數(shù),則改為正數(shù),并且渲染為柱狀圖
var size=((shp_data[i].properties[attribute]-minattributeSize)/(maxattributeSize-minattributeSize)) *100;
∥ alert(maxattributeSize);
if (shp_data[i].geometry.type == "Point") {
∥ alert(shp_data[i].geometry.type);
coordinate=shp_data[i].geometry.coordinates;
∥ alert(coordinate);
}
if (shp_data[i].geometry.type == "MultiPolygon") {
∥ alert(shp_data[i].geometry.type);
coordinate=shp_data[i].geometry.coordinates[0][0][0];
∥ alert(coordinate);
}
addentity(coordinate,size,shp_data[i].properties[attribute],shp_data[i].properties.NAME);
}
}
本文主要針對傳統(tǒng)WebGIS服務(wù)器與Hadoop集群環(huán)境下海量氣象數(shù)據(jù)的存儲與計算進行性能對比。選擇8臺服務(wù)器節(jié)點作為集群運行環(huán)境,節(jié)點CPU為i5處理器,頻率為2.7 GHz,內(nèi)存均為8 GB,硬盤容量為500 GB。試驗數(shù)據(jù)為1996—2016年云南省氣象信息,數(shù)據(jù)量約為4.6 GB。為了對比集群中節(jié)點個數(shù)對氣象數(shù)據(jù)存儲及管理的影響,使用4種方案配置節(jié)點,集群節(jié)點個數(shù)分別為單節(jié)點、2個節(jié)點、4個節(jié)點、8個節(jié)點,集群中部分節(jié)點啟動后的頁面如圖4所示。
圖4 集群運行頁面Fig.4 Cluster operation page
隨著節(jié)點數(shù)的變化,數(shù)據(jù)集中的氣溫最大值、最小值、平均值的計算消耗時間如圖5所示??梢钥闯?,集群隨著節(jié)點數(shù)的增加,計算性能增加,但是節(jié)點越多,數(shù)據(jù)傳輸通信時間成本越大,因此計算性能隨節(jié)點數(shù)的增大速率降低。
圖5 計算消耗時間與節(jié)點數(shù)的關(guān)系Fig.5 Relationship of calculating time with number of nodes
隨Map任務(wù)并行度變化的集群計算性能試驗結(jié)果如圖6所示,通過試驗發(fā)現(xiàn),每個節(jié)點的最優(yōu)并行度為13~15個Map任務(wù),每個Map任務(wù)的執(zhí)行時間至少1 min。如果每個作業(yè)的Map任務(wù)或者 Reduce任務(wù)的運行時間都只有30~40 s,那么就減少該作業(yè)的Map任務(wù)或者Reduce任務(wù)數(shù)量。因為調(diào)度器在調(diào)度任務(wù)時,中間過程可能要花費幾秒鐘,如果每個任務(wù)都非??炀团芡炅?,則會浪費太多中轉(zhuǎn)調(diào)度時間。
圖6 計算消耗時間與Map任務(wù)數(shù)的關(guān)系Fig.6 Relationship of calculating time with number of Map tasks
配置作業(yè)的Java虛擬機重用可以改善上述問題,Java虛擬機重用技術(shù)不是指同一作業(yè)的兩個或兩個以上的任務(wù)可以同時運行于同一Java虛擬機上,而是排隊按順序執(zhí)行。mapred.job.reuse.jvm.num.task,默認是1,表示一個Java虛擬機上最多可以順序執(zhí)行的任務(wù)數(shù)目是1,也就是說一個任務(wù)啟用一個Java虛擬機。在mapred-default.xml文件中配置塊容量,如果輸入的文件非常大,比如1TB,可以考慮將HDFS上的每個塊容量設(shè)大,比如設(shè)成256 MB或者512 MB。Reduce任務(wù)的并行度同樣影響整個作業(yè)的執(zhí)行并發(fā)度和執(zhí)行效率,但與Map任務(wù)的并發(fā)數(shù)由切片數(shù)決定不同,Reduce任務(wù)數(shù)量可以直接手動設(shè)置,默認值是1,可以手動設(shè)置為4,即job.setNumReduceTasks(4)。如果數(shù)據(jù)分布不均勻,就有可能在Reduce任務(wù)階段產(chǎn)生數(shù)據(jù)傾斜,因此要注意Reduce任務(wù)數(shù)量并不是任意設(shè)置,還要考慮業(yè)務(wù)邏輯需求,有些情況下,需要計算全局匯總結(jié)果,就只能有一個Reduce任務(wù)。
如圖7所示,集群隨著節(jié)點增加,存儲性能變高,最重要的是如果數(shù)據(jù)量超出了單節(jié)點服務(wù)器硬盤容量,則無法進行存儲,而集群多節(jié)點架構(gòu)可以解決這一問題。
圖7 存儲消耗時間與節(jié)點數(shù)的關(guān)系Fig.7 Relationship of storage time with number of nodes
農(nóng)業(yè)數(shù)據(jù)類型包括農(nóng)業(yè)生產(chǎn)數(shù)據(jù)、資源數(shù)據(jù)、技術(shù)數(shù)據(jù)、市場經(jīng)濟數(shù)據(jù)以及政策法規(guī)數(shù)據(jù)等,分為非結(jié)構(gòu)化數(shù)據(jù)和結(jié)構(gòu)化數(shù)據(jù)。在地理因素和季節(jié)等因素影響下,農(nóng)業(yè)數(shù)據(jù)表現(xiàn)出了特殊的數(shù)據(jù)離散性和實效性。隨著農(nóng)業(yè)信息化程度不斷提升,我國農(nóng)業(yè)現(xiàn)代化的步伐也隨之加快,轉(zhuǎn)型升級在逐步進行,農(nóng)業(yè)及其相關(guān)數(shù)據(jù)正在被大量收集、歸納、整理。隨著農(nóng)田中物聯(lián)網(wǎng)設(shè)備的大量布署,農(nóng)業(yè)數(shù)據(jù)源源不斷地產(chǎn)生,形成農(nóng)業(yè)大數(shù)據(jù)。該數(shù)據(jù)有以下特性:①數(shù)據(jù)量非常巨大,并且會連續(xù)產(chǎn)生。②因為作物生長在時間方面具有季節(jié)性,故農(nóng)業(yè)大數(shù)據(jù)必須具有時效性,需及時處理數(shù)據(jù)并且反饋結(jié)果。③農(nóng)業(yè)大數(shù)據(jù)的種類繁雜。④數(shù)據(jù)量巨大造成數(shù)據(jù)價值密度較低,但是價值量非常大。如果可以有效利用這些數(shù)據(jù),將會大大加快農(nóng)業(yè)信息化的進程。
利用氣象大數(shù)據(jù)分析昆明市種植適宜地,使用ID3決策樹分類方法對氣象大數(shù)據(jù)信息進行分析,決策樹分類是常用的分類挖掘模型,本次試驗在海量的AQI、PM2.5濃度、降水量、相對濕度、日照時數(shù)等大數(shù)據(jù)中挖掘、分析出具體種植適宜地,可以為農(nóng)業(yè)生產(chǎn)適宜區(qū)域的選擇提供決策支持。
ID3分類方法是以信息增益來評判屬性,選擇屬性分裂后信息屬性增益最大的進行分裂,采用貪心思想遍歷所有決策空間。使用云計算架構(gòu),分類計算步驟為:
(1)輸入樣本屬性集A,樣本類別集B,樣本訓(xùn)練集C。其中樣本訓(xùn)練集C如表2所示。
(2)創(chuàng)建樣本節(jié)點R,如果訓(xùn)練集C為空,則返回父節(jié)點中多數(shù)類標(biāo)記R;如果訓(xùn)練集C中樣本屬于同一類別B,則標(biāo)記類B的節(jié)點R為該葉子節(jié)點;如果A為空則返回C中的多數(shù)類標(biāo)記;如果計算得出了A中增益率最大的屬性為S,則用S標(biāo)記節(jié)點R。
(3)根據(jù)計算出的S的值{si|i=1,2,…,m}將訓(xùn)練集C分成{Ci|i=1,2,…,m}。
(4)遞歸執(zhí)行ID3TREE(R-S,B,C1), ID3TREE(R-S,B,C2),…,ID3TREE(R-S,B,Cn),直至最終計算結(jié)果中的元組屬于同一類,信息增益是原信息和新的需求信息的差,樣本集信息熵的計算公式為
(1)
式中I——信息熵
Pi——訓(xùn)練集C中任意元組屬于類Bi的概率輸入對應(yīng)的鍵值,通過文中的云計算架構(gòu),對上述數(shù)據(jù)集進行分類屬性的選擇,建立ID3決策樹,分別得出氣溫、天氣、降水量、相對濕度等信息的信息增益,依據(jù)上述計算流程進行集群分布式運算,前端對運算結(jié)果進行可視化展示,該應(yīng)用利用海量氣象信息精準(zhǔn)判斷某種植區(qū)域是否適宜種植作物。
表2 樣本訓(xùn)練集Tab.2 Agricultural data set
在實際農(nóng)業(yè)生產(chǎn)中,氣象災(zāi)害評估的實時性和準(zhǔn)確性面臨極大考驗,氣象災(zāi)害的發(fā)生會導(dǎo)致農(nóng)作物生長受到影響,產(chǎn)生巨大的經(jīng)濟損失。利用大數(shù)據(jù)分析則可以及時察覺即將到來的氣象災(zāi)害,對災(zāi)害進行分類和災(zāi)害等級評估,提前采取預(yù)防措施,減少經(jīng)濟損失。對此參考部分氣象災(zāi)害的等級指標(biāo),建立其災(zāi)害等級指標(biāo),利用本平臺大數(shù)據(jù)計算分析模塊處理海量農(nóng)業(yè)氣象數(shù)據(jù)集,得到可用于氣象災(zāi)害評估的信息。試驗以影響作物生長的低溫災(zāi)害指數(shù)為例,利用基于最近鄰法(KNN)組合分類器分布式計算模塊,將溫度數(shù)據(jù)代入低溫災(zāi)害指數(shù)公式中計算,將其轉(zhuǎn)換為低溫災(zāi)害指數(shù),其低溫災(zāi)害指數(shù)為
(2)
式中f——低溫災(zāi)害指數(shù)
t——當(dāng)前最小溫度,℃
u、σ——正態(tài)分布參數(shù)
最后利用分類后的低溫災(zāi)害風(fēng)險指數(shù)進行災(zāi)害等級預(yù)測以及作物受損程度評估。利用云南省1996—2016年低溫氣象數(shù)據(jù),通過計算得到昆明市的低溫災(zāi)害風(fēng)險指數(shù),建立低溫災(zāi)害評估等級,如表3所示,其中1級災(zāi)害作物受損較輕,還可正常生長,4級災(zāi)害時,作物生長停止或者死亡,此時會發(fā)出預(yù)警,農(nóng)戶則可及時做相應(yīng)預(yù)防措施減少損失。
表3 低溫災(zāi)害評估Tab.3 Low temperature disaster assessment
基于分布式氣象大數(shù)據(jù)分析的GIS平臺采用Hadoop體系架構(gòu),利用數(shù)據(jù)爬取技術(shù)在互聯(lián)網(wǎng)上獲取海量氣象數(shù)據(jù),并通過云存儲技術(shù)進行分布式存儲,解決了傳統(tǒng)單節(jié)點服務(wù)器WebGIS 系統(tǒng)硬件受限制的問題。在氣象大數(shù)據(jù)的分析計算方面,試驗結(jié)果表明,多節(jié)點集群下效率更高,在查詢遍歷性能方面也比傳統(tǒng)WebGIS單節(jié)點服務(wù)器高;通過對海量氣象數(shù)據(jù)采用云計算技術(shù)進行分析可以幫助有關(guān)部門進行決策;利用Cesium對計算得到的氣象信息進行三維可視化,可以直觀看到氣象站點歷史氣象參數(shù)的變化情況和計算決策結(jié)果,但是在具體分析功能擴展方面還需要完善。