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