解騰剛,馬毓杰
(西京學院信息工程學院,西安710123)
隨著互聯網產業的飛速發展以及大數據技術的廣泛應用,目前已有許多網盤類似百度網盤、華為網盤等均采用大數據技術實現了用戶日常的數據上傳、存儲、下載等功能。但是在網盤內提供在線數據分析功能的網盤少之又少,使得用戶想要從大量的數據中獲取到有用的信息以及從數據中發現規律變得較為困難,數據的潛在價值難以被挖掘出來。
目前國內外比較常見的分布式文件系統有Google的GFS、Apache 的HDFS、SUN 的Lustre、MongoDB 的GridFS、IBM 的GPFS、淘 寶 的TFS 和 國 人 開 發 的FastDFS 等,各個分布式文件系統適用于不同的領域,其中HDFS 是Google GFS 的開源實現,通過網絡實現文件在多臺機器上的分布式存儲,HDFS 提供了在廉價服務器集群中進行大規模分布式文件存儲的能力,具有很好的容錯性和擴展性,可以以較低的成本利用現有機器實現大流量和大數據量的讀寫,較好地滿足了大規模數據存儲的需求[1]。
本文提出了基于Hadoop 的數據云盤設計與實現方法,使用者可以將其數據上傳存儲至該云盤中,并且可以隨時從云盤中下載數據,保證了數據存儲的安全性,又極大提高了數據的應用效率[2]。同時云盤中的數據分析功能可以幫助用戶分析數據的規律,讓數據的潛在價值被挖掘出來,為使用者帶來極大的價值和便利。
本云盤系統按功能可分為兩大模塊——用戶模塊和文件管理模塊。其中,用戶模塊包含兩個功能實現:用戶注冊和用戶登錄;文件管理模塊包含五個功能實現:查看文件、上傳文件、下載文件、刪除文件和數據分析。本系統的功能模塊圖如圖1 所示。

圖1 系統功能模塊圖
本云盤系統由最初的登錄界面開始,用戶需要判斷是否擁有賬戶,如果沒有即跳轉到注冊界面進行注冊,如果有則進行登錄操作。在注冊界面中用戶需輸入用戶名和密碼,在檢查用戶名是否重復、輸入兩次密碼是否相同后判斷是否注冊成功,成功即進入登錄界面,否則重復注冊操作。在登錄界面中,用戶需輸入用戶名和密碼,判斷是否登錄成功后進行下一步操作,成功則進入主界面,否則重新登錄。在主界面中,用戶可進行文件管理操作(查看文件、上傳文件、下載文件、刪除文件、數據分析),在操作結束后退出云盤即為結束使用。本系統的系統流程圖如圖2 所示。

