金琦
編者按:八年前,聯(lián)合國在發(fā)布的《大數(shù)據(jù)促發(fā)展:挑戰(zhàn)與機(jī)遇》白皮書中指出:“大數(shù)據(jù)時(shí)代已經(jīng)到來,大數(shù)據(jù)的出現(xiàn)將會(huì)對社會(huì)各個(gè)領(lǐng)域產(chǎn)生深刻影響?!彪S著云計(jì)算、物聯(lián)網(wǎng)、移動(dòng)互聯(lián)、人工智能等信息技術(shù)的高速發(fā)展,2020年全球數(shù)據(jù)總量已經(jīng)超過40ZB,大數(shù)據(jù)技術(shù)的確已經(jīng)滲透到我們生活的各個(gè)方面,大數(shù)據(jù)正在實(shí)現(xiàn)人類工作、生活與思維的大變革,其“威力”也強(qiáng)烈地沖擊著教育系統(tǒng),正在成為推動(dòng)教育系統(tǒng)創(chuàng)新與變革的顛覆性力量。接下來的兩期我們就針對大數(shù)據(jù)這一話題從理論和實(shí)際操作兩個(gè)方面展開研討。
大數(shù)據(jù)具有大容量(Volume)、多形式(Variety)、高速率(Velocity)、低價(jià)值密度(Value)的4V特征。大容量指數(shù)據(jù)的體量非常巨大,傳統(tǒng)處理數(shù)據(jù)的集中存儲(chǔ)、集中計(jì)算的方式已經(jīng)很難處理這么大的數(shù)據(jù)量。多形式是指數(shù)據(jù)呈現(xiàn)的方式多種多樣,包括常見的文本形式以及圖片、視頻等。高速率是指數(shù)據(jù)以非常高的速率產(chǎn)生,如各種傳感器、實(shí)時(shí)直播、監(jiān)控及大量的物聯(lián)網(wǎng)應(yīng)用的數(shù)據(jù)。低價(jià)值密度是指單條數(shù)據(jù)并不具有太多價(jià)值,但是通過處理一條條數(shù)據(jù)就能從大量低價(jià)值數(shù)據(jù)中獲取高價(jià)值的信息。顯然,具有以上特征的數(shù)據(jù)流都需要復(fù)雜的數(shù)據(jù)處理系統(tǒng)來處理,為此谷歌在2003—2006年陸續(xù)發(fā)表了主題為GFS(Google File System)、MapReduce、BigTable的三篇技術(shù)論文,正是這三篇論文奠定了當(dāng)下大數(shù)據(jù)算法的基石,成為大數(shù)據(jù)發(fā)展最重要的推動(dòng)因素。
● Hadoop架構(gòu)概述
如果你在百度查詢“大數(shù)據(jù)”,會(huì)發(fā)現(xiàn)“大數(shù)據(jù)”和“Hadoop”會(huì)成對出現(xiàn),乃至很多人認(rèn)為大數(shù)據(jù)就是Hadoop,這里特別要指出,大數(shù)據(jù)代表的是一種理念、一種問題解決思路、一系列處理方式的集合。大數(shù)據(jù)也并不特指Hadoop,Hadoop由Apache公司開發(fā),是應(yīng)用Google的上述論文的核心技術(shù),采用Java語言進(jìn)行的開源實(shí)現(xiàn)。它以分布式文件系統(tǒng)HDFS(Hadoop Distributed FileSystem)和MapReduce計(jì)算框架為核心,支持海量結(jié)構(gòu)化、半結(jié)構(gòu)化、非結(jié)構(gòu)化數(shù)據(jù)的存儲(chǔ)處理,以及一些支持Hadoop的其他子項(xiàng)目的通用工具組成的分布式計(jì)算生態(tài)系統(tǒng)。下頁圖1描述了目前使用最廣的Hadoop 2.0生態(tài)系統(tǒng)的構(gòu)成,其中包含Hadoop的核心組件和常用工具。
初學(xué)者一看到圖中這么多名詞,可能就云里霧里了,我們先撥開這些名詞上的浮云,結(jié)合谷歌三篇論文主題,詳細(xì)敘述與之相關(guān)的三個(gè)主要組件:HDFS、MapReduce、HBase。
● Hadoop主要組件
1.HDFS分布式文件系統(tǒng)
我們知道大數(shù)據(jù)文件是不斷產(chǎn)生的,所以存儲(chǔ)空間占用非常大,因此,我們就需要將數(shù)據(jù)分散存儲(chǔ)在多臺(tái)獨(dú)立的設(shè)備上。傳統(tǒng)的網(wǎng)絡(luò)存儲(chǔ)系統(tǒng)采用集中的存儲(chǔ)服務(wù)器存放所有數(shù)據(jù),存儲(chǔ)服務(wù)器成為系統(tǒng)性能的瓶頸,也是可靠性和安全性的焦點(diǎn),不能滿足大規(guī)模存儲(chǔ)應(yīng)用的需要。分布式網(wǎng)絡(luò)存儲(chǔ)系統(tǒng)采用可擴(kuò)展的系統(tǒng)結(jié)構(gòu),利用多臺(tái)存儲(chǔ)服務(wù)器分擔(dān)存儲(chǔ)負(fù)荷,利用位置服務(wù)器定位存儲(chǔ)信息,不但提高了系統(tǒng)的可靠性、可用性和存取效率,還易于擴(kuò)展。谷歌論文Google File System(GFS)對“大數(shù)據(jù)文件怎么存放的問題”進(jìn)行了詳細(xì)闡述,而Apache Hadoop的HDFS就是對這篇論文的開源實(shí)現(xiàn)。DFS是Hadoop項(xiàng)目的核心子項(xiàng)目,是分布式計(jì)算中數(shù)據(jù)存儲(chǔ)管理的基礎(chǔ),是基于流式數(shù)據(jù)訪問和存儲(chǔ)管理超大文件的需求而開發(fā)的分布式文件系統(tǒng)。其中“流式數(shù)據(jù)訪問”是指讀取數(shù)據(jù)文件就像打開水閥門一樣,可以不停地去讀取,因?yàn)镠DFS上存儲(chǔ)的數(shù)據(jù)集通常是由數(shù)據(jù)源生成或者從數(shù)據(jù)源收集而來,并會(huì)長時(shí)間在此數(shù)據(jù)集上進(jìn)行各種分析,所以HDFS相對數(shù)據(jù)的訪問時(shí)間更重視數(shù)據(jù)的吞吐量?!按鎯?chǔ)管理超大文件”更是HDFS的職責(zé)所在,現(xiàn)在很多學(xué)校的服務(wù)器網(wǎng)絡(luò)日志、物聯(lián)網(wǎng)傳感器群日志都是不間斷記錄,隨著未來技術(shù)水平的發(fā)展,其數(shù)據(jù)文件大小可以達(dá)到TB、PB級別。HDFS可以部署在廉價(jià)的服務(wù)器集群上,滿足海量數(shù)據(jù)集的應(yīng)用程序。HDFS具有很好的擴(kuò)展性,能夠根據(jù)學(xué)校實(shí)際應(yīng)用需要隨時(shí)添加廉價(jià)服務(wù)器設(shè)備節(jié)點(diǎn)。HDFS是典型的主從架構(gòu),具有很好的容錯(cuò)性,由一個(gè)主節(jié)點(diǎn)(NameNode)、多個(gè)從節(jié)點(diǎn)(Datanode)組成。主節(jié)點(diǎn)用于管理系統(tǒng)命名空間(NameSpace)、調(diào)度客戶端(client)文件操作及存儲(chǔ)任務(wù)管理,多個(gè)從節(jié)點(diǎn)提供真實(shí)文件數(shù)據(jù)的物理支持??蛻舳送ㄟ^主節(jié)點(diǎn)Namenode從多個(gè)Datanode數(shù)據(jù)節(jié)點(diǎn)中獲取數(shù)據(jù)塊(Block),Datanode數(shù)據(jù)節(jié)點(diǎn)則自發(fā)提交獲取到的文件的Namenode信息,用于存儲(chǔ)文件的基本信息。Namenode對Datanode的write、read等操作一律通過元數(shù)據(jù)信息實(shí)現(xiàn)查找。為防止Namenode數(shù)據(jù)缺失、無效,HDFS提供了Namenode的備份節(jié)點(diǎn)即SecondaryNameNode,類似于Namenode的克隆,以備不時(shí)之需。數(shù)據(jù)以數(shù)據(jù)塊的形式進(jìn)行存儲(chǔ),每個(gè)數(shù)據(jù)塊可以在多個(gè)Datanode上存儲(chǔ)多個(gè)副本,當(dāng)單個(gè)節(jié)點(diǎn)出現(xiàn)問題時(shí),相對應(yīng)的副本數(shù)據(jù)能替換問題節(jié)點(diǎn)數(shù)據(jù),以提高數(shù)據(jù)安全性。HDFS能保證各個(gè)節(jié)點(diǎn)的數(shù)據(jù)存儲(chǔ),并在各節(jié)點(diǎn)之間實(shí)現(xiàn)高速傳輸,HDFS客戶端與NameNode和Datanode通信過程如下頁圖2所示,我們可以從中體驗(yàn)到HDFS的高效性和安全性。
2.MapReduce分布式計(jì)算框架
講完用HDFS分布式存儲(chǔ)數(shù)據(jù),接下來我們就來描述如何用分布式來計(jì)算這些數(shù)據(jù),谷歌論文MapReduce:Simplifified Data Processing on Large Clusters對“大數(shù)據(jù)怎么計(jì)算”進(jìn)行了詳細(xì)闡述,而Hadoop的MapReduce就是對這篇論文的開源實(shí)現(xiàn)。MapReduce是一種編程模型,應(yīng)用在海量數(shù)據(jù)的并行計(jì)算中。MapReduce采用分化治理的方法,其中有一個(gè)主節(jié)點(diǎn)用于任務(wù)的管理,各個(gè)分節(jié)點(diǎn)根據(jù)主節(jié)點(diǎn)的任務(wù)分配進(jìn)行節(jié)點(diǎn)運(yùn)算,各個(gè)分節(jié)點(diǎn)再把運(yùn)算的結(jié)果匯總給主節(jié)點(diǎn),因此,MapReduce可認(rèn)為是任務(wù)的分解與匯總,也就是分為Map(映射)和Reduce(化簡)兩步。經(jīng)過Map和Reduce的處理,最后輸出匯總結(jié)果。MapReduce是一種編程模型,主要包括Mapper和Reducer兩個(gè)抽象類,是一個(gè)基于開源的并行計(jì)算框架。Mapper用于將切分為塊的原始數(shù)據(jù)進(jìn)行處理;Reducer用于匯總歸約Mapper處理結(jié)果,并輸出終值。MapReduce計(jì)算框架中Mapper可以處理
3.HBase分布式存儲(chǔ)系統(tǒng)
谷歌論文Bigtable對“大數(shù)據(jù)文件怎樣適應(yīng)快速查詢”進(jìn)行了詳細(xì)闡述。而HBase正是對Bigtable的開源實(shí)現(xiàn),它非常適合存儲(chǔ)大數(shù)據(jù)環(huán)境下不斷產(chǎn)生的非結(jié)構(gòu)化的數(shù)據(jù)(不方便用數(shù)據(jù)庫二維邏輯表來表示的數(shù)據(jù),如圖片、視頻)和半結(jié)構(gòu)化的數(shù)據(jù)(結(jié)構(gòu)和內(nèi)容合在一起的數(shù)據(jù),如學(xué)校上網(wǎng)日志、一卡通數(shù)據(jù)),是面向列的分布式數(shù)據(jù)庫,這一點(diǎn)完全不同于其他基于行的關(guān)系數(shù)據(jù)庫。它依賴于HDFS和ZooKeeper(一個(gè)用來進(jìn)行分布式協(xié)調(diào)的服務(wù),這些服務(wù)包括配置服務(wù)、維護(hù)元信息和命名空間服務(wù))。HBase將所有數(shù)據(jù)以文件的形式進(jìn)行存儲(chǔ),文件采用二進(jìn)制編碼非常適合快速檢索,同時(shí)支持MapReduce的批量式計(jì)算和點(diǎn)查詢(隨機(jī)讀取),具有高性能、高可靠性、高可伸縮性和實(shí)時(shí)讀寫的特點(diǎn)。
HBase提供了Java API的訪問接口,基于這些API接口,可以開發(fā)實(shí)現(xiàn)上網(wǎng)日志和一卡通數(shù)據(jù)的高速查詢和讀寫模塊。用數(shù)據(jù)讀寫查詢模塊,將這些非結(jié)構(gòu)化數(shù)據(jù)存入HBase數(shù)據(jù)庫中,通過該模塊還可以實(shí)現(xiàn)快速查詢功能。
非結(jié)構(gòu)化存儲(chǔ)系統(tǒng)需要通過ZooKeeper來實(shí)現(xiàn)HBase中數(shù)據(jù)讀寫與HbaseMaster之間的協(xié)調(diào)服務(wù)。在HBase數(shù)據(jù)庫的底層是分布式文件系統(tǒng)HDFS,通過ZooKeeper來保證各個(gè)DataNode節(jié)點(diǎn)之間的協(xié)同工作,以確保結(jié)果的正確無誤。當(dāng)一個(gè)數(shù)據(jù)表傳入后都要通過行鍵按照一定的范圍分割成多個(gè)子表,并為每個(gè)子表的列族創(chuàng)建一個(gè)Store實(shí)例。這些非結(jié)構(gòu)化數(shù)據(jù)首先寫入Store的MemStore中,當(dāng)MemStore存滿后會(huì)Flush成一個(gè)StoreFile,一個(gè)Store中可以包含0到多個(gè)StoreFile,每個(gè)StoreFile中都有一個(gè)HFile負(fù)責(zé)存放實(shí)際文件。當(dāng)StoreFile的大小達(dá)到一定閾值后,會(huì)自動(dòng)觸發(fā)合并操作,多個(gè)StoreFile會(huì)合并成為一個(gè)StoreFile,同時(shí)發(fā)生版本合并和數(shù)據(jù)刪除。StoreFile達(dá)到一定大小后觸發(fā)Split操作,當(dāng)前的Region(分布式存儲(chǔ)的最小單元)會(huì)Split成為兩個(gè)Region,之前的Region下線,HMaster會(huì)把新生成的兩個(gè)Region分配到相應(yīng)的HRegionServer中去。每個(gè)HRegionServer中都會(huì)有一個(gè)HLog對象,HLog通過WAL(Write Ahead Log,預(yù)寫式日志)機(jī)制對寫入MemStore中的數(shù)據(jù)進(jìn)行鏡像備份,每次用戶操作寫入Memstore的同時(shí),也會(huì)寫一份數(shù)據(jù)到HLog文件,HLog文件定期會(huì)滾動(dòng)出新,并刪除舊的文件。當(dāng)HRegionServer意外終止后,HMaster就會(huì)利用HLog中的鏡像文件在其他HRegionServer節(jié)點(diǎn)上進(jìn)行數(shù)據(jù)恢復(fù),保證整個(gè)HBase集群的正常工作,提高系統(tǒng)的可靠性。非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)系統(tǒng)簡要架構(gòu)示意如圖4所示。
● 體驗(yàn)一個(gè)Hadoop作業(yè)處理過程
前面講了Hadoop系統(tǒng)的主要概念,對于初學(xué)的讀者可能還是很難把握內(nèi)在聯(lián)系是什么,畢竟安裝一個(gè)大數(shù)據(jù)實(shí)驗(yàn)環(huán)境是一個(gè)耗時(shí)費(fèi)力的過程,中間會(huì)遇到各種莫名其妙的錯(cuò)誤,為此讀者可到ftp://bigdata.ourschool.cn(賬戶:bigdata.密碼:hadoop)下載一個(gè)已經(jīng)搭建好Hadoop(版本號2.7.1)集群所有測試環(huán)境的虛擬機(jī)模板文件(bigdata.ovf),直接導(dǎo)入虛擬機(jī)軟件就可以體驗(yàn)了,這樣在單臺(tái)模擬Hadoop集群環(huán)境進(jìn)行演練后,再到多臺(tái)虛擬機(jī)或者真實(shí)的物理機(jī)環(huán)境運(yùn)維系統(tǒng)和處理數(shù)據(jù),效率就會(huì)提高很多,具體操作和測試過程如下:
①安裝虛擬機(jī)軟件,常見的VMWare、VirtualBox虛擬機(jī)軟件都可以支持,以VMWare為例,打開VMWare,打開文件,選擇第一步下載的ovf模板,然后導(dǎo)入安裝即可(如上頁圖5)。
②我們在Linux客戶端啟動(dòng)Hadoop,進(jìn)入Hadoop安裝目錄,運(yùn)行start-all.sh腳本,這樣啟動(dòng)了一組Namenode、Datanode多個(gè)節(jié)點(diǎn)的Hadoop集群環(huán)境,我們就可以開始體驗(yàn)了(如圖6)。
③Linux客戶端創(chuàng)建用echo命令創(chuàng)建一個(gè)測試數(shù)據(jù)文件example.txt,如圖7所示(當(dāng)然你也可以去網(wǎng)上下載或者爬取一些大型數(shù)據(jù)用來測試)。
④然后通過Hadoop HDFS Shell操作命令Hadoop dfs-put 把example.txt文件傳送到HDFS上并創(chuàng)建一個(gè)input文件??捎肏adoop dfs -ls/命令查看hdfs系統(tǒng)上新創(chuàng)建的input文件。
⑤測試Hadoop基本功能,我們用Hadoop自帶的Hadoop-mapreduce-examples-2.7.1.jar(不同版本Hadoop自帶范例jar版本號也不同)中的wordcount程序測試統(tǒng)計(jì)單詞的個(gè)數(shù),先來體驗(yàn)一下Hadoop到底是怎么運(yùn)行的,運(yùn)行程序執(zhí)行如下命令:“hadoop jar/usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar? wordcount/input/output.”用Hadoop自帶的一個(gè)jar包中的wordcount程序,統(tǒng)計(jì)HDFS上的input數(shù)據(jù)文件的各個(gè)單詞出現(xiàn)的次數(shù),并將結(jié)果輸出output目錄。運(yùn)行上述指令后,還可以看到mapreduce的計(jì)算進(jìn)度,map和reduce的進(jìn)度為100%表示運(yùn)行處理結(jié)束(如圖8)。
⑥程序運(yùn)行完以后,執(zhí)行hdfs dfs-cat/output/*,看一下一個(gè)大數(shù)據(jù)計(jì)算范例(單詞統(tǒng)計(jì))的結(jié)果,如圖9所示。
通過對以上Hadoop作業(yè)處理過程的操作,我們對大數(shù)據(jù)處理框架的基本工作原理有了一定的體驗(yàn),雖然目前絕大多數(shù)Hadoop集群上仍舊運(yùn)行MapReduce和Pig/Hive模型相關(guān)代碼,但是MapReduce也有其局限性,并不是處理海量數(shù)據(jù)的普適方法。接下來還會(huì)被其他處理框架取代(如基于內(nèi)存的開源計(jì)算框架Spark),各種框架都在不斷改進(jìn),優(yōu)化框架的性能是數(shù)據(jù)處理框架改進(jìn)的一個(gè)重點(diǎn)方向,未來的大數(shù)據(jù)世界將會(huì)是多種技術(shù)和平臺(tái)共存的世界。相關(guān)內(nèi)容我們下期再探討,敬請期待!