金琦



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