前言
Hadoop是一個(gè)基于Java的分布式密集數(shù)據(jù)處理和數(shù)據(jù)分析的軟件框架。Hadoop在很大程度上是受Google在2004年白皮書中闡述的MapReduce技術(shù)的啟發(fā)。MapReduce工作原理是將任務(wù)分解為成百上千個(gè)小任務(wù),然后發(fā)送到計(jì)算機(jī)集群中。每臺計(jì)算機(jī)再傳送自己那部分信息,MapReduce則迅速整合這些反饋并形成答案。簡單來說,就是任務(wù)的分解和結(jié)果的合成。
Hadoop的擴(kuò)展性非常優(yōu)秀,Hadoop可處理分布在數(shù)以千計(jì)的低成本x86服務(wù)器計(jì)算節(jié)點(diǎn)中的大型數(shù)據(jù)。這種高容量低成本的組合引人注目,但Hadoop最吸引人的是其處理混合數(shù)據(jù)類型的能力。Hadoop可以管理結(jié)構(gòu)化數(shù)據(jù),以及諸如服務(wù)器日志文件和Web點(diǎn)擊流的數(shù)據(jù)。同時(shí)還可以管理以非結(jié)構(gòu)化文本為中心的數(shù)據(jù),如Facebook和Twitter。
1 Hadoop基本架構(gòu)
Hadoop 并不僅僅是一個(gè)用于存儲的分布式文件系統(tǒng),而是在由通用計(jì)算設(shè)備組成的大型集群上執(zhí)行分布式應(yīng)用的框架。Apache Hadoop項(xiàng)目中包含了下列產(chǎn)品(見圖1)。
圖1 Hadoop基本組成
Pig和Hive是Hadoop的兩個(gè)解決方案,使得在Hadoop上的編程更加容易,編程人員不再需要直接使用Java APIs。Pig可加載數(shù)據(jù)、轉(zhuǎn)換數(shù)據(jù)格式以及存儲最終結(jié)果等一系列過程,從而優(yōu)化MapReduce 運(yùn)算。
Hive 在Hadoop 中扮演數(shù)據(jù)倉庫的角色。Hive 可向HDFS添加數(shù)據(jù),并允許使用類似SQL的語言進(jìn)行數(shù)據(jù)查詢。Chukwa是基于Hadoop集群的監(jiān)控系統(tǒng),簡單來說就是一個(gè)WatchDog。HBase是一個(gè)面向列的分布式存儲系統(tǒng),用于在Hadoop中支持大型稀疏表的列存儲數(shù)據(jù)環(huán)境。MapReduce用于超大型數(shù)據(jù)集的并行運(yùn)算。HDFS 可以支持千萬級的大型分布式文件系統(tǒng)。Zookeeper提供分布式應(yīng)用程序的協(xié)調(diào)服務(wù),支持的功能包括配置維護(hù)、名字服務(wù)、分布式同步、組服務(wù)等。Avro是一個(gè)數(shù)據(jù)序列化系統(tǒng),用于支持大批量數(shù)據(jù)交換的應(yīng)用。
Hadoop主要由HDFS和MapReduce引擎兩部分組成。最底層是HDFS,它存儲Hadoop集群中所有存儲節(jié)點(diǎn)上的文件,HDFS的上一層是MapReduce引擎,該引擎由JobTracker和TaskTrackers組成。
2 HDFS 淺析
管理網(wǎng)絡(luò)中跨多臺計(jì)算機(jī)存儲的文件系統(tǒng)稱為分布式文件系統(tǒng)。HDFS以流式數(shù)據(jù)訪問模式來存儲超大文件,運(yùn)行于商用硬件集群上。
HDFS的構(gòu)建思路是這樣的:一次寫入、多次讀取是最高效的訪問模式。數(shù)據(jù)集通常由數(shù)據(jù)源生成或從數(shù)據(jù)源復(fù)制而來,接著長時(shí)間在此數(shù)據(jù)集上進(jìn)行各類分析。每次分析會涉及該數(shù)據(jù)集的大部分?jǐn)?shù)據(jù)甚至全部,因此讀取整個(gè)數(shù)據(jù)集的時(shí)間延遲比讀取第一條記錄的時(shí)間延遲更重要。
所謂商用硬件,Hadoop并不需要運(yùn)行在昂貴且高可靠的硬件上。對于龐大的集群來說,節(jié)點(diǎn)故障的幾率還是非常高的。HDFS被設(shè)計(jì)成在遇到故障時(shí)能夠繼續(xù)運(yùn)行且不讓用戶察覺到明顯的中斷。同時(shí),商用硬件并非低端硬件。低端機(jī)器故障率遠(yuǎn)高于更昂貴的機(jī)器。當(dāng)用戶管理幾十臺、上百臺,甚至幾千臺機(jī)器時(shí),便宜的零部件故障率更高,導(dǎo)致維護(hù)成本更高。
HDFS是為高數(shù)據(jù)吞吐量應(yīng)用優(yōu)化的,這可能會以高時(shí)間延遲為代價(jià)。目前,對于低延遲的數(shù)據(jù)訪問需求,HBase是更好的選擇。
2.1 數(shù)據(jù)塊
每個(gè)磁盤都有默認(rèn)的數(shù)據(jù)塊大小,這是磁盤進(jìn)行數(shù)據(jù)讀/寫的最小單位。HDFS同樣也有塊的概念,默認(rèn)為64 MB(很多情況下使用128 MB)。HDFS上文件也被劃分為多個(gè)分塊作為獨(dú)立的存儲單元。HDFS的塊比磁盤塊(一般為512字節(jié))大很多,其目的是為了最小化尋址開銷。但是該參數(shù)也不會設(shè)置得過大,MapReduce中的map任務(wù)通常一次處理一個(gè)塊中的數(shù)據(jù),因此如果tasks太少(少于集群中的節(jié)點(diǎn)數(shù)量),job的運(yùn)行速度就會比較慢。
2.2 namenode和datanode
HDFS集群有兩類節(jié)點(diǎn),并分別以管理者(nameno?de)、工作者(datanode)模式運(yùn)行。
namenode管理文件系統(tǒng)的命名空間,它維護(hù)著文件系統(tǒng)樹及整棵樹內(nèi)所有的文件和目錄。這些信息以2個(gè)文件(命名空間鏡像文件和編輯日志文件)的形式永久保存在本地磁盤上。namenode也記錄著每個(gè)文件中各個(gè)塊所在的datanode信息,但它并不永久保存塊的位置信息,因?yàn)檫@些信息會在系統(tǒng)啟動(dòng)時(shí)由datanode重建。同時(shí),namenode也負(fù)責(zé)控制外部Client的訪問。
datanode是文件系統(tǒng)的工作節(jié)點(diǎn)。它們根據(jù)需要存儲并檢索數(shù)據(jù)塊(受客戶端或namenode調(diào)度),響應(yīng)創(chuàng)建、刪除和復(fù)制數(shù)據(jù)塊的命令,并且定期向nameno?de發(fā)送所存儲數(shù)據(jù)塊列表的“心跳”信息。HDFS內(nèi)部的所有通信都基于標(biāo)準(zhǔn)的TCP/IP協(xié)議。namenode獲取每個(gè)datanode的心跳信息,namenode據(jù)此驗(yàn)證塊映射和文件系統(tǒng)元數(shù)據(jù)。
圖2示出的是namenode和datanode。
圖2 namenode和datanode
文件寫入時(shí)的步驟為:
a)Client向namenode發(fā)起文件寫入的請求。
b)namenode根據(jù)文件大小和文件塊配置情況,將它管理的datanode節(jié)點(diǎn)的信息返回給Client。
c)Client將文件劃分為多個(gè)塊,根據(jù)datanode的地址信息,按順序?qū)懭氲矫恳粋(gè)datanode塊中。
文件讀取時(shí)的步驟為:
a)Client向namenode發(fā)起文件讀取的請求。
b)namenode返回存儲文件的datanode的信息。
c)Client讀取文件信息。
作為文件系統(tǒng)的管理員,沒有namenode,文件系統(tǒng)將無法使用。如果運(yùn)行namenode服務(wù)的機(jī)器毀壞,文件系統(tǒng)上所有的文件將會丟失,且不知道如何根據(jù)datanode的數(shù)據(jù)塊來重建文件。Hadoop為此提供了2種機(jī)制對namenode實(shí)現(xiàn)冗余備份。
圖3示出的是冗余namenode。
圖3 冗余namenode
一種機(jī)制是備份保存文件系統(tǒng)元數(shù)據(jù)的文件。一般配置是:將文件系統(tǒng)元數(shù)據(jù)寫入本地磁盤的同時(shí),寫入一個(gè)遠(yuǎn)程掛載的網(wǎng)絡(luò)文件系統(tǒng)(NFS)。
另一種機(jī)制是運(yùn)行一個(gè)輔助的namenode,但它不能被用作namenode。輔助的namenode通過編輯日志定期合并命名空間鏡像。輔助namenode一般在另一臺單獨(dú)的物理計(jì)算機(jī)上運(yùn)行,因?yàn)樗枰加么罅緾PU時(shí)間和與namenode相同容量的內(nèi)存來執(zhí)行合并操作。它會保存合并后的命名空間鏡像的副本,并在namenode發(fā)生故障時(shí)啟用。
但是,輔助namenode保存的狀態(tài)總是滯后于主節(jié)點(diǎn),一般情況融合2種機(jī)制。主namenode故障時(shí),把存儲在NFS上的namenode元數(shù)據(jù)復(fù)制到輔助namenode上,并將其作為新的主namenode運(yùn)行。
2.3 命令行接口
HDFS 的文件和目錄有與POSIX 相似的權(quán)限模式,通常是三類權(quán)限模式(rwx)。集群管理員可以通過命令行接口與HDFS交互,執(zhí)行所有常見的文件系統(tǒng)操作,如創(chuàng)建目錄、移動(dòng)文件、刪除數(shù)據(jù)、列出目錄等等。HDFS并不是一個(gè)Unix文件系統(tǒng),不支持像ls和cp這種標(biāo)準(zhǔn)的Unix文件命令。Hadoop提供了一套與Linux文件命令類似的命令行工具,通過shell命令操作文件和目錄。
Hadoop也提供操作HDFS文件和目錄的Java庫,用于以編程方式訪問HDFS。
一般情況下,由MapReduce框架讀取HDFS文件和處理數(shù)據(jù)單元。除非需要定制數(shù)據(jù)的導(dǎo)入和導(dǎo)出,否則幾乎不必編程來讀寫HDFS文件。
3 Hadoop MapReduce淺析
最簡單的MapReduce 應(yīng)用程序至少包含3 個(gè)部分:一個(gè)Map 函數(shù)、一個(gè)Reduce 函數(shù)和一個(gè)main 函數(shù)。main 函數(shù)將作業(yè)控制和文件輸入/輸出結(jié)合起來。在這點(diǎn)上,Hadoop提供了大量的接口和抽象類,從而為Hadoop應(yīng)用程序開發(fā)人員提供許多工具,可用于調(diào)試和性能度量等。
MapReduce本身就是用于并行處理大數(shù)據(jù)的軟件框架。MapReduce的根源是函數(shù)性編程中的Map函數(shù)和Reduce 函數(shù)。它由2 個(gè)可能包含許多事例(許多Map和Reduce)的操作組成。Map函數(shù)接受一組數(shù)據(jù)并將其轉(zhuǎn)換為一個(gè)鍵/值對列表,輸入域中的每個(gè)元素對應(yīng)一個(gè)鍵/值對。Reduce函數(shù)接受Map函數(shù)生成的列表,然后根據(jù)它們的鍵(為每個(gè)鍵生成一個(gè)鍵/值對)縮小鍵/值對列表?梢栽诿總(gè)域上執(zhí)行Map函數(shù)和Reduce函數(shù),然后將輸出的鍵/值對列表輸入到另一個(gè)Reduce函數(shù),就可得到與前面一樣的結(jié)果。換句話說,可以在輸入域并行使用相同的操作,得到的結(jié)果是一樣的,但速度更快。MapReduce的并行功能可在任意數(shù)量的系統(tǒng)上使用。
圖4示出的是MapReduce思想。
3.1 JobTracker和TaskTracker
Hadoop MapReduce 引擎由JobTracker 和Task?Tracker組成。圖5示出的是Hadoop的結(jié)構(gòu)。
JobTracker負(fù)責(zé)管理調(diào)度所有作業(yè),它是整個(gè)系統(tǒng)分配任務(wù)的核心。與HDFS的namenode類似,Job?Tracker也是唯一的。它是Hadoop集群中唯一負(fù)責(zé)控制MapReduce應(yīng)用程序的系統(tǒng),在應(yīng)用程序提交之后,將提供包含在HDFS中的輸入和輸出目錄,JobTracker使用文件塊信息(物理量和位置)確定如何創(chuàng)建其他TaskTracker從屬任務(wù),MapReduce應(yīng)用程序被復(fù)制到每個(gè)出現(xiàn)文件塊的節(jié)點(diǎn),為特定節(jié)點(diǎn)上的每個(gè)文件塊創(chuàng)建一個(gè)唯一的從屬任務(wù)。
圖4 MapReduce思想
圖5 Hadoop的結(jié)構(gòu)
TaskTracker具體負(fù)責(zé)執(zhí)行用戶定義的操作,每個(gè)任務(wù)被分割為任務(wù)集,包含Map任務(wù)和Reduce任務(wù)。任務(wù)是具體執(zhí)行的基本單元,TaskTracker執(zhí)行過程中需要向JobTracker發(fā)送心跳信息,匯報(bào)每個(gè)任務(wù)的執(zhí)行狀態(tài),幫助JobTracker收集作業(yè)執(zhí)行的整體情況,為下次任務(wù)的分配提供依據(jù)。
在Hadoop中,Client(任務(wù)的提交者)是一組API,用戶需要自定義自己需要的內(nèi)容,由Client將作業(yè)及其配置提交到JobTracker,并監(jiān)控執(zhí)行狀況。
與HDFS的通信機(jī)制相同,Hadoop MapReduce也使用協(xié)議接口來實(shí)現(xiàn)服務(wù)器間的通信。Client與Task?Tracker及TaskTracker之間沒有直接通信。由于集群各主機(jī)的通信比較復(fù)雜,點(diǎn)對點(diǎn)直接通信難以維持狀態(tài)信息,所以由JobTracker收集整理統(tǒng)一轉(zhuǎn)發(fā)。
3.2 MapReduce的工作機(jī)制
JobClient.runJob(conf)這一行簡短的代碼后面隱藏著大量的處理細(xì)節(jié)。整個(gè)過程如圖6所示,包含如下4個(gè)獨(dú)立的實(shí)體。
圖6 運(yùn)行MapReduce作業(yè)的工作原理
a)客戶端:提交MapReduce作業(yè)。
b)JobTracker:協(xié)調(diào)作業(yè)的運(yùn)行。
c)TaskTracker:運(yùn)行作業(yè)劃分后的任務(wù)。
d)分布式文件系統(tǒng)(一般為HDFS):用來在其他實(shí)體間共享作業(yè)文件。
3.2.1 作業(yè)的提交
JobClient的runJob()方法是用于新建JobClient實(shí)例并調(diào)用其submitJob()方法。提交作業(yè)后,runJob()每秒檢測作業(yè)的進(jìn)度,如果發(fā)現(xiàn)上次報(bào)告后有變化,便把進(jìn)度報(bào)告給控制臺。作業(yè)完成后,如果成功,就顯示作業(yè)計(jì)數(shù)器。如果失敗,導(dǎo)致作業(yè)失敗的錯(cuò)誤被記錄到控制臺。
JobClient的runJob()方法(圖6步驟①)實(shí)現(xiàn)過程如下:
a)通過JobTracker的getNewJobId()方法,向Job?Tracker請求一個(gè)新的作業(yè)ID(圖6步驟②)。
b)檢查作業(yè)的輸出說明。例如,如果沒有指定輸出目錄或輸出目錄已經(jīng)存在,作業(yè)就不提交,錯(cuò)誤返回給MapReduce程序。
c)將運(yùn)行作業(yè)所需要的資源(包括作業(yè)JAR 文件、配置文件和輸入分片)復(fù)制到JobTracker文件系統(tǒng)中的一個(gè)以作業(yè)ID命名的目錄下(圖6步驟③)。作業(yè)JAR 的副本較多(由mapred.submit.replication 屬性控制,默認(rèn)值為10), 因此在運(yùn)行作業(yè)的任務(wù)時(shí),集群中有很多個(gè)副本可供TaskTracker訪問。
d)通過調(diào)用JobTracker 的submitJob()方法告知JobTracker準(zhǔn)備執(zhí)行作業(yè)(圖6步驟④)。
e)計(jì)算作業(yè)的輸入分片。如果分片無法計(jì)算,例如,因?yàn)檩斎肼窂讲淮嬖,作業(yè)就不提交,錯(cuò)誤返回給MapReduce程序(圖6步驟⑥)。
3.2.2 作業(yè)的初始化
當(dāng)JobTracker接收到對其submitJob()方法的調(diào)用后,會把此調(diào)用放入一個(gè)內(nèi)部隊(duì)列中,交由作業(yè)調(diào)度器(job scheduler)進(jìn)行調(diào)度,并對其進(jìn)行初始化。初始化包括創(chuàng)建一個(gè)表示正在運(yùn)行作業(yè)的對象——封裝任務(wù)和記錄信息,以便跟蹤任務(wù)的狀態(tài)和進(jìn)程(圖6步驟⑤)。
為了創(chuàng)建任務(wù)運(yùn)行列表,作業(yè)調(diào)度器首先從共享文件系統(tǒng)中獲取JobClient已計(jì)算好的輸入分片信息(圖6步驟⑥)。然后為每個(gè)分片創(chuàng)建一個(gè)map任務(wù)。創(chuàng)建reduce 任務(wù)的數(shù)量由JobConf 的mapred.reduce.task屬性決定,它是用setNumReduceTasks()方法來設(shè)置的,然后調(diào)度器創(chuàng)建相應(yīng)數(shù)量的要運(yùn)行的reduce任務(wù)。任務(wù)在此時(shí)被指定ID。
3.2.3 任務(wù)的分配
TaskTracker定期向JobTracker發(fā)送心跳。心跳告知JobTracker,TaskTracker是否還存活,同時(shí)也充當(dāng)兩者之間的消息通道。作為心跳的一部分,TaskTracker會指明它是否已經(jīng)準(zhǔn)備好運(yùn)行新的任務(wù)。如果是,JobTracker會為它分配一個(gè)任務(wù),并使用心跳的返回值與TaskTracker 進(jìn)行通信(圖6步驟⑦)。
在JobTracker 為TaskTracker 選擇任務(wù)之前,JobTracker必須先選定任務(wù)所在的作業(yè)。一旦選擇好作業(yè),JobTracker就可以為該作業(yè)選定一個(gè)任務(wù)。
對于map任務(wù)和reduce任務(wù),TaskTracker有固定數(shù)量的任務(wù)槽。例如,1個(gè)TaskTracker可能同時(shí)運(yùn)行2個(gè)map 任務(wù)和2 個(gè)reduce 任務(wù)。準(zhǔn)確數(shù)量由TaskTracker內(nèi)核的數(shù)量和內(nèi)存大小來決定。作業(yè)調(diào)度器在處理reduce任務(wù)槽之前,會填滿空閑的map任務(wù)槽,因此如果TaskTracker至少有一個(gè)空閑的map任務(wù)槽,JobTracker會先為它選擇一個(gè)map任務(wù)。
為了選擇一個(gè)reduce任務(wù),JobTracker簡單地從待運(yùn)行的reduce任務(wù)列表中選取下一個(gè)來執(zhí)行,用不著考慮數(shù)據(jù)的本地化。然而,對于一個(gè)map任務(wù),JobTracker會考慮TaskTracker的網(wǎng)絡(luò)位置,并選取一個(gè)距離其輸入分片文件最近的TaskTracker。
在最理想的情況下,任務(wù)是數(shù)據(jù)本地化的(data-local), 也就是任務(wù)運(yùn)行在輸入分片所在的節(jié)點(diǎn)上。同樣,任務(wù)也可能是機(jī)架本地化的(rack-local)。任務(wù)和輸入分片在同一個(gè)機(jī)架,但不在同一節(jié)點(diǎn)上。一些任務(wù)既不是數(shù)據(jù)本地化的,也不是機(jī)架本地化的,而是操作另一個(gè)機(jī)架上的數(shù)據(jù)。
3.2.4 任務(wù)的執(zhí)行
現(xiàn)在,TaskTracker已經(jīng)被分配了一個(gè)任務(wù),下一步是執(zhí)行該任務(wù)。第一步,通過從共享文件系統(tǒng)把作業(yè)的JAR文件復(fù)制到TaskTracker所在的文件系統(tǒng),從而實(shí)現(xiàn)作業(yè)的JAR文件本地化。同時(shí),TaskTracker將應(yīng)用程序所需要的全部文件從共享文件系統(tǒng)復(fù)制到本地磁盤(圖6步驟⑧)。第二步,TaskTracker為任務(wù)新建一個(gè)本地工作目錄,并把JAR文件中的內(nèi)容解壓到這個(gè)文件夾下。第三步,TaskTracker新建一個(gè)TaskRunner實(shí)例來運(yùn)行該任務(wù)。
TaskRunner啟動(dòng)一個(gè)新的JVM(圖6步驟⑨)來運(yùn)行每個(gè)任務(wù)(圖6步驟⑩), 以便用戶定義的map和re?duce 函數(shù)的任何軟件問題都不會影響到TaskTracker(例如導(dǎo)致其崩坡或掛起等)。任務(wù)的子進(jìn)程每隔幾秒便告知父進(jìn)程它的進(jìn)度,直到任務(wù)完成。
3.2.5 進(jìn)度和狀態(tài)的更新
MapReduce作業(yè)是長時(shí)間運(yùn)行的批量作業(yè),這是一個(gè)很長的時(shí)間段,對于用戶而言,能夠得知作業(yè)進(jìn)展是很重要的。一個(gè)作業(yè)和它的每個(gè)任務(wù)都有一個(gè)狀態(tài)(status), 包括作業(yè)或任務(wù)的狀態(tài)(如運(yùn)行狀態(tài)、成功完成、失敗狀態(tài))、map和reduce的進(jìn)度、作業(yè)計(jì)數(shù)器的值、狀態(tài)信息或描述(可以由用戶代碼來設(shè)置)。
任務(wù)在運(yùn)行時(shí),對其進(jìn)度保持追蹤。對map任務(wù),任務(wù)進(jìn)度是已處理輸入所占的比例。對reduce任務(wù),情況稍微復(fù)雜,但系統(tǒng)仍然會估計(jì)已處理reduce輸入的比例。比如,如果reduce任務(wù)已經(jīng)執(zhí)行reducer一半的輸入,那么任務(wù)的進(jìn)度便是5/6。因?yàn)橐呀?jīng)完成復(fù)制和排序階段(各1/3),并且已經(jīng)完成reduce階段的一半(1/6)。
如果任務(wù)報(bào)告了進(jìn)度,便會設(shè)置一個(gè)標(biāo)志以表明狀態(tài)變化將被發(fā)送到TaskTracker。有一個(gè)獨(dú)立的線程每隔3 s檢查一次此標(biāo)志,如果已設(shè)置,則告知Task?Tracker當(dāng)前任務(wù)狀態(tài)。同時(shí),TaskTracker每隔5 s發(fā)送心跳到JobTracker(5 s這個(gè)間隔是最小值,心跳間隔實(shí)際上由集群的大小來決定,更大的集群,間隔會更長一些),并且將TaskTracker運(yùn)行的所有任務(wù)的狀態(tài)發(fā)送至JobTracker。
JobTracker將這些更新狀態(tài)合并起來,生成一個(gè)表明所有運(yùn)行作業(yè)及其所含任務(wù)狀態(tài)的全局視圖。同時(shí),JobClient通過查詢JobTracker來獲取最新狀態(tài)?蛻舳艘部梢允褂肑obClient的getJob()方法來得到一個(gè)RunningJob的實(shí)例,后者包含作業(yè)的所有狀態(tài)信息。
3.2.6 作業(yè)的完成
當(dāng)JobTracker收到作業(yè)最后一個(gè)任務(wù)已完成的通知后,便把作業(yè)的狀態(tài)設(shè)置為“成功”。然后,在JobCli?ent查詢狀態(tài)時(shí),便知道任務(wù)已經(jīng)完成,于是JobClient打印一條消息告知用戶,然后從runJob()方法返回。最后,JobTracker清空作業(yè)的工作狀態(tài),指示TaskTracker也清空作業(yè)的工作狀態(tài)。
3.3 作業(yè)的調(diào)度
早期版本的Hadoop使用一種非常簡單的方法來調(diào)度用戶的作業(yè)。按照作業(yè)提交的順序,即先進(jìn)先出(FIFO)調(diào)度算法來運(yùn)行作業(yè)。典型情況下,每個(gè)作業(yè)都會使用整個(gè)集群,因此作業(yè)必須等待直到輪到自己運(yùn)行。雖然共享集群極有可能為多用戶提供大量資源,但問題在于如何公平地在用戶之間分配資源,這需要一個(gè)更好的調(diào)度器。
后來版本的Hadoop 加入設(shè)置作業(yè)優(yōu)先級的功能?梢酝ㄟ^設(shè)置mapred.job.priority屬性或JobClient的setJoBPRiority()方法來設(shè)置優(yōu)先級。在這2種方法中,可以選擇VERY_HIGH、HIGH、NORMAL、LOW、VERY_LOW中的一個(gè)值作為優(yōu)先級。作業(yè)調(diào)度器會選擇優(yōu)先級最高的那個(gè)作業(yè)執(zhí)行。
在Hadoop中,MapReduce的調(diào)度器可以選擇。默認(rèn)的調(diào)度器是FIFO,還可選擇Fair Scheduler和Capaci?ty Scheduler。
Fair Scheduler的目標(biāo)是讓每個(gè)用戶公平地共享集群能力。如果只有一個(gè)作業(yè),它會得到集群的所有資源。隨著提交的作業(yè)越來越多,空閑的TaskTracker任務(wù)槽會以“讓每個(gè)用戶公平共享集群”這種方式進(jìn)行分配。即便一個(gè)用戶的長時(shí)間作業(yè)正在運(yùn)行而且還在進(jìn)行過程中,另一個(gè)用戶的一個(gè)短的作業(yè)會在合理的時(shí)間內(nèi)完成。
作業(yè)都被放在作業(yè)池中,在默認(rèn)情況下,每個(gè)用戶都有自己的作業(yè)池。Fair Scheduler支持搶占,如果一個(gè)池在特定一段時(shí)間內(nèi)未得到公平的資源,它會中止運(yùn)行池中使用過多資源的任務(wù),以便把任務(wù)槽讓給運(yùn)行資源不足的池。
針對多作業(yè)調(diào)度,Capacity Scheduler調(diào)度方式下,集群由很多隊(duì)列組成,每個(gè)隊(duì)列有一個(gè)分配能力。這一點(diǎn)與Fair Scheduler類似,只不過在每個(gè)隊(duì)列內(nèi)部,作業(yè)根據(jù)FIFO方式調(diào)度。即Capacity Scheduler允許為每個(gè)用戶模擬一個(gè)獨(dú)立的使用FIFO Scheduling的MapReduce集群。
4 應(yīng)用場景及展望
云計(jì)算的偉大之處就在于在進(jìn)行大數(shù)據(jù)處理時(shí)不必再像以往一樣購買大量的服務(wù)器集群,租用服務(wù)器處理大數(shù)據(jù)更加利于控制成本。Hadoop作為一個(gè)重量級的分布式處理開源框架已經(jīng)在大數(shù)據(jù)處理領(lǐng)域有所作為,企業(yè)希望利用Hadoop來規(guī)劃其自身未來數(shù)據(jù)處理的藍(lán)圖。從EMC、Oracle到Microsoft,幾乎所有高科技廠商都宣布了自己以Hadoop為基礎(chǔ)的大數(shù)據(jù)戰(zhàn)略,F(xiàn)今Hadoop已經(jīng)成為IT商場吸引客戶的熱點(diǎn)詞匯。
核心關(guān)注:拓步ERP系統(tǒng)平臺是覆蓋了眾多的業(yè)務(wù)領(lǐng)域、行業(yè)應(yīng)用,蘊(yùn)涵了豐富的ERP管理思想,集成了ERP軟件業(yè)務(wù)管理理念,功能涉及供應(yīng)鏈、成本、制造、CRM、HR等眾多業(yè)務(wù)領(lǐng)域的管理,全面涵蓋了企業(yè)關(guān)注ERP管理系統(tǒng)的核心領(lǐng)域,是眾多中小企業(yè)信息化建設(shè)首選的ERP管理軟件信賴品牌。
轉(zhuǎn)載請注明出處:拓步ERP資訊網(wǎng)http://www.oesoe.com/
本文標(biāo)題:Hadoop HDFS和MapReduce 架構(gòu)淺析
本文網(wǎng)址:http://www.oesoe.com/html/consultation/1083946768.html