Hadoop基礎(chǔ)
? ? ? ? ? Hadoop是一個(gè)開發(fā)和運(yùn)行處理大規(guī)模數(shù)據(jù)的軟件平臺(tái),是Appach的一個(gè)用java語言實(shí)現(xiàn)開源軟件框架,實(shí)現(xiàn)在大量計(jì)算機(jī)組成的集群中對(duì)海量數(shù)據(jù)進(jìn)行分布式計(jì)算。
Hadoop框架中最核心設(shè)計(jì)就是:HDFS和MapReduce.HDFS提供了海量數(shù)據(jù)的存儲(chǔ),MapReduce提供了對(duì)數(shù)據(jù)的計(jì)算。
HDFS:Hadoop Distributed File System,Hadoop的分布式文件系統(tǒng)。大文件被分成默認(rèn)64M一塊的數(shù)據(jù)塊分布存儲(chǔ)在集群機(jī)器中。
MapReduce:Hadoop為每一個(gè)input split創(chuàng)建一個(gè)task調(diào)用Map計(jì)算,在此task中依次處理此split中的一個(gè)個(gè)記錄(record),map會(huì)將結(jié)果以key--value的形式輸出,hadoop負(fù)責(zé)按key值將map的輸出整理后作為Reduce的輸入,Reduce Task的輸出為整個(gè)job的輸出,保存在HDFS上.
Hadoop的集群主要由 NameNode,DataNode,Secondary NameNode,JobTracker,TaskTracker組成.
NameNode中記錄了文件是如何被拆分成block以及這些block都存儲(chǔ)到了那些DateNode節(jié)點(diǎn).
NameNode同時(shí)保存了文件系統(tǒng)運(yùn)行的狀態(tài)信息.
DataNode中存儲(chǔ)的是被拆分的blocks.
Secondary NameNode幫助NameNode收集文件系統(tǒng)運(yùn)行的狀態(tài)信息.
JobTracker當(dāng)有任務(wù)提交到Hadoop集群的時(shí)候負(fù)責(zé)Job的運(yùn)行,負(fù)責(zé)調(diào)度多個(gè)TaskTracker.
TaskTracker負(fù)責(zé)某一個(gè)map或者reduce任務(wù).
HDFS
HDFS 采用Master/Slave的架構(gòu)來存儲(chǔ)數(shù)據(jù),這種架構(gòu)主要由四個(gè)部分組成,分別為HDFS Client、NameNode、DataNode和Secondary NameNode。
Client:即客戶端。
1、文件切分。文件上傳 HDFS 的時(shí)候,Client 將文件切分成 一個(gè)一個(gè)的Block,然后進(jìn)行存儲(chǔ)。
2、與 NameNode 交互,獲取文件的位置信息。
3、與 DataNode 交互,讀取或者寫入數(shù)據(jù)。
4、Client 提供一些命令來管理 HDFS,比如啟動(dòng)或者關(guān)閉HDFS。
5、Client 可以通過一些命令來訪問 HDFS。
NameNode:就是 master,它是一個(gè)主管、管理者。
1、管理 HDFS 的名稱空間。
2、管理數(shù)據(jù)塊(Block)映射信息
3、配置副本策略
4、處理客戶端讀寫請(qǐng)求。
DataNode:就是Slave。NameNode 下達(dá)命令,DataNode 執(zhí)行實(shí)際的操作。
1、存儲(chǔ)實(shí)際的數(shù)據(jù)塊。
2、執(zhí)行數(shù)據(jù)塊的讀/寫操作。
Secondary NameNode:并非 NameNode 的熱備。當(dāng)NameNode 掛掉的時(shí)候,它并不能馬上替換 NameNode 并提供服務(wù)。
1、輔助 NameNode,分擔(dān)其工作量。
2、定期合并 fsimage和fsedits,并推送給NameNode。
3、在緊急情況下,可輔助恢復(fù) NameNode。
MapReduce作業(yè)運(yùn)行流程
流程示意圖:

