蔡春花,黃思遠(yuǎn),高繼梅
(黃河交通學(xué)院,河南 焦作 454000)
在當(dāng)下為數(shù)不多的云存儲(chǔ)相關(guān)技術(shù)中,Hadoop的HDFS(Hadoop Distributed File System)文件系統(tǒng)是所有互聯(lián)網(wǎng)公司中使用最廣泛的分布式文件系統(tǒng)。HDFS是Google在2003 年提出的GFS(Google File System)的一個(gè)開(kāi)放源碼的實(shí)現(xiàn),不過(guò)在Google的設(shè)計(jì)中,為了降低數(shù)據(jù)存儲(chǔ)與數(shù)據(jù)管理的耦合,GFS僅對(duì)數(shù)據(jù)的存儲(chǔ)負(fù)責(zé)而不提供類(lèi)似數(shù)據(jù)庫(kù)查詢(xún)的方案。也就是說(shuō),GFS只存數(shù)據(jù),而對(duì)數(shù)據(jù)的具體內(nèi)容一無(wú)所知,自然也就不能提供基于內(nèi)容的檢索功能。所以,更進(jìn)一步,Google開(kāi)發(fā)了Bigtable作為數(shù)據(jù)庫(kù),向上層服務(wù)提供基于內(nèi)容的各種功能,而HBase是Bigtable的實(shí)現(xiàn)。與原始的存儲(chǔ)模式相比,云存儲(chǔ)具有訪問(wèn)方便、可靠性高、成本低、可擴(kuò)展性好等優(yōu)點(diǎn)。目前,云計(jì)算技術(shù)在中國(guó)的應(yīng)用已經(jīng)從幾年前僅在國(guó)家高端領(lǐng)域推廣到民用技術(shù)等領(lǐng)域,云存儲(chǔ)已成為未來(lái)存儲(chǔ)的趨勢(shì)。由于一些相關(guān)云存儲(chǔ)技術(shù)的開(kāi)源性質(zhì),云存儲(chǔ)的應(yīng)用領(lǐng)域變得越來(lái)越廣泛。云存儲(chǔ)所用的存儲(chǔ)結(jié)構(gòu)不同于傳統(tǒng)的網(wǎng)絡(luò)體系,隨著科技的發(fā)展,它將會(huì)取代傳統(tǒng)模式的存儲(chǔ)數(shù)據(jù)的方法。
在線學(xué)習(xí)行為的日志數(shù)據(jù)如學(xué)生登錄、瀏覽資源、點(diǎn)擊課件等操作產(chǎn)生的日志數(shù)據(jù)來(lái)源于在線學(xué)習(xí)平臺(tái),平臺(tái)上的日志數(shù)據(jù)將會(huì)依據(jù)不同的數(shù)據(jù)格式,分別存儲(chǔ)于與之對(duì)應(yīng)的數(shù)據(jù)庫(kù)中。首先,網(wǎng)站中每天都可能產(chǎn)生較多關(guān)于學(xué)習(xí)者觀看視頻、學(xué)習(xí)課程等的日志數(shù)據(jù);其次,學(xué)習(xí)平臺(tái)的數(shù)據(jù)需要進(jìn)行保留(至少保留一年時(shí)間),以供跨年數(shù)據(jù)的分析及對(duì)比;而HDFS在Hadoop技術(shù)體系中負(fù)責(zé)分布式存儲(chǔ)數(shù)據(jù),一個(gè)文件存儲(chǔ)在HDFS上時(shí)會(huì)被分成若干個(gè)數(shù)據(jù)塊,每個(gè)數(shù)據(jù)塊分別存儲(chǔ)在不同的服務(wù)器上,因此HDFS解決了存儲(chǔ)容量以及數(shù)據(jù)安全的問(wèn)題。
云存儲(chǔ)業(yè)務(wù)主要面向海量數(shù)據(jù)和文件的存儲(chǔ)和計(jì)算,強(qiáng)調(diào)單節(jié)點(diǎn)存儲(chǔ)容量和成本,因此配置相對(duì)廉價(jià)的串口硬盤(pán),滿(mǎn)足成本和容量的需求。
測(cè)試環(huán)境為了控制成本,采用虛擬化技術(shù)虛擬出三臺(tái)Linux服務(wù)器構(gòu)成集群,主機(jī)名分別設(shè)為Hadoop101、Hadoop102、Hadoop103,集群配置Hadoop101 CPU核心數(shù)4,磁盤(pán)空間50 GB,內(nèi)存大小8 GB;Hadoop102 CPU核心數(shù)2,磁盤(pán)空間50 GB,內(nèi)存大小4 GB;Hadoop103 CPU核心數(shù)2,磁盤(pán)空間50 GB,內(nèi)存大小4 GB。
集群服務(wù)規(guī)劃:Hadoop101部署的服務(wù)有NameNode、DataNode、QuorumPeerMain、HMaster、HRegionServer、SecondaryNameNode;Hadoop102部署的服務(wù)有DataNode、QuorumPeerMain、HRegionServer;Hadoop103部署的服務(wù)有DataNode、QuorumPeerMain、HRegionServer、SecondaryNameNode。
云存儲(chǔ)平臺(tái)是指Spring Boot應(yīng)用服務(wù)器,可以為用戶(hù)直接提供服務(wù),比如進(jìn)行文件的上傳或下載?;贖adoop的學(xué)習(xí)行為數(shù)據(jù)云存儲(chǔ)平臺(tái)用戶(hù)功能模塊主要包含用戶(hù)注冊(cè)登錄、文件操作、用戶(hù)關(guān)注和文件分享等。用戶(hù)功能模塊如圖1所示。
圖1 用戶(hù)功能模塊框架圖Fig.1 Framework diagram of the user function module
傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)是可以支持隨機(jī)訪問(wèn)的,但關(guān)系型數(shù)據(jù)庫(kù)卻不能很好地適用于存儲(chǔ)海量的數(shù)據(jù),比如關(guān)系型數(shù)據(jù)庫(kù)MySQL,單表在存放約500萬(wàn)條的數(shù)據(jù)時(shí),性能會(huì)大大降低。在這種情況下,必須有一種新的方案來(lái)解決海量數(shù)據(jù)存儲(chǔ)和隨機(jī)訪問(wèn)的問(wèn)題,HBase就是其中之一,HBase的單表可存儲(chǔ)百億級(jí)的數(shù)據(jù)且不影響查詢(xún)效率。
HBase的表結(jié)構(gòu)設(shè)計(jì)與關(guān)系型數(shù)據(jù)庫(kù)有很多不同,主要HBase有行鍵(Row Key)和列族(Column Family)、時(shí)間戳(Time Stamp)這幾個(gè)全新的概念,如何設(shè)計(jì)表結(jié)構(gòu)就非常重要。HBase就是通過(guò)Table、Row Key、Column Family、Time Stamp確定一行數(shù)據(jù)。這與MySQL、Oracle等關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(Relational Database Management System,RDBMS)完全不同。大數(shù)據(jù)云存儲(chǔ)平臺(tái)涉及的主要表有file表、id_user表、user_file表和share表等。
在設(shè)計(jì)HBase列族時(shí),使用文件的編號(hào)(Identity Document,ID)來(lái)作為每一個(gè)行鍵,使用file來(lái)當(dāng)列族,只設(shè)計(jì)一個(gè)列族,file中包含的各種字段都是該列族的列,使用Row Key和Column Family可以確定一個(gè)存儲(chǔ)單元(Cell),使用Time Stamp可以確定最新版本,如表1所示。
表1 文件表Tab.1 File table
(1)Hadoop集群的安裝及配置
假設(shè)已經(jīng)配置好服務(wù)器集群的靜態(tài)網(wǎng)址,并且Java開(kāi)發(fā)環(huán)境都配置正確,集群之間可以進(jìn)行免密登錄。下面對(duì)Apache Hadoop的具體實(shí)現(xiàn)步驟做簡(jiǎn)要闡述。
第一步,在Apache Hadoop的官方文檔中下載Apache Hadoop3.1.3的安裝包到hadoop101,并解壓到/opt/app/hadoop,再將Hadoop添加到環(huán)境變量中。
第二步,在HADOOP_HOME下的etc/hadoop中修改hadoop-env.sh配置文件,其中添加JAVA_HOME的路徑。
第三步,在HADOOP_HOME下的etc/hadoop中修改core-site.xml配置文件,添加NameNode的地址hadoop101:8020,并指定Hadoop數(shù)據(jù)的存儲(chǔ)目錄。
第四步,在HADOOP_HOME下的etc/hadoop中修改hdfs-site.xml配置文件,指定NameNode的網(wǎng)頁(yè)端訪問(wèn)地址為hadoop101:9870,指定SecondaryNameNode的WEB端訪問(wèn)地址為hadoop103:9868。
第五步,在HADOOP_HOME下的etc/hadoop/workers中添加節(jié)點(diǎn),共三行,分別是hadoop101、hadoop102、hadoop103。
第六步,分發(fā)Hadoop和環(huán)境變量配置文件到hadoop102、hadoop103。
至此,Hadoop集群的安裝及配置已經(jīng)完成,可以使用sbin/start-dfs.sh來(lái)啟動(dòng)HDFS集群,在瀏覽器訪問(wèn)hadoop101:9870,可以查看Hadoop集群的節(jié)點(diǎn)狀態(tài)。
(2)Zookeeper集群的安裝及配置
Zookeeper的作用在前文已經(jīng)介紹過(guò),這里是Zookeeper的集群安裝和安裝過(guò)后的配置過(guò)程。下面對(duì)Apache Zookeeper的具體實(shí)現(xiàn)步驟做簡(jiǎn)要闡述。
第一步,在Apache Zookeeper官方下載Apache Zookeeper3.5.7的安裝包,并上傳到hadoop101,解壓到/opt/app/zookeeper,再將Zookeeper添加到環(huán)境變量中。
第二步,將ZOOKEEPER_HOME/conf/下的zoo_sample.cfg文件重命名為zoo.cfg,并在其中添加Zookeeper的數(shù)據(jù)存儲(chǔ)路徑,存放在ZOOKEEPER_HOME/zkData,添加hadoop101、hadoop102、hadoop103的Zookeeper監(jiān)聽(tīng)地址。
第三步,在ZOOKEEPER_HOME下創(chuàng)建zkData文件夾,并在zkData文件夾下創(chuàng)建myid文件,并寫(xiě)入序號(hào)1。
第四步,分發(fā)Zookeeper到hadoop102、hadoop103,并修改myid文件為不同的ID序號(hào),在hadoop102中寫(xiě)入2,在hadoop103中寫(xiě)入3,保證ID序號(hào)不同即可。
至此,Zookeeper集群的安裝及配置已經(jīng)完成,可以使用bin/zkServer.sh start命令進(jìn)行Zookeeper服務(wù)的啟動(dòng),要注意的是需要在三臺(tái)服務(wù)器上都運(yùn)行該命令。啟動(dòng)完成后可以使用bin/zkServer.sh status查看Zookeeper是否啟動(dòng)成功。
(3) HBase集群的安裝及配置
下面對(duì)Apache HBase的具體實(shí)現(xiàn)步驟做簡(jiǎn)要闡述。
第一步,在Apache HBase官方下載Apache HBase2.0.5的安裝包,并上傳到hadoop101,解壓到/opt/app/hbase,再將HBase添加到環(huán)境變量中。
第二步,在HBASE_HOME/conf下的hbase-env.sh配置文件中將HBASE_MANAGES_ZK的屬性值設(shè)置為false,代表使用我們自己配置的Zookeeper集群而不是使用HBase自帶的Zookeeper。
第三步,在HBASE_HOME/conf下的hbase-site.xml中添加HBase的數(shù)據(jù)在HDFS存儲(chǔ)的位置,并指定HBase以分布式的方式工作,再指定使用自己的Zookeeper集群。
第四步,在HBASE_HOME/conf下的regionservers中添加三行記錄,分別為hadoop101、hadoop102、hadoop103,代表HBase節(jié)點(diǎn)。
第五步,分發(fā)HBase到hadoop102、hadoop103。
至此,HBase集群的安裝及配置已經(jīng)完成,可以使用bin/start-hbase.sh來(lái)啟動(dòng)HBase集群,并且可以使用瀏覽器訪問(wèn)hadoop101:16010查看HBase集群的狀態(tài)。
用戶(hù)進(jìn)行成功注冊(cè)驗(yàn)證后,使用正確的信息即可登錄到系統(tǒng)。在Controller層進(jìn)行用戶(hù)認(rèn)證后如果用戶(hù)信息沒(méi)問(wèn)題,那么即可放行用戶(hù)進(jìn)入平臺(tái),如果用戶(hù)信息不正確,會(huì)提示用戶(hù)。
其中文件分享部分關(guān)鍵代碼:
關(guān)注某用戶(hù)關(guān)鍵代碼:
在云存儲(chǔ)平臺(tái)HBase的所有表中,只有與文件file相關(guān)的表的數(shù)據(jù)會(huì)比較大,因此只需對(duì)file表進(jìn)行性能測(cè)試。下面對(duì)查詢(xún)性能測(cè)試步驟做簡(jiǎn)要概述。
第一步,模擬生成file表的1 個(gè)列族,10 列字段,目標(biāo)數(shù)據(jù)量1億多條。
第二步,使用Java客戶(hù)端連續(xù)根據(jù)Row Key查5 條記錄,將查詢(xún)耗時(shí)記錄下來(lái),得到表2。
表2 HBase查詢(xún)性能測(cè)試Tab.2 Tests of HBase query performance
通過(guò)表2可以看出,使用Row Key進(jìn)行查詢(xún)時(shí),初次查詢(xún)較慢,需要 8 秒左右的時(shí)間,但之后查詢(xún)很快,基本可以做到百毫秒級(jí)查詢(xún)。當(dāng)然,測(cè)試環(huán)境配置不高,如果在5 個(gè)節(jié)點(diǎn),16核CPU,128 GB內(nèi)存的配置下可以實(shí)現(xiàn)幾十毫秒甚至幾毫秒級(jí)查詢(xún)。這得益于HBase適合存儲(chǔ)PB級(jí)別的海量數(shù)據(jù)(百億千億量級(jí)條記錄),能在幾十到百毫秒內(nèi)返回?cái)?shù)據(jù),并且不會(huì)因?yàn)閿?shù)據(jù)量的劇增而導(dǎo)致查詢(xún)性能下降。
(1)寫(xiě)性能I/O測(cè)試
使用Hadoop自帶的基準(zhǔn)測(cè)試工具進(jìn)行HDFS寫(xiě)性能I/O測(cè)試,運(yùn)行如下命令hadoop jar/opt/app/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.3-tests.jar TestDFSIO-write-nrFiles 10-fileSize 128 MB,其中向HDFS寫(xiě)入10 個(gè)128 MB的文件,測(cè)試結(jié)果如圖2所示。
圖2 HDFS寫(xiě)性能測(cè)試圖Fig.2 Test plot of HDFS write performance
如圖2所示,向HDFS寫(xiě)入了10 個(gè)文件,一共處理1,280 MB的數(shù)據(jù),每秒的吞吐量為73.64 MB,平均I/O速率為91.73 Mb/s,執(zhí)行時(shí)間為20.63 s。
(2)讀性能I/O測(cè)試
接下來(lái)進(jìn)行HDFS讀性能測(cè)試,使用Hadoop自帶的基準(zhǔn)測(cè)試工具,運(yùn)行如下命令hadoop jar/opt/app/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-clientjobclient-3.1.3-tests.jar TestDFSIO-read-nrFiles 10-fileSize128 MB,其中讀取HDFS的10 個(gè)128 MB的文件,測(cè)試結(jié)果如圖3所示。
圖3 HDFS讀性能測(cè)試圖Fig.3 Test plot of HDFS read performanc
如圖3所示,向HDFS讀取了10 個(gè)文件,一共處理1,280 MB的數(shù)據(jù),每秒的吞吐量為147.13 MB,平均I/O速率為348.56 Mb/s,執(zhí)行時(shí)間為19.48 s。
本論文重點(diǎn)研究以Hadoop和HBase集群實(shí)現(xiàn)的大數(shù)據(jù)云存儲(chǔ)平臺(tái),成功實(shí)現(xiàn)了一個(gè)自動(dòng)化、高效率的大數(shù)據(jù)云存儲(chǔ)平臺(tái)。各部分的功能都能實(shí)現(xiàn)后,搭建合適的環(huán)境進(jìn)行功能的測(cè)試,通過(guò)測(cè)試結(jié)果可見(jiàn)各模塊的功能需求可以滿(mǎn)足使用條件,可用性很高。
在平臺(tái)高峰時(shí)請(qǐng)求量非常大,如果不進(jìn)行“流量削峰”,服務(wù)器可能因無(wú)法承受而宕機(jī),因此接下來(lái)可使用Kafka來(lái)進(jìn)行“流量削峰”。在存儲(chǔ)成本方面,盡管存儲(chǔ)設(shè)備都是低廉設(shè)備,但是由于備份機(jī)制,存儲(chǔ)成本也需要進(jìn)一步控制。因此在接下來(lái)的平臺(tái)版本升級(jí)中,會(huì)使用壓縮技術(shù)對(duì)文件進(jìn)行壓縮,并且對(duì)不同用戶(hù)的相同文件進(jìn)行“文件指紋技術(shù)”,對(duì)于重復(fù)文件只保留一份。