解騰剛,馬毓杰
(西京學(xué)院信息工程學(xué)院,西安710123)
隨著互聯(lián)網(wǎng)產(chǎn)業(yè)的飛速發(fā)展以及大數(shù)據(jù)技術(shù)的廣泛應(yīng)用,目前已有許多網(wǎng)盤類似百度網(wǎng)盤、華為網(wǎng)盤等均采用大數(shù)據(jù)技術(shù)實(shí)現(xiàn)了用戶日常的數(shù)據(jù)上傳、存儲、下載等功能。但是在網(wǎng)盤內(nèi)提供在線數(shù)據(jù)分析功能的網(wǎng)盤少之又少,使得用戶想要從大量的數(shù)據(jù)中獲取到有用的信息以及從數(shù)據(jù)中發(fā)現(xiàn)規(guī)律變得較為困難,數(shù)據(jù)的潛在價(jià)值難以被挖掘出來。
目前國內(nèi)外比較常見的分布式文件系統(tǒng)有Google的GFS、Apache 的HDFS、SUN 的Lustre、MongoDB 的GridFS、IBM 的GPFS、淘 寶 的TFS 和 國 人 開 發(fā) 的FastDFS 等,各個(gè)分布式文件系統(tǒng)適用于不同的領(lǐng)域,其中HDFS 是Google GFS 的開源實(shí)現(xiàn),通過網(wǎng)絡(luò)實(shí)現(xiàn)文件在多臺機(jī)器上的分布式存儲,HDFS 提供了在廉價(jià)服務(wù)器集群中進(jìn)行大規(guī)模分布式文件存儲的能力,具有很好的容錯(cuò)性和擴(kuò)展性,可以以較低的成本利用現(xiàn)有機(jī)器實(shí)現(xiàn)大流量和大數(shù)據(jù)量的讀寫,較好地滿足了大規(guī)模數(shù)據(jù)存儲的需求[1]。
本文提出了基于Hadoop 的數(shù)據(jù)云盤設(shè)計(jì)與實(shí)現(xiàn)方法,使用者可以將其數(shù)據(jù)上傳存儲至該云盤中,并且可以隨時(shí)從云盤中下載數(shù)據(jù),保證了數(shù)據(jù)存儲的安全性,又極大提高了數(shù)據(jù)的應(yīng)用效率[2]。同時(shí)云盤中的數(shù)據(jù)分析功能可以幫助用戶分析數(shù)據(jù)的規(guī)律,讓數(shù)據(jù)的潛在價(jià)值被挖掘出來,為使用者帶來極大的價(jià)值和便利。
本云盤系統(tǒng)按功能可分為兩大模塊——用戶模塊和文件管理模塊。其中,用戶模塊包含兩個(gè)功能實(shí)現(xiàn):用戶注冊和用戶登錄;文件管理模塊包含五個(gè)功能實(shí)現(xiàn):查看文件、上傳文件、下載文件、刪除文件和數(shù)據(jù)分析。本系統(tǒng)的功能模塊圖如圖1 所示。
圖1 系統(tǒng)功能模塊圖
本云盤系統(tǒng)由最初的登錄界面開始,用戶需要判斷是否擁有賬戶,如果沒有即跳轉(zhuǎn)到注冊界面進(jìn)行注冊,如果有則進(jìn)行登錄操作。在注冊界面中用戶需輸入用戶名和密碼,在檢查用戶名是否重復(fù)、輸入兩次密碼是否相同后判斷是否注冊成功,成功即進(jìn)入登錄界面,否則重復(fù)注冊操作。在登錄界面中,用戶需輸入用戶名和密碼,判斷是否登錄成功后進(jìn)行下一步操作,成功則進(jìn)入主界面,否則重新登錄。在主界面中,用戶可進(jìn)行文件管理操作(查看文件、上傳文件、下載文件、刪除文件、數(shù)據(jù)分析),在操作結(jié)束后退出云盤即為結(jié)束使用。本系統(tǒng)的系統(tǒng)流程圖如圖2 所示。
圖2 系統(tǒng)運(yùn)行流程圖
本系統(tǒng)采用全分布式Hadoop 集群作為運(yùn)行平臺,使用HDFS 分布式文件系統(tǒng)作為底層存儲,系統(tǒng)分為前臺和后臺兩部分,前臺采用JSP 編寫界面,后臺使用MySQL、HDFS Java API、MapReduce、AJAX 等實(shí)現(xiàn)云盤用戶注冊功能、用戶登錄功能,用戶在云盤主界面中對文件實(shí)現(xiàn)查看、上傳、下載、刪除以及數(shù)據(jù)分析功能。
在本云盤注冊界面中主要完成用戶注冊操作。用戶在進(jìn)入注冊界面中可以完成如下功能:①要求輸入需要注冊的用戶名。②要求輸入兩次密碼,且輸入的兩次密碼的長度和內(nèi)容相同,否則需要重新注冊。③注冊成功后跳轉(zhuǎn)至登錄界面。④用戶注冊成功會同時(shí)在HDFS 文件系統(tǒng)下創(chuàng)建名為該用戶的目錄。
在用戶擁有賬號之后,進(jìn)入登錄界面進(jìn)行登錄云盤操作。登錄界面可以實(shí)現(xiàn)如下功能:①可以判斷用戶是否擁有賬號,如果沒有可以跳轉(zhuǎn)至注冊界面。②輸入用戶名和密碼。③判斷用戶名和密碼是否正確,如果不正確則重新登錄。④登錄成功后跳轉(zhuǎn)至云盤主界面。
(1)查看文件
用戶登錄成功后,系統(tǒng)的主界面會顯示該用戶的文件列表,實(shí)現(xiàn)過程是,系統(tǒng)提取到當(dāng)前登錄用戶的用戶名,以此用戶名創(chuàng)建Path 對象,傳入此Path 對象并調(diào)用FileSystem 的getFileStatus()方法,得到一個(gè)FileStatus 對象,F(xiàn)ileStatus 對象封裝了文件系統(tǒng)中文件和目錄的元數(shù)據(jù),包括文件的長度、塊大小、備份數(shù)、修改時(shí)間、所有者以及權(quán)限等信息[3]。最后,格式化File Status 對象傳到前端頁面展示。關(guān)鍵代碼如下:public FileStatus[]ls(String folder)throws IOException{
Path path=new Path(folder);//根據(jù)當(dāng)前登錄用戶名創(chuàng)建Path 對象
FileSystem fs = FileSystem.get(URI.create(hdfsPath),conf);//獲取FileSystem 實(shí)例
FileStatus[]list=fs.listStatus(path);
if(list!=null)
for(FileStatus f:list){
System.out.printf("%s,folder:%s,大小:%dK ",f.getPath().getName(),(f.isDir()?"目錄":"文件"),f.getLen()/1024);
}
fs.close();
return list;
}
(2)上傳文件
用戶點(diǎn)擊“選擇文件”按鈕后,在彈窗中選擇需要上傳的文件,點(diǎn)擊“上傳文件”按鈕即完成上傳操作。實(shí)現(xiàn)過程是,調(diào)用FileSystem 的copyFromLocalFile 方法,該方法需要傳入兩個(gè)參數(shù),分別是本地文件的路徑和所需上傳到HDFS 文件系統(tǒng)的目標(biāo)路徑。關(guān)鍵代碼如下:
public void copyFile(String local,String remote)throws IOException{
FileSystem fs = FileSystem.get(URI.create(hdfsPath),conf);//獲取FileSystem 實(shí)例fs.copyFromLocalFile(new Path(local),new Path(remote));//調(diào)用copyFromLocalFile 方法實(shí)現(xiàn)上傳
System.out.println("copy from:"+local+"to"+remote);
fs.close();
}
(3)下載文件
用戶在主界面選擇需要下載的文件,單擊文件后的“下載”字樣,向服務(wù)器提出下載請求,服務(wù)器找到該文件即將文件下載到本地默認(rèn)目錄中。實(shí)現(xiàn)過程是,調(diào)用FileSystem 的copyToLocalFile 方法,該方法需要傳入兩個(gè)參數(shù),分別是HDFS 文件系統(tǒng)中的該文件的路徑和所需下載到本地的目標(biāo)路徑。關(guān)鍵代碼如下:
public void download(String remote,String local)throws IOException{
Path path=new Path(remote);
FileSystem fs = FileSystem.get(URI.create(hdfsPath),conf);//獲取FileSystem 實(shí)例
fs.copyToLocalFile(path,new Path(local));//調(diào) 用copy-FromLocalFile 方法實(shí)現(xiàn)文件下載
System.out.println("download:from"+remote+"to"+local);
fs.close();
}
(4)刪除文件
用戶在主界面選擇需要?jiǎng)h除的文件,單擊文件后的“刪除”字樣,系統(tǒng)會將此文件從HDFS 文件系統(tǒng)中該用戶的目錄下刪除。實(shí)現(xiàn)過程是,調(diào)用FileSystem的deleteOnExit 方法,該方法需要傳入的參數(shù)為所需刪除文件的路徑。關(guān)鍵代碼如下:
public void rmr(String folder)throws IOException{
Path path=new Path(folder);
FileSystem fs = FileSystem.get(URI.create(hdfsPath),conf);//獲 取FileSystem 實(shí) 例fs.deleteOnExit(path);//調(diào) 用deleteOnExit 方法實(shí)現(xiàn)文件刪除
fs.close();
}
(5)數(shù)據(jù)分析
用戶在主界面選擇待分析文件,單擊“分析”字樣,系統(tǒng)會提交該文件到MapReduce 程序,分析完成后會彈窗提示用戶查看分析結(jié)果,用戶點(diǎn)擊確認(rèn)后,將分析結(jié)果用Echarts 進(jìn)行可視化呈現(xiàn)。數(shù)據(jù)分析功能是通過MapReduce 技術(shù)實(shí)現(xiàn)的,根據(jù)系統(tǒng)需求編寫Map 階段和Reduce 階段的相關(guān)代碼即可,使用JSON 數(shù)據(jù)格式和AJAX 等技術(shù)實(shí)現(xiàn)分析結(jié)果的可視化。以流量統(tǒng)計(jì)為例,根據(jù)用戶流量數(shù)據(jù)文件,統(tǒng)計(jì)出每個(gè)用戶的上行總流量、下行總流量以及總流量。在流量統(tǒng)計(jì)案例中,Map 階段由map task 讀文件,通過TextInputFormat一次讀一行,返回(key,value),其中key 代表用戶手機(jī)號碼,value 代表對應(yīng)手機(jī)號碼的流量信息;Shuffle 階段是從Map 結(jié)束到Reduce 開始之間的過程,Shuffle 階段完成了數(shù)據(jù)的分區(qū)、分組、排序的工作[4];Reduce 階段將與一個(gè)key 關(guān)聯(lián)的一組中間數(shù)值進(jìn)行歸約,即對同一手機(jī)號的流量數(shù)據(jù)進(jìn)行歸約。關(guān)鍵代碼如下:
protected void map(LongWritable key,Text line,Context context)throws IOException,InterruptedException{
String lineStr=line.toString();//返回字符串
String[]values=lineStr.split(" ");//以空格進(jìn)行切割并存入數(shù)組
String upStr=values[values.length-3];
String downStr=values[values.length-2];
int up=Integer.parseInt(upStr);
int down=Integer.parseInt(downStr);
FlowBean flow=new FlowBean(up,down,0);//創(chuàng)建Flow-Bean 對象
context.write(new Text(values[1]),flow);}
protected void reduce(Text key,Iterable<FlowBean>flows,Context context)
throws IOException,InterruptedException{
int totalUp=0;//上行流量
int totalDown=0;//下行流量
for(FlowBean flow:flows){
totalUp+=flow.getUpFlow();
totalDown+=flow.getDownFlow();
}
int totalUpAndDown=totalUp+totalDown;//總流量
FlowBean flow=new FlowBean(totalUp,totalDown,totalUpAndDown);
context.write(key,flow);
}
該系統(tǒng)注冊界面的運(yùn)行效果如圖3 所示。
圖3 系統(tǒng)注冊界面運(yùn)行效果圖
該系統(tǒng)登錄界面的運(yùn)行效果如圖4 所示。
圖4 系統(tǒng)登錄界面運(yùn)行效果圖
該系統(tǒng)主界面的運(yùn)行效果如圖5 所示。顯示當(dāng)前登錄用戶網(wǎng)盤內(nèi)的文件信息,包括文件名、文件類型、文件大小和相應(yīng)的操作,單擊文件名后的“刪除”、“下載”字樣,即可將對應(yīng)文件進(jìn)行刪除和下載。
圖5 系統(tǒng)主界面運(yùn)行效果圖
點(diǎn)擊“選擇文件”按鈕,系統(tǒng)會彈出選擇文件的窗口,用戶選擇需要上傳的文件,點(diǎn)擊“上傳文件”按鈕,即可將文件上傳至云盤。上傳文件效果如圖6 所示。
圖6 上傳文件效果圖
單擊文件名后的“分析”字樣,系統(tǒng)會提交該文件到MapReduce 程序,分析完成后會彈窗提示用戶查看分析結(jié)果,用戶點(diǎn)擊確認(rèn)后,分析結(jié)果會進(jìn)行可視化呈現(xiàn),以流量統(tǒng)計(jì)為例,可視化運(yùn)行效果如圖7 所示。
圖7 分析結(jié)果可視化運(yùn)行效果圖
本文提出了基于Hadoop 的數(shù)據(jù)云盤的設(shè)計(jì)與實(shí)現(xiàn)詳細(xì)過程,為使用者提供了數(shù)據(jù)存儲以及數(shù)據(jù)分析的功能,在一定程度上為使用者帶來了極大的價(jià)值和便利,同時(shí)又將數(shù)據(jù)的潛在價(jià)值挖掘出來,具有一定的實(shí)際意義。隨著大數(shù)據(jù)技術(shù)的不斷發(fā)展,云存儲必然會被廣泛應(yīng)用,云盤系統(tǒng)相比于傳統(tǒng)的存儲方式優(yōu)勢也會更加明顯,也將會是未來主流的存儲方式。