劉兆豐



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