圖2 系統運行流程圖
本系統采用全分布式Hadoop 集群作為運行平臺,使用HDFS 分布式文件系統作為底層存儲,系統分為前臺和后臺兩部分,前臺采用JSP 編寫界面,后臺使用MySQL、HDFS Java API、MapReduce、AJAX 等實現云盤用戶注冊功能、用戶登錄功能,用戶在云盤主界面中對文件實現查看、上傳、下載、刪除以及數據分析功能。
在本云盤注冊界面中主要完成用戶注冊操作。用戶在進入注冊界面中可以完成如下功能:①要求輸入需要注冊的用戶名。②要求輸入兩次密碼,且輸入的兩次密碼的長度和內容相同,否則需要重新注冊。③注冊成功后跳轉至登錄界面。④用戶注冊成功會同時在HDFS 文件系統下創建名為該用戶的目錄。
在用戶擁有賬號之后,進入登錄界面進行登錄云盤操作。登錄界面可以實現如下功能:①可以判斷用戶是否擁有賬號,如果沒有可以跳轉至注冊界面。②輸入用戶名和密碼。③判斷用戶名和密碼是否正確,如果不正確則重新登錄。④登錄成功后跳轉至云盤主界面。
(1)查看文件
用戶登錄成功后,系統的主界面會顯示該用戶的文件列表,實現過程是,系統提取到當前登錄用戶的用戶名,以此用戶名創建Path 對象,傳入此Path 對象并調用FileSystem 的getFileStatus()方法,得到一個FileStatus 對象,FileStatus 對象封裝了文件系統中文件和目錄的元數據,包括文件的長度、塊大小、備份數、修改時間、所有者以及權限等信息[3]。最后,格式化File Status 對象傳到前端頁面展示。關鍵代碼如下:public FileStatus[]ls(String folder)throws IOException{
Path path=new Path(folder);//根據當前登錄用戶名創建Path 對象
FileSystem fs = FileSystem.get(URI.create(hdfsPath),conf);//獲取FileSystem 實例
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)上傳文件
用戶點擊“選擇文件”按鈕后,在彈窗中選擇需要上傳的文件,點擊“上傳文件”按鈕即完成上傳操作。實現過程是,調用FileSystem 的copyFromLocalFile 方法,該方法需要傳入兩個參數,分別是本地文件的路徑和所需上傳到HDFS 文件系統的目標路徑。關鍵代碼如下:
public void copyFile(String local,String remote)throws IOException{
FileSystem fs = FileSystem.get(URI.create(hdfsPath),conf);//獲取FileSystem 實例fs.copyFromLocalFile(new Path(local),new Path(remote));//調用copyFromLocalFile 方法實現上傳
System.out.println("copy from:"+local+"to"+remote);
fs.close();
}
(3)下載文件
用戶在主界面選擇需要下載的文件,單擊文件后的“下載”字樣,向服務器提出下載請求,服務器找到該文件即將文件下載到本地默認目錄中。實現過程是,調用FileSystem 的copyToLocalFile 方法,該方法需要傳入兩個參數,分別是HDFS 文件系統中的該文件的路徑和所需下載到本地的目標路徑。關鍵代碼如下:
public void download(String remote,String local)throws IOException{
Path path=new Path(remote);
FileSystem fs = FileSystem.get(URI.create(hdfsPath),conf);//獲取FileSystem 實例
fs.copyToLocalFile(path,new Path(local));//調 用copy-FromLocalFile 方法實現文件下載
System.out.println("download:from"+remote+"to"+local);
fs.close();
}
(4)刪除文件
用戶在主界面選擇需要刪除的文件,單擊文件后的“刪除”字樣,系統會將此文件從HDFS 文件系統中該用戶的目錄下刪除。實現過程是,調用FileSystem的deleteOnExit 方法,該方法需要傳入的參數為所需刪除文件的路徑。關鍵代碼如下:
public void rmr(String folder)throws IOException{
Path path=new Path(folder);
FileSystem fs = FileSystem.get(URI.create(hdfsPath),conf);//獲 取FileSystem 實 例fs.deleteOnExit(path);//調 用deleteOnExit 方法實現文件刪除
fs.close();
}
(5)數據分析
用戶在主界面選擇待分析文件,單擊“分析”字樣,系統會提交該文件到MapReduce 程序,分析完成后會彈窗提示用戶查看分析結果,用戶點擊確認后,將分析結果用Echarts 進行可視化呈現。數據分析功能是通過MapReduce 技術實現的,根據系統需求編寫Map 階段和Reduce 階段的相關代碼即可,使用JSON 數據格式和AJAX 等技術實現分析結果的可視化。以流量統計為例,根據用戶流量數據文件,統計出每個用戶的上行總流量、下行總流量以及總流量。在流量統計案例中,Map 階段由map task 讀文件,通過TextInputFormat一次讀一行,返回(key,value),其中key 代表用戶手機號碼,value 代表對應手機號碼的流量信息;Shuffle 階段是從Map 結束到Reduce 開始之間的過程,Shuffle 階段完成了數據的分區、分組、排序的工作[4];Reduce 階段將與一個key 關聯的一組中間數值進行歸約,即對同一手機號的流量數據進行歸約。關鍵代碼如下:
protected void map(LongWritable key,Text line,Context context)throws IOException,InterruptedException{
String lineStr=line.toString();//返回字符串
String[]values=lineStr.split(" ");//以空格進行切割并存入數組
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);//創建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);
}
該系統注冊界面的運行效果如圖3 所示。

圖3 系統注冊界面運行效果圖
該系統登錄界面的運行效果如圖4 所示。

圖4 系統登錄界面運行效果圖
該系統主界面的運行效果如圖5 所示。顯示當前登錄用戶網盤內的文件信息,包括文件名、文件類型、文件大小和相應的操作,單擊文件名后的“刪除”、“下載”字樣,即可將對應文件進行刪除和下載。

圖5 系統主界面運行效果圖
點擊“選擇文件”按鈕,系統會彈出選擇文件的窗口,用戶選擇需要上傳的文件,點擊“上傳文件”按鈕,即可將文件上傳至云盤。上傳文件效果如圖6 所示。

圖6 上傳文件效果圖
單擊文件名后的“分析”字樣,系統會提交該文件到MapReduce 程序,分析完成后會彈窗提示用戶查看分析結果,用戶點擊確認后,分析結果會進行可視化呈現,以流量統計為例,可視化運行效果如圖7 所示。

圖7 分析結果可視化運行效果圖
本文提出了基于Hadoop 的數據云盤的設計與實現詳細過程,為使用者提供了數據存儲以及數據分析的功能,在一定程度上為使用者帶來了極大的價值和便利,同時又將數據的潛在價值挖掘出來,具有一定的實際意義。隨著大數據技術的不斷發展,云存儲必然會被廣泛應用,云盤系統相比于傳統的存儲方式優勢也會更加明顯,也將會是未來主流的存儲方式。