劉兆豐
摘要:在社會(huì)的發(fā)展過程中,天氣對(duì)社會(huì)中的很多行業(yè)都有一定的影響。在當(dāng)前階段,天氣預(yù)報(bào)作為全球主要對(duì)天氣進(jìn)行預(yù)測(cè)的手段,在這種情況下,全球的氣候行業(yè)也產(chǎn)生了大量的數(shù)據(jù)(PB級(jí)別),并且數(shù)據(jù)每年還在持續(xù)的增長(zhǎng)。為了解決使用傳統(tǒng)的關(guān)系型數(shù)據(jù)庫很難存儲(chǔ)與分析的問題,需要采用大數(shù)據(jù)的相關(guān)技術(shù)對(duì)氣候數(shù)據(jù)進(jìn)行分析。
本設(shè)計(jì)采用MapReduce生態(tài)圈的一系列的工具,通過使用虛擬機(jī)的平臺(tái),采用爬蟲軟件進(jìn)行數(shù)據(jù)爬取的方式,用Map階段和Reduce階段的數(shù)據(jù)分析,分布式系統(tǒng)的數(shù)據(jù)存儲(chǔ)的方法,實(shí)現(xiàn)氣象數(shù)據(jù)的采集分析,并且將其展現(xiàn)出來的方式展示。使用這系列流程的系統(tǒng)可以輔助有關(guān)部門或企業(yè)進(jìn)行決策部署。
關(guān)鍵詞:MapReduce;氣候數(shù)據(jù);大數(shù)據(jù);計(jì)算機(jī)
中圖分類號(hào):P41文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1672-9129(2020)03-0047-03
Abstract:Intheprocessofsocialdevelopment,weatherhasacertainimpactonmanyindustriesinthesociety.Atthecurrentstage,weatherforecastingisthemainglobalweatherforecastingtool,andinthiscontext,theglobalclimateindustryalsoproducesalargeamountofdata(petabytes),andthedatacontinuestogroweveryyear.Inordertosolvetheproblemthatusingtraditionalrelationaldatabaseisdifficulttostoreandanalyze,itisnecessarytousebigdata-relatedtechnologiestoanalyzeclimatedata.
ThisdesignadoptsaseriesoftoolsofMapReduceecosystem.Throughtheuseofvirtualmachineplatform,crawlersoftwareisadoptedfordatacrawling,dataanalysisinMapstageandReducestage,anddatastorageindistributedsystem,meteorologicaldatacollectionandanalysisarerealizedanddisplayed.Systemsthatusethisseriesofprocessescanassistdepartmentsororganizationsintheirdecisionmakinganddeployment.
Keywords:MapReduce;Climaticdata;Bigdata;Thecomputer
1數(shù)據(jù)采集
1.1在線API數(shù)據(jù)獲取。此模塊的實(shí)現(xiàn)分為兩大部分:在線API數(shù)據(jù)獲取與數(shù)據(jù)分析。這里通過在特定網(wǎng)站提取天氣數(shù)據(jù):
StringbaiduUrl="http://api.map.baidu.com/telematics/v3/weather?";
publicstaticvoidmain(String[]args)throwsIOException{
URLurl=newURL(baiduUrl);
URLConnectionconn=url.openConnection();
while(reader.readLine()!=null){
StringBufferstr=newStringBuffer();
str.append(url+"");
這里此設(shè)計(jì)將使用百度天氣作為提取的天氣數(shù)據(jù)的來源。通過鏈接的方式,天氣網(wǎng)頁url轉(zhuǎn)變成字符流,通過粘貼的方式將所獲取的數(shù)據(jù)寫入進(jìn)stringBuffer中。
1.2數(shù)據(jù)處理。
經(jīng)過第一步需要處理的數(shù)據(jù),稱之為元數(shù)據(jù)。因此將會(huì)有一些無用的部分。將所需數(shù)據(jù)進(jìn)行提取,而此方法提取的數(shù)據(jù)為JSON格式,通過使用下面的方法獲得信息。
1.3JSON格式介紹:
JSON:一種與開發(fā)語言無關(guān)的輕量級(jí)數(shù)據(jù)存儲(chǔ)格式。全名是JavaScriptObjectNotation,它是數(shù)據(jù)格式的標(biāo)準(zhǔn)規(guī)范,最初是從JavaScript語言派生的,該語言具有用于JSON處理的API,Json由對(duì)象,數(shù)組,字符串組成。
1.4代碼程序?qū)崿F(xiàn)。
初始化百度天氣url,Stringuri=showURI(k)。提取其中的cell屬性。Cellcell=
value.getColumnLatestCell(Bytes.toBytes("page"),Bytes.toBytes("i"))。
通過一個(gè)數(shù)組配對(duì)其中的鍵值對(duì):
Arrays.copyOfRange(cell.getValueArray(),
cell.getValueOffset(),
cell.getValueArray().length);
Stringflag=Bytes.toString(b);
1.5這里使用writable接口格式做大數(shù)據(jù)數(shù)據(jù)類型改寫,writable接口簡(jiǎn)介;
Writable接口,是根據(jù)DataInput和DataOutput實(shí)現(xiàn)的簡(jiǎn)單、有效的序列化對(duì)象。MR的任意Key和Value必須實(shí)現(xiàn)Writable接口.簡(jiǎn)單來說要實(shí)現(xiàn)MapReduce的序列化,所需要的數(shù)據(jù)必須有一定的格式,因此需要通過改變數(shù)據(jù)的鍵值對(duì)來實(shí)現(xiàn)此接口方便我們接下來轉(zhuǎn)換數(shù)據(jù)。
2集群搭建
在這里選擇3.0.3的hadoop。此處使用linux命令
(1)解壓文件到/opt下
sudotar-zxvfjdk-8u91-linux-x64.tar.gz-C/opt
sudotar-xvfhadoop-3.0.3.tar-C/opt
(2)建立軟連接
cd/opt
sudoln-shadoop-3.0.3hadoop
sudoln-sjdk1.8.0_91jdk
(3)設(shè)置環(huán)境變量
cd進(jìn)入目錄
sudovi~/.profile或者sudovi~/.bashrc
(4)進(jìn)入hadoop的安裝目錄配置文件中
cd/opt/hadoop/etc/hadoop
假設(shè)沒有找到core-site.xml,找到core-site.xml.template
sudocpcore-siter.xml.templatecore-site.xml
修改core-site.xml
sudovicore-site.xml
內(nèi)容如下:
(5)修改mapred-site.xml使用sudovimapred-site.xml命令進(jìn)入此xml文件之中。
(6)確認(rèn)YARN集群的模式,如圖1.1所示:
(7)MapReduce的具體內(nèi)容實(shí)現(xiàn)地址,如圖1.2所示:
(8)MapReduce內(nèi)map函數(shù)的具體內(nèi)容實(shí)現(xiàn)地址,如圖1.3所示:
(9)MapReduce內(nèi)reduce函數(shù)的具體內(nèi)容實(shí)現(xiàn)的地址,如圖1.4所示:
(10)修改yarn-site.xml
修改YARN集群IP地址,如圖1.5所示:
3集群設(shè)置
3.1集群權(quán)限
(1)hdfs目錄下的所屬子目錄所屬用戶hdfs,所屬組hadoop及其子文件也設(shè)置
sudochown-Rhdfshdfs;sudochgrp-Rhadoophdfs;設(shè)置權(quán)限保證創(chuàng)建文件時(shí)系統(tǒng)不會(huì)組織,linux的系統(tǒng)由于其特殊的權(quán)限特性保證了其安全性。
(2)yarn的所屬組hadoop及其子文件
sudochown-Ryarnyarn;sudochgrp-Rhadoopyarn;同理yarn集群也需要相同的操作。
(3)進(jìn)入/data目錄,給hadoop目錄及所有子目錄或文件賦予權(quán)限777sudochmod777-Rhadoop,這里在創(chuàng)建文件夾帶有最高權(quán)限可以方便查詢?nèi)罩炯皠?chuàng)建文件夾。
(4)建立yarn和hdfs執(zhí)行所用到的目錄sudomkdir/data;這里是數(shù)據(jù)落地的地方。
(5)在data目錄下建立hadoop文件sudomkdirhadoop子目錄用來分批量存儲(chǔ)數(shù)據(jù)
(6)在hadoop中建立hdfs和yarn文件夾sudomkdirhdfsyarn;這里是最終落地的目錄。
(7)在hdfs文件下建立的dn,nn,snn文件夾sudomkdirdnnnsnn;三個(gè)文件夾存儲(chǔ)不同種類的數(shù)據(jù)。
(8)在yarn下建立logs,nm文件夾sudomkdirlogsnm;這里存儲(chǔ)日志文件和日志采集。
3.2配置一鍵啟動(dòng)功能
一鍵啟動(dòng)是在主節(jié)點(diǎn)一個(gè)命令啟動(dòng)HDFS和YARN集群。
(1)主節(jié)點(diǎn)安裝ssh服務(wù)。
(2)解決無密碼登陸的問題在主節(jié)點(diǎn)之中生成銘文和密文,的兩個(gè)屬性需要在hdfs用戶下和yarn用戶下各執(zhí)行一次。
ssh-keygen-trsa-P''-f~/.ssh/id_rsa
(3)將銘文拷貝到從節(jié)點(diǎn)的需要無密碼登陸的機(jī)器上去。
使用命令:ssh-copy-id-i:192.168.43.204
3.3驗(yàn)證無密碼登錄
(1)使用命令:ssh-copy-id-ilocalhost,ssh192.168.43.204。
(2)Hbase的安裝與配置
①重命名目錄文件夾
②配置Hbase的環(huán)境變量
這里更改path和添加HbaseHome作為Hbase的路徑和程序地址。
(3)修改配置文件hbase-env.sh。
4修改配置
(1)在這里修改hbase.Rootdirhbase的根目錄需要在這里被固定下來。
(2)修改hbase.Unsafe.stream.capability.enforce這里安全空間是否需要被開啟,選擇不開啟,可以充分利用內(nèi)存。
(3)修改cluster的權(quán)限:這里選擇分組確認(rèn),選項(xiàng)設(shè)置為true。改變分組可以提高zookeeper的數(shù)據(jù)采集能力。
(4)修改quorum的屬性,這里設(shè)置為單個(gè)端口。
(5)修改分區(qū)端口號(hào)的屬性,這里用作備份,冗余數(shù)據(jù)可以通過此端口被查詢到,這里設(shè)置為16030。
(6)設(shè)置主節(jié)點(diǎn)的日志級(jí)別info的端口號(hào),這里設(shè)置為16010。
(7)開啟文件保護(hù)系統(tǒng)在hbase.wal.provider中選擇filesystem。
在出現(xiàn)未知故障的時(shí)候,比如突然斷電的時(shí)候選擇此項(xiàng)可以開啟zookeeper保護(hù)模式,保護(hù)已經(jīng)采集到的日志。
(8)啟動(dòng)hbase,通過jps命令可以查詢到兩個(gè)已經(jīng)開啟的命令。主節(jié)點(diǎn)可以查詢到HMaster,從節(jié)點(diǎn)可以查詢到HRegionServer。
5MapReduce的編寫
5.1map的模塊編寫
首先將天氣的年份,溫度,濕度,風(fēng)力等值作為權(quán)重放入到mapper之中。在這里元數(shù)據(jù)的鍵值要改變?yōu)樾枨笄覍?duì)應(yīng)的鍵值對(duì)。使用substring方法可以將固定權(quán)重提取。最后將提取出的數(shù)據(jù)通過一定的順序拼接在一起。代碼實(shí)現(xiàn)如下:
staticclassTMextendsMapper
@Override
protectedvoidmap(LongWritablekey,Textvalue,Contextcontext)throwsIOException,InterruptedException
以上是創(chuàng)建一個(gè)map函數(shù)用來將已經(jīng)提取好的json格式的數(shù)據(jù)做成二次篩查,放入到mapper里面進(jìn)行操作。
Stringtemp=value.toString();
Strings1=temp.substring(0,15);//城市天氣
Stringyear=temp.substring(15,19);//年份
Stringtem=temp.substring(87,92);//溫度
Stringval=temp.substring(92,93);//【01459】
在這里將所要的數(shù)據(jù)通過權(quán)重比較的方式,分批進(jìn)入mapper中。
if(!"+9999".equals(tem)&&"01459".contains(val))
context.write(newText("城市編號(hào):"+s1+"年份:"+year),newText(temp));
在這里拼接數(shù)據(jù),變成城市編號(hào)加年份的方式,分批處理好元數(shù)據(jù)。
5.2使用reduce方式進(jìn)行操作
創(chuàng)建reduce程序,使用writable接口和迭代器進(jìn)行操作
staticclassTRextendsReducer
@Override
protectedvoidreduce(Textkey,Iterable
第一步將年份的數(shù)據(jù)放到reduce之中
Texttext=key;//年份
使用treemap方法采集數(shù)據(jù)
Map
將所得數(shù)據(jù)中“:”的部分后面分割出來提取
String[]year_tem=values.toString().split(":");
下面的邏輯是通過ifelse循環(huán)分別拿出編號(hào)為0和1的不同年份的天氣
if(year_tem.length>0&&year_tem!=null){
if(yt.containsKey(year_tem[0])){
if(yt.get(year_tem[0]) yt.put(year_tem[0],Integer.parseInt(year_tem[1]));} } else{yt.put(year_tem[0],Integer.parseInt(year_tem[1]));} } 同理將上述的程序中[]數(shù)組中的序號(hào)更改之后就可以得到剩下所需不同元素的天氣的值,此處代碼相近,省略展示。 5.3構(gòu)建job作業(yè)提交 (1)job提交簡(jiǎn)介,job的工作就是和集群建立連接,創(chuàng)建一個(gè)yarnRunner的對(duì)象調(diào)用job.Submit的方法提交,然后確定job的狀態(tài)和這個(gè)對(duì)象通信。所以總體來說,構(gòu)建job就是作為連接通道的橋梁。 (2)job提交代碼實(shí)現(xiàn),每一個(gè)提交的類都有其共同的方法,這里每當(dāng)提交之后可以將job的方法拷貝到每一個(gè)mapper和reducer中去。這里將拷貝到input和output中以便使用。重點(diǎn)的是,這里需要重寫其中的run方法并且構(gòu)建作業(yè)的時(shí)候要重命名class文件,下面是代碼說明。構(gòu)建一個(gè)conf方法的采集器,這里將input和output首先構(gòu)建出對(duì)象。 (3)在job提交中,此設(shè)計(jì)使用了getInstance,setJarByClass,setJobName,setNumReduceTasks四個(gè)方法作為前置提交,這四個(gè)方法分別提交數(shù)據(jù)屬性,具體的類,數(shù)據(jù)具體的名稱還有此數(shù)據(jù)在整個(gè)hbase中行鍵的序號(hào)。最后一個(gè)屬性是用來方便定義這個(gè)值。 (4)第二個(gè)階段,這里的mapper和reducer方法需要連同第一階段的已提交的數(shù)據(jù)的類一起進(jìn)行第二步的提交。在這里需要用到setMapperClass以及他一系列的衍生方法。用來將mapper的鍵值對(duì)傳遞到reducer的鍵值對(duì)之中去。之后,reuducer的鍵值對(duì)會(huì)進(jìn)行再一次傳輸?shù)娜蝿?wù)。 最后生成的reducer程序會(huì)使用輸入流生成文件,這里會(huì)設(shè)定input和output輸入輸出的路徑,將生成的文件傳輸?shù)竭@個(gè)路徑中去。在這里可能會(huì)有等待的問題出現(xiàn),在這里由于提前開啟了線程,因此將等待改為false,關(guān)閉即可。 5.4基于年份進(jìn)行分組排序 上一步將job提交的文件已經(jīng)寫入到指定路徑中,之后將已寫入的文件進(jìn)行分組排序,這里分組排序的方法是使用compareto方法。篩選條件可以使用之前已有的條件。包括但不限于風(fēng)力,天氣等元素進(jìn)行分組排序。代碼展示如下: intn=this.year-o.getYear(); returnn; if(n!=0)returnn; returnthis.stationid.compareTo(o.getStationid()); 5.5檢測(cè)獲取的溫度是否合理。 (1)當(dāng)分組排序之后,有一些問可能會(huì)超過正常溫度的閾值,上述的一些環(huán)節(jié)雖然有經(jīng)過一些列的篩查,但是只用到單獨(dú)的某個(gè)條件進(jìn)行歸類,而在數(shù)據(jù)可靠性上不能得到保證,因此需要使用特定函數(shù)方法檢測(cè)溫度合理性。在這里使用ifelse循環(huán)做一個(gè)篩查。這里定義一個(gè)對(duì)象isValiadTemperture意為溫度是否合理。 (2)權(quán)重值說明: (15,19)年份 (87,92)檢查到的溫度,如果為+9999則表示沒有檢測(cè)到溫度 (92,93)溫度數(shù)據(jù)質(zhì)量,為【01459】表示該溫度是合理溫度 (3)代碼如下: publicvoidparser(Stringstr){ if(str.length()<93){isValiadTemperture=false;return;} this.stationid=str.substring(0,15); this.year=Integer.parseInt(str.substring(15,19)); if(str.charAt(87)=='+'){ this.temp=Integer.parseInt(str.substring(88,92)); }else{ this.temp=Integer.parseInt(str.substring(87,92)); } Stringquality=str.substring(92,93); if(temp!=MISS&&quality.matches("[01459]")){ this.isValiadTemperture=true; }else{ this.isValiadTemperture=false; } (4)將溫度寫入HDFS系統(tǒng)中進(jìn)入數(shù)據(jù)庫。 Hdfs高吞吐量的特性可以幫助數(shù)據(jù)快速進(jìn)入到到數(shù)據(jù)庫之中作為實(shí)時(shí)存儲(chǔ),通過上一章寫的定時(shí)分析模塊,可以做到一段時(shí)間內(nèi)獲取所需要的數(shù)據(jù),做到精準(zhǔn)分析。而數(shù)據(jù)庫的操作命令相對(duì)簡(jiǎn)單,也可以很好的實(shí)現(xiàn)增刪改查的功能,實(shí)時(shí)數(shù)據(jù)分析,完成天氣系統(tǒng)的設(shè)計(jì)。 參考文獻(xiàn): [1]唐果星.淺析氣候大數(shù)據(jù)在行業(yè)中的發(fā)展趨勢(shì)[J].電腦知識(shí)與技術(shù),2019,15(10):262-263. [2]胡欣濱.基于大數(shù)據(jù)環(huán)境下的氣候數(shù)據(jù)分析[J].科技創(chuàng)新導(dǎo)報(bào),2013(12).79-79. [3]劉喆玥.我國氣候大數(shù)據(jù)的發(fā)展趨勢(shì)研究[J].電腦知識(shí)與技術(shù),2019,34(21). [4]楊巨龍.大數(shù)據(jù)技術(shù)全解:基礎(chǔ)、設(shè)計(jì)、開發(fā)與實(shí)踐[J].中國信息化,2014,000(006):71-71. [5]李天目,韓進(jìn).云計(jì)算技術(shù)架構(gòu)與實(shí)踐[M].北京:清華大學(xué)出版社,2014. [6]周品.Hadoop云計(jì)算實(shí)戰(zhàn)[M].北京:清華大學(xué)出版社,2012. [7]陳強(qiáng).精通JAVA開發(fā)技術(shù):由淺入深領(lǐng)會(huì)高效開發(fā)之道[M].北京:清華大學(xué)出版社,2013. [8]劉志成.Java程序設(shè)計(jì)案例教程[M].北京:清華大學(xué)出版社,2006. [9]王鵬.云計(jì)算與大數(shù)據(jù)技術(shù)[M].北京:人民郵電出版社,2014.