1. 作業(yè)運(yùn)行過程:首先向JobTracker請(qǐng)求一個(gè)新的作業(yè)ID;然后檢查輸出說明(如輸出目錄已存在)、輸出劃分(如輸入路徑不存在);JobTracker配置好所有需要的資源,然后把作業(yè)放入到一個(gè)內(nèi)部的隊(duì)列中,并對(duì)其進(jìn)行初始化,初始化包括創(chuàng)建一個(gè)代表該正在運(yùn)行的作業(yè)對(duì)象(封裝任務(wù)和記錄信息),以便跟蹤任務(wù)的狀態(tài)和進(jìn)程;作業(yè)調(diào)度器獲取分片信息,每個(gè)分片創(chuàng)建一個(gè)map任務(wù)。TaskTracker會(huì)執(zhí)行一個(gè)簡單的循環(huán)定期發(fā)送heartbeat給JobTracker,心跳間隔可自由設(shè)置,通過心跳JobTracker可以監(jiān)控TaskTracker是否存活,同時(shí)也能獲得TaskTracker處理的狀態(tài)和問題,同時(shí)也能計(jì)算出整個(gè)Job的狀態(tài)和進(jìn)度。當(dāng)JobTracker獲得了最后一個(gè)完成指定任務(wù)的TaskTracker操作成功的通知時(shí)候,JobTracker會(huì)把整個(gè)Job狀態(tài)置為成功,然后當(dāng)客戶端查詢Job運(yùn)行狀態(tài)時(shí)候(注意:這個(gè)是異步操作),客戶端會(huì)查到Job完成的通知的。
2. 邏輯角度分析作業(yè)運(yùn)行順序:輸入分片(input split)、map階段、combiner階段、shuffle階段、reduce階段。
input split:在map計(jì)算之前,程序會(huì)根據(jù)輸入文件計(jì)算split,每個(gè)input split針對(duì)一個(gè)map任務(wù)。input split存儲(chǔ)的并非是數(shù)據(jù)本身,而是一個(gè)分片長度和一個(gè)記錄數(shù)據(jù)的位置的數(shù)組。
map階段:即執(zhí)行map函數(shù)。
combiner階段:這是一個(gè)可選擇的函數(shù),實(shí)質(zhì)上是一種reduce操作。combiner是map的后續(xù)操作,主要是在map計(jì)算出中間文件前做一個(gè)簡單的合并重復(fù)key值的操作。
shuffle階段:指從map輸出開始,包括系統(tǒng)執(zhí)行排序即傳送map輸出到reduce作為輸入的過程。另外針對(duì)map輸出的key進(jìn)行排序又叫sort階段。map端shuffle,簡單來說就是利用combiner對(duì)數(shù)據(jù)進(jìn)行預(yù)排序,利用內(nèi)存緩沖區(qū)來完成。reduce端的shuffle包括復(fù)制數(shù)據(jù)和歸并數(shù)據(jù),最終產(chǎn)生一個(gè)reduce輸入文件。shuffle過程有許多可調(diào)優(yōu)的參數(shù)來提高M(jìn)apReduce的性能,其總原則就是給shuffle過程盡量多的內(nèi)存空間。
reduce階段:即執(zhí)行reduce函數(shù)并存到hdfs文件系統(tǒng)中。
3. 作業(yè)調(diào)度器:目前hadoop的作業(yè)調(diào)度器主要有三種:
先進(jìn)先出調(diào)度器:優(yōu)點(diǎn),算法簡單,JobTracker工作負(fù)擔(dān)輕;缺點(diǎn)忽略不同作業(yè)的需求差異。
容量調(diào)度器
公平調(diào)度器
MapReduce容錯(cuò)
hadoop的好處之一就是能處理輸入進(jìn)程崩潰、機(jī)器故障、代碼錯(cuò)誤等問題并能成功運(yùn)行完成任務(wù)。
參考資料:http://note.youdao.com/share/?id=f8ba788138259ea5d048a9317f91e032&type=note#/