張國華,葉 苗,王自然,周婷婷
(南京師范大學(xué)泰州學(xué)院信息工程學(xué)院,江蘇泰州 225300)
Hadoop[1]是一個軟件框架模型,主要用于以高效和可擴展的方式對大數(shù)據(jù)進行分布式信息處理,具有可靠性高、容錯能力強、搭建成本低、跨平臺等特點。它在處理半結(jié)構(gòu)化,非結(jié)構(gòu)化的數(shù)據(jù)方面優(yōu)勢明顯,目前得到了廣泛應(yīng)用,社會對于這方面的技術(shù)人才需求量巨大,因其概念繁多,原理復(fù)雜,掌握其核心技術(shù)的人才較少。為將Hadoop生態(tài)系統(tǒng)理順,本文從整體框架(見圖1)分析,在整個生態(tài)系統(tǒng)中最為核心的兩個技術(shù),一個是HDFS[2]實現(xiàn)的基礎(chǔ)數(shù)據(jù)的分布式存儲,它利用集群存儲數(shù)據(jù)的能力,擴展了計算機的存儲能力。這個技術(shù)對比單機版的文件系統(tǒng),例如Windows的文件系統(tǒng)FAT32,NTFS等就能區(qū)分其區(qū)別。其次是實現(xiàn)分布式并行編程模型MapReduce[3],它是利用廉價的計算機集群的綜合處理能力來處理HDFS上的數(shù)據(jù),相對于傳統(tǒng)并行計算框架,無須昂貴的服務(wù)器就可批處理非實時的海量數(shù)據(jù)。
圖1 Hadoop生態(tài)系統(tǒng)
仔細(xì)分析圖1 及查閱相關(guān)文獻,不難發(fā)現(xiàn)涉及對底層HDFS 數(shù)據(jù)處理的技術(shù)主要有MapReduce、Spark[4]、Hive、Pig等。為研究上述數(shù)據(jù)處理技術(shù)的區(qū)別及優(yōu)勢。本文以最為經(jīng)典的分布式程序WordCount為例,設(shè)計了不同技術(shù)方法下的實驗,對比其適用場景及優(yōu)勢,幫助學(xué)生迅速理解并掌握相關(guān)技術(shù)原理及方法。
MapReduce 是一種分布式并行編程模型,是Hadoop 生態(tài)系統(tǒng)中的最為核心和最早出現(xiàn)的計算模型,MapReduce借助集群的力量解決大型數(shù)據(jù)處理問題,其基本理念是“計算向數(shù)據(jù)靠攏”,采用分而治之的辦法,首先數(shù)據(jù)分割Split,接著由集群中的計算節(jié)點進行本地Map 處理數(shù)據(jù),Shuffle 分類數(shù)據(jù),再Reduce匯總結(jié)果,該種模型可輕松解決TB 級別數(shù)據(jù)處理。基本流程如下圖2 所示。
圖2 MapReduce工作流程
這種技術(shù)也存在以下問題:①頻繁訪問HDFS,造成執(zhí)行速度相對較慢;②過于低層化且笨重,所有的數(shù)據(jù)處理均需要編寫Map 和Reduce 函數(shù),技術(shù)復(fù)雜且耗費時間,也并不是所有的數(shù)據(jù)邏輯均可編寫成這兩個關(guān)鍵性函數(shù);③在實時數(shù)據(jù)處理方面相對于傳統(tǒng)技術(shù)無優(yōu)勢。為解決上述問題,出現(xiàn)了第2 代的計算技術(shù)代表Spark。
Spark技術(shù)并不是完全摒棄MapReduce 技術(shù),而是對于MapReduce 技術(shù)的優(yōu)化,具體優(yōu)化體現(xiàn)在:①計算性能[5],Spark 充分利用服務(wù)器內(nèi)存,減少頻繁磁盤I/O讀寫來提升性能;②應(yīng)用程序非常靈活,更容易實現(xiàn)。Spark核心代碼是非常輕量級的Scala 文件[6],同時它也可以在各種編程語言中使用,包括目前流行的Java 和Python 語言,也可在Shell中進行交互式查詢,更加精煉,易于掌握;③具備很強的處理實時數(shù)據(jù)能力。Spark通過Spark Streaming 技術(shù)進行數(shù)據(jù)的實時處理,包含了很多功能強大的應(yīng)用程序接口,用戶可以快速開發(fā)相關(guān)應(yīng)用程序。對于數(shù)據(jù)處理,無論是MapReduce還是Spark 都離不開Map 和Reduce 的思想束縛,因此Hadoop生態(tài)系統(tǒng)中出現(xiàn)了更容易掌握類似于輕量級腳本語言[7]的技術(shù)Pig,及類似于通用關(guān)系型數(shù)據(jù)庫語言Sql的技術(shù)Hive。
Hive是Hadoop 生態(tài)系統(tǒng)中的數(shù)據(jù)倉庫工具,可以把數(shù)據(jù)文件抽象成數(shù)據(jù)表,并能提供類似傳統(tǒng)關(guān)系型數(shù)據(jù)庫結(jié)構(gòu)化查詢語言功能的專用語言HIVESQL(簡稱HQL),底層將HQL 語句轉(zhuǎn)換為對應(yīng)邏輯的MapReduce任務(wù)進行運行。主要適用場景為數(shù)據(jù)報表、頻繁數(shù)據(jù)分析等領(lǐng)域,由于HQL 與SQL 類似,促使其成為Hadoop與其他智能工具進行結(jié)合的理想點,具備傳統(tǒng)數(shù)據(jù)庫基礎(chǔ)知識即可快速掌握。
Pig[8]是比Hive 更加輕量級技術(shù),可不涉及數(shù)據(jù)表,在大數(shù)據(jù)領(lǐng)域信息處理具備更加靈活、通用等特性,其核心主要采用了非常簡潔的Pig Latin 腳本語言來轉(zhuǎn)換數(shù)據(jù)流嵌入到較大程序中,適用于數(shù)據(jù)管道、機器學(xué)習(xí)等領(lǐng)域。
WordCount程序[9]是分布式程序中的最經(jīng)典和最簡單的案例,類似于單機入門級程序HelloWord,主要是統(tǒng)計HDFS上出現(xiàn)單詞的個數(shù)(區(qū)分單詞是根據(jù)單詞間空格),依次介紹在MapReduce、Spark、Hive、Pig的具體實現(xiàn),并且易于還原,直觀感受技術(shù)細(xì)節(jié)和區(qū)別,幫助深刻領(lǐng)悟技術(shù)特點和優(yōu)勢。
Hadoop有單機、偽分布式、完全分布式3 種運行模式,單機模式無集群的思維,無太大研究意義,不選擇,完全分布式方式實現(xiàn)較為煩瑣暫不采用而偽分布式能夠使用一臺計算機模擬集群工作,具備分布式思維且易于還原實現(xiàn),且流程基本等同完全分布式系統(tǒng),本文使用偽分布式完成以下實驗,Hadoop 偽分布式及相關(guān)軟件快速搭建步驟如下:
步驟1Windows 操作系統(tǒng)下安裝虛擬機VirtualBox-5.2.16。
步驟2在虛擬機中導(dǎo)入互聯(lián)網(wǎng)提供的(安裝配置好Hadoop相關(guān)軟件)Ubuntu 版操作系統(tǒng)的鏡像文件。(下載URL:http://dblab.xmu.edu.cn/blog/),如有軟件報錯,根據(jù)虛擬機下方警告提示點擊更換硬件配置即可。
步驟3跨操作系統(tǒng)數(shù)據(jù)存儲解決辦法,在虛擬機VirtualBox中通過設(shè)置選擇USB設(shè)備,插入U盤,點擊圖3 紅圈內(nèi)添加對應(yīng)品牌外部存儲器至虛擬機中,可實現(xiàn)不同操作系統(tǒng)下文件的存儲(見圖3)。
圖3 虛擬機中共享外部存儲器
步驟4網(wǎng)絡(luò)使用問題解決方法,在虛擬機VirtualBox中通過設(shè)置網(wǎng)絡(luò),選擇橋接網(wǎng)絡(luò)并全部允許,見圖4 紅圈,即可在Windows 和Ubuntu 操作系統(tǒng)中同時上網(wǎng)。
圖4 虛擬機中網(wǎng)絡(luò)配置
在Ubuntu系統(tǒng)[10]隨機生成100 個含有單詞的txt文件,為了便于實現(xiàn),采用了復(fù)制文件方式進行,并上傳至HDFS中。具體實驗步驟如下:
步驟1通過start-dfs.sh命令來啟動整個hadoop集群(JPS查看集群啟動結(jié)果)。
步驟2通過input 命令將本地系統(tǒng)的文件復(fù)制到集群HDFS 文件系統(tǒng),將所有數(shù)據(jù)放入HDFS Myinput目錄中。
步驟3通過URL 查看數(shù)據(jù)準(zhǔn)備結(jié)果(http://localhost:50070)。
Hadoop軟件安裝配置復(fù)雜,很多初學(xué)者僅僅因為自己安裝配置無法完成,購買相關(guān)大數(shù)據(jù)實驗設(shè)備昂貴,因而放棄學(xué)習(xí),本文通過上述方法,無須額外軟硬件資本,即可完成基礎(chǔ)實驗平臺搭建及數(shù)據(jù)準(zhǔn)備。
以下實驗均在偽分布式[11]下實現(xiàn),使用單核Intel core i5-2450M CPU,內(nèi)存8GB,SSD 硬盤,其中內(nèi)存4GB分配給虛擬機。
(1)核心代碼。
(2)實驗步驟與結(jié)果。將核心代碼Mywordcount.java編譯打包成Mywordcount.jar包。進入相關(guān)目錄通過執(zhí)行./bin/Hadoop/jar Mywordcount.jar Myinput Myoutput。在Myoutput文件夾中會出現(xiàn)統(tǒng)計結(jié)果為兩個文件,最后通過dfs -cat Myoutput/*命令顯示詞頻,如圖5所示結(jié)果,分別標(biāo)出了詞頻次數(shù)和對應(yīng)的單詞,此實驗如果重復(fù)執(zhí)行MapReduce,應(yīng)注意初始化名稱節(jié)點并刪除臨時文件夾,否則統(tǒng)計結(jié)果無法覆蓋。MapReduce編寫的代碼量較長,時間復(fù)雜度也較高。通過實驗過程和結(jié)果證明了本文1.1所述的特點和問題。
圖5 MapReduce執(zhí)行結(jié)果
Spark實現(xiàn)的方式可以有多種,例如Scala 語言,Spark本地類庫,JAVA 語言等,本文采用了Scala 語言,統(tǒng)計與3.1 相同的數(shù)據(jù)集。
(1)核心代碼。
(2)實驗步驟與結(jié)果。創(chuàng)建一個SparkConf 對象[12],設(shè)置處理數(shù)據(jù)的地址等主要配置信息,接著創(chuàng)建SparkContext 對象,它是Spark 所有功能的入口,無論采用何種方式均需實現(xiàn),最后啟動HDFS 和相關(guān)服務(wù),編寫執(zhí)行核心代碼,實驗結(jié)果類似圖5,時間復(fù)雜度降低。通過實驗過程和結(jié)果證明了本文1.2 所述的特點和問題。
(1)核心代碼。
(2)實驗步驟與結(jié)果。在Hive[12]中創(chuàng)建一個臨時表Mytable,其次通過執(zhí)行shell命令load data inpath'/1.txt'overwrite into table Mytable將數(shù)據(jù)導(dǎo)入到表中,最后通過執(zhí)行Hivesql命令即可完成統(tǒng)計,統(tǒng)計類似圖5。通過實驗過程和結(jié)果證明了本文1.3 所述的特點和問題。
(1)核心代碼
(2)實驗步驟與結(jié)果。該實驗直接使用簡潔的腳本語言Pig Latin[13],主要步驟為數(shù)據(jù)加載,區(qū)分單詞,單詞分組統(tǒng)計等,無論是書寫代碼的難度、通用性還是靈活性都大大提升。實驗結(jié)果類似圖5,通過實驗過程和結(jié)果證明了本文1.4 所述的特點和問題。
通過對上述4 個實驗實現(xiàn),學(xué)生對比實驗步驟和核心代碼,可清楚了解分布式并行計算的MapReduce的工作原理及問題,但其Map 和Reduce 函數(shù)較難編寫和理解,通過Spark 優(yōu)化了MapReduce 實時數(shù)據(jù)處理等問題,而Hive 使用了類似傳統(tǒng)關(guān)系型數(shù)據(jù)庫Sql的Hivesql語言[14]來解決分布式數(shù)據(jù)庫HIVE 表中數(shù)據(jù)處理問題,有數(shù)據(jù)庫基礎(chǔ)的學(xué)生易于適應(yīng)和掌握,最后的腳本語言Pig Latin 通過腳本能自動生成底層MapReduce程序,并且無需考慮函數(shù)參數(shù)限制,具備更強的通用型[15],大大降低了程序開發(fā)難度。
通過上述4 個對比實驗,使得學(xué)生理解分布式并行處理技術(shù)的核心框架,循序漸進掌握Hadoop核心處理技術(shù),理順大數(shù)據(jù)關(guān)鍵技術(shù)之間的關(guān)系,通過對經(jīng)典分布式程序WordCount案例的技術(shù)對比,直觀體會;領(lǐng)悟技術(shù)優(yōu)化過程、適用場景,希望通過對比試驗不僅能給學(xué)生帶來一些技術(shù)和原理上的開拓性思考,而且也能給教師培養(yǎng)創(chuàng)新且務(wù)實的大數(shù)據(jù)人才提供一些啟示。