張國華,葉 苗,王自然,周婷婷
(南京師范大學泰州學院信息工程學院,江蘇泰州 225300)
Hadoop[1]是一個軟件框架模型,主要用于以高效和可擴展的方式對大數據進行分布式信息處理,具有可靠性高、容錯能力強、搭建成本低、跨平臺等特點。它在處理半結構化,非結構化的數據方面優勢明顯,目前得到了廣泛應用,社會對于這方面的技術人才需求量巨大,因其概念繁多,原理復雜,掌握其核心技術的人才較少。為將Hadoop生態系統理順,本文從整體框架(見圖1)分析,在整個生態系統中最為核心的兩個技術,一個是HDFS[2]實現的基礎數據的分布式存儲,它利用集群存儲數據的能力,擴展了計算機的存儲能力。這個技術對比單機版的文件系統,例如Windows的文件系統FAT32,NTFS等就能區分其區別。其次是實現分布式并行編程模型MapReduce[3],它是利用廉價的計算機集群的綜合處理能力來處理HDFS上的數據,相對于傳統并行計算框架,無須昂貴的服務器就可批處理非實時的海量數據。

圖1 Hadoop生態系統
仔細分析圖1 及查閱相關文獻,不難發現涉及對底層HDFS 數據處理的技術主要有MapReduce、Spark[4]、Hive、Pig等。為研究上述數據處理技術的區別及優勢。本文以最為經典的分布式程序WordCount為例,設計了不同技術方法下的實驗,對比其適用場景及優勢,幫助學生迅速理解并掌握相關技術原理及方法。
MapReduce 是一種分布式并行編程模型,是Hadoop 生態系統中的最為核心和最早出現的計算模型,MapReduce借助集群的力量解決大型數據處理問題,其基本理念是“計算向數據靠攏”,采用分而治之的辦法,首先數據分割Split,接著由集群中的計算節點進行本地Map 處理數據,Shuffle 分類數據,再Reduce匯總結果,該種模型可輕松解決TB 級別數據處理。基本流程如下圖2 所示。

