馬立平,張海燕
(1.西南科技大學計算機科學與技術學院,四川 綿陽 621010;2.武漢三江航天遠方科技有限公司)
計算機體系結構實驗課程是面向計算機科學與技術、電子信息類、自動化類專業(yè)的一門專業(yè)基礎課,學生通過實驗,能較好地理解并掌握目前先進的計算機體系結構,提升對軟硬件設計的系統(tǒng)認識,為進一步設計具有實用價值的計算機系統(tǒng)打下良好的基礎。實驗項目在提高學生分析、設計和開發(fā)計算機領域復雜工程問題的能力上發(fā)揮著重要作用[1]。傳統(tǒng)基于模擬仿真軟件和基于FPGA 的計算機體系結構課程實驗系統(tǒng)沒有涉及機群系統(tǒng)的實驗,并不能滿足實際工程中分析、設計和開發(fā)具有機群系統(tǒng)需求。近年來,隨著大數(shù)據(jù)技術的快速發(fā)展,尤其是海量復雜數(shù)據(jù)分析和應用,計算機體系結構正從“數(shù)據(jù)緊跟處理器”轉向“處理器圍著數(shù)據(jù)轉”,多處理機系統(tǒng)的設計從多核發(fā)展到了眾核,萬兆級的以太網(wǎng)絡逐漸成熟,新型存儲設備層出不窮,并伴有功能日益強大的大數(shù)據(jù)處理軟件(如Hadoop)和日益豐富的軟件開發(fā)語言,使這一問題可以得到基本解決。在大數(shù)據(jù)時代背景下,針對計算機體系結構課程教學也提出了挑戰(zhàn),主要表現(xiàn)為:應完善現(xiàn)有課程教學內(nèi)容,增加計算機系統(tǒng)結構和應用的最新成果,并加大開發(fā)課程相關內(nèi)容的創(chuàng)新性、設計型和應用型實驗項目,這也是“新工科”背景下探索計算機體系結構實驗課程教學改革的必然趨勢[2]。
Hadoop 是一種采用分布式并行的大數(shù)據(jù)處理平臺,后臺通過Hadoop 分布式文件系統(tǒng)HDFS 將大型文件劃分成多個片段,并分布存儲于多臺計算節(jié)點中[3],并且具有可靠性高和部署成本低的優(yōu)點,是可以運行在一般計算機機群上的開源系統(tǒng),支持相對較高吞吐量的大數(shù)據(jù)訪問,因此常用作處理大數(shù)據(jù)集。
傳統(tǒng)的計算機體系結構課程實驗,例如流水線沖突與性能分析、指令調(diào)度、緩存性能分析、多Cache 一致性、處理器的FPGA 實現(xiàn)等較單一,也沒有涉及機群系統(tǒng)內(nèi)容,對于學生設計、開發(fā)計算機系統(tǒng)能力的提升有限。因此,迫切需要開發(fā)一個綜合實驗項目,以培養(yǎng)學生解決計算機領域復雜工程問題的能力,符合實際工程的需要。有目共睹,現(xiàn)代社會離不開大數(shù)據(jù),大數(shù)據(jù)處理技術也得到了研究發(fā)展,并助推經(jīng)濟發(fā)展、提升政府服務、完善社會治理等各個領域[4]。本文以大數(shù)據(jù)處理為切入點,開發(fā)設計了一個基于Hadoop的機群系統(tǒng)綜合性實驗項目,為計算機體系結構課程實驗改革提供了新思路。
傳統(tǒng)的計算機體系結構驗證性實驗課程旨在使學生熟悉計算機體系結構的基本原理和處理器設計流程和方法,學生在指導老師的指引下完成輸入、調(diào)試、仿真,或者進行CPU 設計輸入、仿真、下載和硬件調(diào)試等過程。這種方式在教學內(nèi)容和方法上雖然缺乏一定的創(chuàng)新型,但對于大部分專業(yè)學生來說是可以滿足他們需求的,這也是驗證性實驗的優(yōu)勢所在。
本文在設計開發(fā)基于機群系統(tǒng)的大數(shù)據(jù)技術處理綜合性實驗項目時,將借鑒驗證性實驗課程的優(yōu)勢,并充分考慮大數(shù)據(jù)處理技術模塊可移植的特點,設計為“驗證性實驗+創(chuàng)新性實驗”兩大部分,從而構建“計算機體系結構基礎→提高→創(chuàng)新”和“計算思維—工程思維—創(chuàng)新思維”的遞進式、多層次實踐教學體系[5]。
具體而言,本文所開發(fā)設計的綜合性實驗項目,把基于Hadoop的機群環(huán)境搭建、MapReduce各個執(zhí)行階段、Shuffle 過程的工作原理、HDFS 的分布式存儲和工作原理、以及編寫實現(xiàn)基于機群系統(tǒng)的MapReduce和HDFS 應用實例功能模塊等,作為本次所開發(fā)綜合性實驗項目的驗證性實驗內(nèi)容;把對大數(shù)據(jù)的處理技術,例如實現(xiàn)具有局部迭代大數(shù)據(jù)處理算法、增量式分區(qū)負載均衡策略等功能模塊的編寫,作為本次所開發(fā)綜合性實驗項目的創(chuàng)新性(提高)實驗內(nèi)容。通過這種具有工程應用、創(chuàng)新性及可展示實驗結果,增加學生學習的成就感,更進一步增強學生的學習興趣,提高學生動手能力,培養(yǎng)學生創(chuàng)新思維能力和工程思維能力,真正實現(xiàn)課程目標達成的目的。
基于Hadoop 的機群系統(tǒng)大數(shù)據(jù)處理綜合性實驗項目整體框架如圖1所示。
圖1 基于Hadoop的機群系統(tǒng)綜合性實驗項目整體框架圖
驗證性實驗內(nèi)容分為三大模塊:機群系統(tǒng)部署模塊、HDFS 編程實踐模塊、MapReduce 分布式計算模塊。這部分的功能模塊實驗資源比較豐富,技術較成熟,但是后續(xù)創(chuàng)新性實驗內(nèi)容的基礎,學生在進行實驗時可參考或移植已有的資源或技術進行編程實現(xiàn),對機群系統(tǒng)的部署、HDFS 分布式存儲和MapReduce 分布式計算進行基本驗證。這種驗證過程旨在加深學生對設計機群系統(tǒng)的流程和技術方法的識記和深入理解。創(chuàng)新性實驗內(nèi)容主要是指大數(shù)據(jù)處理模塊,可根據(jù)實驗或工程需要選擇不同的大數(shù)據(jù)處理技術以及軟件的體系結構,本文以實現(xiàn)具有局部迭代大數(shù)據(jù)處理算法和增量式分區(qū)負載均衡策略為例加以介紹,通過分析MapReduce 并行處理體系結構,并對其體系結構進行創(chuàng)新性優(yōu)化調(diào)整以適應不同業(yè)務類型的大數(shù)據(jù)存儲以及處理要求。這種創(chuàng)新過程旨在提高學生的工程應用和創(chuàng)新能力,也能夠拓展學生計算機體系結構的知識面。
3.1.1 Hadoop機群部署模塊
本實驗采用六個節(jié)點的小規(guī)模Hadoop 機群。Hadoop 機群的節(jié)點類型主要有負責協(xié)調(diào)機群中數(shù)據(jù)存儲的NameNode 節(jié)點、存儲被拆分數(shù)據(jù)塊的DataNode節(jié)點、協(xié)調(diào)數(shù)據(jù)計算任務的JobTracker節(jié)點、負責執(zhí)行由JobTracker 節(jié)點指派任務的TaskTracker節(jié)點、幫助NameNode 節(jié)點收集文件系統(tǒng)運行狀態(tài)信息的SecondaryNameNode 節(jié)點等共五類[6],每類節(jié)點采用普通個人計算機,有些節(jié)點可處于同一臺計算機,其計算機的配置均為8核CPU、2.1GHz主頻、16GB內(nèi)存和1TB 硬盤容量,采用千兆以太網(wǎng)互聯(lián)。Hadoop機群部署模塊除了硬件配置之外,還需要安裝并運行Ubuntu、JDK 和Hadoop 軟件,在安裝和配置時可以直接參照Hadoop 的安裝應用指南,并對Hadoop 的體系結構、工作機制及簡單的操作命令等也需要了解[6]。怎么樣判斷一個Hadoop機群是否已經(jīng)正確安裝,還需要運行基準測試程序。Hadoop 軟件有一些自帶的基準測試程序,其中用來測試HDFS 的IO 性能可用TestDFSIO 基準測試程序,用來測試MapReduce 性能的可用Wordcount測試程序,基準測試程序操作簡單,無需過多了解。測試程序運行正確,說明整個Hadoop機群部署正確,可以進行后續(xù)的實驗。
3.1.2 HDFS編程實踐模塊
本實驗需使用HDFS 分布式存儲模塊,這些模塊具有高可用性、高容錯性等優(yōu)點,可以將源數(shù)據(jù)集分布式存儲在HDFS分布式文件系統(tǒng)中[6,7]。實驗主要通過HDFS 編程實踐模塊實現(xiàn)文件的過濾與合并,實驗除了上述在3.1.1節(jié)中安裝部署的軟硬件之外,還需要在Ubuntu 系統(tǒng)中安裝Eclipse 開發(fā)工具來完成實驗。實驗內(nèi)容是假設在HDFS 文件系統(tǒng)中分布存放testfile1.txt、testfile2.txt、testfile3.txt、testfile4.txt、testfile5.xyz、testfile6.xyz等幾個文件,先過濾出所有的后綴名不為“.xyz”的文件,然后對過濾后的這些文件進行讀取并合,生成一個新文件,最后將新文件保存到HDFS文件系統(tǒng)。
完成實驗過程為:在Eclipse 中創(chuàng)建項目→為項目添加需要用到的JAR 包→編寫一個Java 應用程序用來實現(xiàn)過濾和合并任務→在確保Hadoop已經(jīng)啟動,并且上面提到的六個文件已經(jīng)編輯完成并存入HDFS 系統(tǒng)后,開始編譯運行程序→在Eclipse 中實現(xiàn)應用程序的部署→實驗完成。實驗完成后,可以通過“可視化”模塊提供的功能查看實驗結果,其中“可視化”模塊功能的完成可以是HDFS 命令、瀏覽器和專用的可視化工具。
3.1.3 MapReduce分布式計算模塊
MapReduce分布式計算模塊主要讓學生理解分布式并行編程,怎么樣讓分布式程序運行在機群系統(tǒng)并完成大規(guī)模并行處理任務。模塊使用一種并行編程模型MapReduce 來實現(xiàn)并行運算,MapReduce 模型使分布式編程工作得到極大地方便,它將運行于大規(guī)模機群上的復雜的并行計算過程高度抽象為兩個函數(shù):Map 和Reduce,它將一個存儲在分布式文件系統(tǒng)中的數(shù)據(jù)集切分成獨立的分片(split)交予多個Map任務并行處理,編程人員在不熟悉分布式并行編程情景下也能將自己編寫的程序運行在分布式系統(tǒng)上[6,8]。
本實驗的內(nèi)容是統(tǒng)計給定兩個用英文撰寫的文本文件中各個英語單詞的個數(shù)。實驗按照上述3.1.2節(jié)中安裝部署的軟硬件及編程工具。假設在HDFS 文件系統(tǒng)中分布存放testfile1.txt、testfile2.txt 兩個文件,實驗前先編寫Map 函數(shù)處理邏輯和Reduce 函數(shù)處理邏輯,其兩個函數(shù)的處理邏輯可參考可得成就資源[6]。
完成實驗過程為:在Eclipse 中創(chuàng)建項目→為項目添加需要用到的JAR 包→利用已準備好的Map 處理邏輯和Reduce 處理邏輯編寫一個Java 應用程序用來統(tǒng)計兩個文件中各個英語單詞的個數(shù)→在確保Hadoop已經(jīng)啟動,并且上面提到的兩個文件已經(jīng)編輯完成并存入HDFS 系統(tǒng)后,開始編譯運行程序→在Eclipse 中編譯并打包代碼→實驗完成。實驗完成后,可以通過“可視化”模塊提供的功能查看實驗結果,其中“可視化”模塊功能和3.1.2節(jié)中相同。由于MapReduce分布式計算比較復雜,熟練運用它并不一時之事,在實驗教學過程中,此模塊可以參考可得的成熟資源,要求學生通過利用現(xiàn)有資源能夠熟練應用較為合理。
3.2.1 具有局部迭代性的大數(shù)據(jù)處理算法
MapReduce分布式計算模型在處理具有數(shù)據(jù)局部性特征的高維數(shù)據(jù)和圖數(shù)據(jù)時,需要進行多次迭代計算,這會導致MapReduce 分布式計算模型中大量數(shù)據(jù)遷移,從而增加數(shù)據(jù)節(jié)點之間的網(wǎng)絡通信使系統(tǒng)性能下降。為了使得MapReduce 分布式計算模型能夠更好地支持這類數(shù)據(jù)的數(shù)據(jù)挖掘功能,本實驗通過合理的方式利用數(shù)據(jù)內(nèi)部本身所具有的緊密連續(xù)性,將原數(shù)據(jù)合理劃分成相關聯(lián)的不同子圖,之后將其作為Map 映射函數(shù)的計算處理單位,使得本地Map 函數(shù)能完成大部分本地各個子圖的計算,再由Reduce歸約函數(shù)協(xié)調(diào)和各個子圖之間的全局計算[9]。
完成實驗過程為:按照上述3.1.2節(jié)中安裝部署的軟硬件、編程工具和HBase 數(shù)據(jù)庫→在Eclipse 中創(chuàng)建項目→為項目添加需要用到的JAR 包→將PageRank算法應用于具有局部迭代性的MapReduce 分布式計算模型,使所有內(nèi)部節(jié)點在Map 函數(shù)內(nèi)完成迭代計算,剩余的外部節(jié)點在Reduce 函數(shù)內(nèi)完成計算,編寫相應的Map 處理邏輯和Reduce 處理邏輯,并編寫Java應用程序用于完成對給定圖數(shù)據(jù)集或高維數(shù)據(jù)集進行計算→在確保Hadoop已經(jīng)啟動,并且HBase數(shù)據(jù)庫已啟動,開始編譯運行程序→實驗完成。實驗完成后,可以再將PageRank 算法應用于傳統(tǒng)的Hadoop 平臺,并利用相同的數(shù)據(jù)集和硬件平臺進行實驗,對比兩次實驗的結果,分析其性能優(yōu)劣。由于MapReduce 分布式計算比較復雜,在實驗教學過程中,此模塊可參考一些成熟資源,要求學生利用現(xiàn)有資源實現(xiàn)一個新的基于并行處理框架的大數(shù)據(jù)處理系統(tǒng)。
3.2.2 基于增量式分區(qū)負載均衡策略
MapReduce分布式計算模型在對數(shù)據(jù)進行劃分時采用的是一次分區(qū)機制,就是僅對每個元組進行一次并統(tǒng)一時間的劃分方式,同時,還要嚴格按照Reducer與分區(qū)1 對1 的方式進行元組分配,當處理密集數(shù)據(jù)時,導致Reduce端常會出現(xiàn)數(shù)據(jù)傾斜的問題。要解決這種數(shù)據(jù)劃分的不均衡,有多種方法[10,11],本實驗采用基于增量式分區(qū)負載均衡策略[10]。
首先,在Map 段產(chǎn)生比Reducer 個數(shù)多的細粒度分區(qū),并在Mapper運行時,由Counter功能模塊統(tǒng)計各細粒度分區(qū)的數(shù)據(jù)量,將統(tǒng)計結果匯總并寫入本地Buffer 中,通過Hadoop 的心跳機制,將各Mapper 統(tǒng)計匯總信息發(fā)送給Master 節(jié)點,Master 節(jié)點就能獲取全局的分區(qū)分布信息。其次,Master 節(jié)點再根據(jù)獲取到的全局的分區(qū)分布信息,由JobTracker 篩選出一部分還未分配的細粒度分區(qū)分配到Reducer端。當“第一次分配”時,要先篩選出最合適的分區(qū)分配到Reducer端,“第一次分配”完成后,經(jīng)過一定的時間間隔,第二次分區(qū)分配被觸發(fā),由于第一次分配后可能已經(jīng)出現(xiàn)了數(shù)據(jù)傾斜現(xiàn)象,因此第二次分區(qū)分配應考慮被“第一次分配”已分配分區(qū)的情況,此時,利用已準備好的代價評估模型分析當前系統(tǒng)的數(shù)據(jù)均衡程度并進行調(diào)整,對本次篩選出的細粒度分區(qū)分配到各Reducer上并,使本次分配后實現(xiàn)整體數(shù)據(jù)的均衡性。按此方法,每經(jīng)過一定時間間隔后,再按照這種先篩選、再分配的方式進行多個輪回。最后,所有細粒度分區(qū)在執(zhí)行Reduce 函數(shù)前都被分配到了Reduce 端,從而使各個Reducer 接收數(shù)據(jù)總量達到均衡。模型實現(xiàn)過程如圖2所示。
圖2 增量式分區(qū)負載均衡MapReduce分布式計算模型
本實驗的內(nèi)容是在原生Hadoop 系統(tǒng)實現(xiàn)增量式分區(qū)負載均衡策略,具體實現(xiàn)的技術細節(jié)如下。①在原架構基礎上增加三個功能模塊,即負責統(tǒng)計結果收集的Counter 模塊、分配微分區(qū)的Decisions Model 模塊、負責多微分區(qū)合并為細粒度分區(qū)的Add NewPartition 模塊,并且Counter 模塊在原系統(tǒng)的MapTask 類中實現(xiàn)、Decisions Model 模塊在原系統(tǒng)的JobTracker 類中實現(xiàn)、Add NewPartition 模塊在原系統(tǒng)的Reduce Task 類中實現(xiàn)。同時增加Assign Plan 和Counter Table 兩類結構體,用于分區(qū)分配向量和分區(qū)統(tǒng)計向量的實現(xiàn)。②將Counter 模塊添加至各Mapper的運行線程中,將微分區(qū)的統(tǒng)計結果以一維數(shù)組的形式放到Local Counter Table 中并駐留內(nèi)存,同時通過將Local Counter Table 加入至Heartbeat 中來減少JobTracker 和Task 之間的通信開銷。③在JobTracker類中添加了負責微分區(qū)篩選和分配的Decisions Model模塊,用于實現(xiàn)增量式分區(qū)分配過程,所有Task的Local Counter Table 的匯總由Global Counter Table 負責,并將分配計劃添加至Global Assign Plan,在每次決策完成后將更新的Global Assign Plan 增加至下次的Heartbeat通信。④Reduce Task解析Heartbeat,獲得屬于自身的分區(qū)信息,Reduce Task 類中的Add NewPartition 模塊漸進地將分區(qū)信息增加至Local Partition,然后將分區(qū)信息再轉換成分區(qū)的存儲路徑并存放至MapOutput Location。Add NewPartition 模塊能夠完成Reducer 初始化時的多分區(qū)分配,也能夠實現(xiàn)在Reducer 讀數(shù)據(jù)時的增量式分配,從而實現(xiàn)漸進式分配過程。⑤在整個作業(yè)輸入完成后,Reduce()函數(shù)開始執(zhí)行,將執(zhí)行結果寫入HDFS。
為驗證在原生Hadoop 系統(tǒng)實現(xiàn)增量式分區(qū)負載均衡策略的有效性,可通過經(jīng)典的WordCount 算法應用于原生Hadoop 系統(tǒng)和此系統(tǒng),完成實驗過程與3.2.1類似。
本文充分利用Hadoop 分布式系統(tǒng)能夠進行分布式高速處理大數(shù)據(jù)這一優(yōu)勢,設計了機群系統(tǒng)教學綜合性實驗項目。該實驗項目由驗證性實驗和創(chuàng)新性實驗兩部分組成,兼顧學生對于計算機體系結構的基礎掌握和能力提升。該實驗項目可以更好地讓學生從理論和實踐上掌握機群系統(tǒng)設計及實現(xiàn)過程,可以讓學生在實驗中獲得完整的工程應用性項目設計的理念、流程及方法,增強學生的學習興趣和創(chuàng)新思維能力,既符合計算機體系結構實驗課程培養(yǎng)目標,也符合“新工科”工程教育理念。
具有并行處理和分布式計算體系結構的大數(shù)據(jù)系統(tǒng)(Hadoop、MapReduce 等)是進行教學研究和工程訓練較為理想平臺[6],將其應用于《計算機體系結構》課程的并行和分布式處理系統(tǒng)實驗教學,從而科學合理的設計、組建實驗項目,通過編程影響實驗結果,學生可以發(fā)揮自己的想象,實現(xiàn)實驗的創(chuàng)新性目標,使其達到最佳效果。同時,激發(fā)學生學習興趣,鍛煉其解決實際工程問題的能力,這也是“新工科”背景下高校教學改革的一個重要方面。