圖2 MapReduce工作流程
這種技術也存在以下問題:①頻繁訪問HDFS,造成執行速度相對較慢;②過于低層化且笨重,所有的數據處理均需要編寫Map 和Reduce 函數,技術復雜且耗費時間,也并不是所有的數據邏輯均可編寫成這兩個關鍵性函數;③在實時數據處理方面相對于傳統技術無優勢。為解決上述問題,出現了第2 代的計算技術代表Spark。
Spark技術并不是完全摒棄MapReduce 技術,而是對于MapReduce 技術的優化,具體優化體現在:①計算性能[5],Spark 充分利用服務器內存,減少頻繁磁盤I/O讀寫來提升性能;②應用程序非常靈活,更容易實現。Spark核心代碼是非常輕量級的Scala 文件[6],同時它也可以在各種編程語言中使用,包括目前流行的Java 和Python 語言,也可在Shell中進行交互式查詢,更加精煉,易于掌握;③具備很強的處理實時數據能力。Spark通過Spark Streaming 技術進行數據的實時處理,包含了很多功能強大的應用程序接口,用戶可以快速開發相關應用程序。對于數據處理,無論是MapReduce還是Spark 都離不開Map 和Reduce 的思想束縛,因此Hadoop生態系統中出現了更容易掌握類似于輕量級腳本語言[7]的技術Pig,及類似于通用關系型數據庫語言Sql的技術Hive。
Hive是Hadoop 生態系統中的數據倉庫工具,可以把數據文件抽象成數據表,并能提供類似傳統關系型數據庫結構化查詢語言功能的專用語言HIVESQL(簡稱HQL),底層將HQL 語句轉換為對應邏輯的MapReduce任務進行運行。主要適用場景為數據報表、頻繁數據分析等領域,由于HQL 與SQL 類似,促使其成為Hadoop與其他智能工具進行結合的理想點,具備傳統數據庫基礎知識即可快速掌握。
Pig[8]是比Hive 更加輕量級技術,可不涉及數據表,在大數據領域信息處理具備更加靈活、通用等特性,其核心主要采用了非常簡潔的Pig Latin 腳本語言來轉換數據流嵌入到較大程序中,適用于數據管道、機器學習等領域。
WordCount程序[9]是分布式程序中的最經典和最簡單的案例,類似于單機入門級程序HelloWord,主要是統計HDFS上出現單詞的個數(區分單詞是根據單詞間空格),依次介紹在MapReduce、Spark、Hive、Pig的具體實現,并且易于還原,直觀感受技術細節和區別,幫助深刻領悟技術特點和優勢。
Hadoop有單機、偽分布式、完全分布式3 種運行模式,單機模式無集群的思維,無太大研究意義,不選擇,完全分布式方式實現較為煩瑣暫不采用而偽分布式能夠使用一臺計算機模擬集群工作,具備分布式思維且易于還原實現,且流程基本等同完全分布式系統,本文使用偽分布式完成以下實驗,Hadoop 偽分布式及相關軟件快速搭建步驟如下:
步驟1Windows 操作系統下安裝虛擬機VirtualBox-5.2.16。
步驟2在虛擬機中導入互聯網提供的(安裝配置好Hadoop相關軟件)Ubuntu 版操作系統的鏡像文件。(下載URL:http://dblab.xmu.edu.cn/blog/),如有軟件報錯,根據虛擬機下方警告提示點擊更換硬件配置即可。
步驟3跨操作系統數據存儲解決辦法,在虛擬機VirtualBox中通過設置選擇USB設備,插入U盤,點擊圖3 紅圈內添加對應品牌外部存儲器至虛擬機中,可實現不同操作系統下文件的存儲(見圖3)。

圖3 虛擬機中共享外部存儲器
步驟4網絡使用問題解決方法,在虛擬機VirtualBox中通過設置網絡,選擇橋接網絡并全部允許,見圖4 紅圈,即可在Windows 和Ubuntu 操作系統中同時上網。

圖4 虛擬機中網絡配置
在Ubuntu系統[10]隨機生成100 個含有單詞的txt文件,為了便于實現,采用了復制文件方式進行,并上傳至HDFS中。具體實驗步驟如下:
步驟1通過start-dfs.sh命令來啟動整個hadoop集群(JPS查看集群啟動結果)。
步驟2通過input 命令將本地系統的文件復制到集群HDFS 文件系統,將所有數據放入HDFS Myinput目錄中。
步驟3通過URL 查看數據準備結果(http://localhost:50070)。
Hadoop軟件安裝配置復雜,很多初學者僅僅因為自己安裝配置無法完成,購買相關大數據實驗設備昂貴,因而放棄學習,本文通過上述方法,無須額外軟硬件資本,即可完成基礎實驗平臺搭建及數據準備。
以下實驗均在偽分布式[11]下實現,使用單核Intel core i5-2450M CPU,內存8GB,SSD 硬盤,其中內存4GB分配給虛擬機。
(1)核心代碼。

(2)實驗步驟與結果。將核心代碼Mywordcount.java編譯打包成Mywordcount.jar包。進入相關目錄通過執行./bin/Hadoop/jar Mywordcount.jar Myinput Myoutput。在Myoutput文件夾中會出現統計結果為兩個文件,最后通過dfs -cat Myoutput/*命令顯示詞頻,如圖5所示結果,分別標出了詞頻次數和對應的單詞,此實驗如果重復執行MapReduce,應注意初始化名稱節點并刪除臨時文件夾,否則統計結果無法覆蓋。MapReduce編寫的代碼量較長,時間復雜度也較高。通過實驗過程和結果證明了本文1.1所述的特點和問題。

圖5 MapReduce執行結果
Spark實現的方式可以有多種,例如Scala 語言,Spark本地類庫,JAVA 語言等,本文采用了Scala 語言,統計與3.1 相同的數據集。
(1)核心代碼。

(2)實驗步驟與結果。創建一個SparkConf 對象[12],設置處理數據的地址等主要配置信息,接著創建SparkContext 對象,它是Spark 所有功能的入口,無論采用何種方式均需實現,最后啟動HDFS 和相關服務,編寫執行核心代碼,實驗結果類似圖5,時間復雜度降低。通過實驗過程和結果證明了本文1.2 所述的特點和問題。
(1)核心代碼。

(2)實驗步驟與結果。在Hive[12]中創建一個臨時表Mytable,其次通過執行shell命令load data inpath'/1.txt'overwrite into table Mytable將數據導入到表中,最后通過執行Hivesql命令即可完成統計,統計類似圖5。通過實驗過程和結果證明了本文1.3 所述的特點和問題。
(1)核心代碼

(2)實驗步驟與結果。該實驗直接使用簡潔的腳本語言Pig Latin[13],主要步驟為數據加載,區分單詞,單詞分組統計等,無論是書寫代碼的難度、通用性還是靈活性都大大提升。實驗結果類似圖5,通過實驗過程和結果證明了本文1.4 所述的特點和問題。
通過對上述4 個實驗實現,學生對比實驗步驟和核心代碼,可清楚了解分布式并行計算的MapReduce的工作原理及問題,但其Map 和Reduce 函數較難編寫和理解,通過Spark 優化了MapReduce 實時數據處理等問題,而Hive 使用了類似傳統關系型數據庫Sql的Hivesql語言[14]來解決分布式數據庫HIVE 表中數據處理問題,有數據庫基礎的學生易于適應和掌握,最后的腳本語言Pig Latin 通過腳本能自動生成底層MapReduce程序,并且無需考慮函數參數限制,具備更強的通用型[15],大大降低了程序開發難度。
通過上述4 個對比實驗,使得學生理解分布式并行處理技術的核心框架,循序漸進掌握Hadoop核心處理技術,理順大數據關鍵技術之間的關系,通過對經典分布式程序WordCount案例的技術對比,直觀體會;領悟技術優化過程、適用場景,希望通過對比試驗不僅能給學生帶來一些技術和原理上的開拓性思考,而且也能給教師培養創新且務實的大數據人才提供一些啟示。