Hadoop-MapReduce1.x-框架
1.主要成員
1)Client
?用戶編寫的MapReduce程序通過Client提交到JobTracker端;同時(shí),用戶可通過Client提供的一些接口查看作業(yè)的運(yùn)行狀態(tài)馋没。在Hadoop內(nèi)部用“作業(yè)”(Job)表示MapReduce程序浊伙。一個(gè)MapReduce程序可對(duì)應(yīng)若干個(gè)作業(yè)淹真,而每個(gè)作業(yè)會(huì)被分解成若干個(gè)Map/Reduce任務(wù)(Task)。
2)JobTracker
?JobTracke負(fù)責(zé)資源監(jiān)控和作業(yè)調(diào)度肴捉。JobTracker 監(jiān)控所有TaskTracker 與job的健康狀況,一旦發(fā)現(xiàn)失敗叔收,就將相應(yīng)的任務(wù)轉(zhuǎn)移到其他節(jié)點(diǎn)齿穗;同時(shí),JobTracker 會(huì)跟蹤任務(wù)的執(zhí)行進(jìn)度饺律、資源使用量等信息窃页,并將這些信息告訴任務(wù)調(diào)度器,而調(diào)度器會(huì)在資源出現(xiàn)空閑時(shí),選擇合適的任務(wù)使用這些資源脖卖。在Hadoop 中乒省,任務(wù)調(diào)度器是一個(gè)可插拔的模塊,用戶可以根據(jù)自己的需要設(shè)計(jì)相應(yīng)的調(diào)度器畦木。
3)TaskTracker
?TaskTracker 會(huì)周期性地通過Heartbeat 將本節(jié)點(diǎn)上資源的使用情況和任務(wù)的運(yùn)行進(jìn)度匯報(bào)給JobTracker袖扛,同時(shí)接收J(rèn)obTracker 發(fā)送過來的命令并執(zhí)行相應(yīng)的操作(如啟動(dòng)新任務(wù)、殺死任務(wù)等)十籍。TaskTracker 使用“slot”等量劃分本節(jié)點(diǎn)上的資源量蛆封。“slot”代表計(jì)算資源(CPU勾栗、內(nèi)存等)娶吞。一個(gè)Task 獲取到一個(gè)slot 后才有機(jī)會(huì)運(yùn)行,而Hadoop 調(diào)度器的作用就是將各個(gè)TaskTracker 上的空閑slot 分配給Task 使用械姻。slot 分為Map slot 和Reduce slot 兩種妒蛇,分別供MapTask 和Reduce Task 使用。TaskTracker 通過slot 數(shù)目(可配置參數(shù))限定Task 的并發(fā)度楷拳。
4)Task
?Task 分為Map Task 和Reduce Task 兩種绣夺,均由TaskTracker 啟動(dòng)。HDFS 以固定大小的block 為基本單位存儲(chǔ)數(shù)據(jù)欢揖,而對(duì)于MapReduce 而言陶耍,其處理單位是split。split 是一個(gè)邏輯概念她混,它只包含一些元數(shù)據(jù)信息烈钞,比如數(shù)據(jù)起始位置、數(shù)據(jù)長度坤按、數(shù)據(jù)所在節(jié)點(diǎn)等毯欣。它的劃分方法完全由用戶自己決定。但需要注意的是臭脓,split 的多少?zèng)Q定了Map Task 的數(shù)目酗钞,因?yàn)槊總€(gè)split 只會(huì)交給一個(gè)Map Task 處理。
2.主要過程
- run job
? 在客戶端来累,用戶編寫Java程序砚作,編寫完成后,打包為jar包嘹锁,然后提交葫录。JobClient的run job()方法是用于新建JobClient實(shí)例,并調(diào)用其submitjob()方法的快捷方式 也可以用 job.waitcomplication()领猾。提交作業(yè)后米同,run job()每秒輪詢作業(yè)的進(jìn)度骇扇,如果發(fā)現(xiàn)自上次報(bào)告后有改變,便把進(jìn)度打印到控制臺(tái)窍霞,作業(yè)完成后匠题,如果成功,就顯示作業(yè)計(jì)數(shù)器但金,如果失敗韭山,導(dǎo)致錯(cuò)誤的原因打印到控制臺(tái)。
- get new job id
? -->向jobTracker請(qǐng)求一個(gè)job id (JobTracker.getNewJobId());
? -->檢查作業(yè)的輸出說明冷溃,如果輸出目錄已經(jīng)存在或者沒有指定輸出目錄钱磅,則拋出異常給客戶端,
? -->檢查作業(yè)的輸入切片似枕,如果輸入分片不能計(jì)算如沒有指定輸入目錄盖淡,如拋出異常給客戶端。
- copy job resources
? 將運(yùn)行作業(yè)所需要的資源包括
? -->打包好的jar包(運(yùn)行程序)
? -->配置文件(xml)
? -->計(jì)算所得的輸入分片
? 復(fù)制到一job id 命名的目錄下jobtracker的文件系統(tǒng)中凿歼,作業(yè)jar的副本較多(由mapred.submin.replication)控制默認(rèn)為10
? 因此在運(yùn)行作業(yè)的時(shí)候褪迟,集群中有許多tasktracker訪問
- summit job
? 通知JobTracker 作業(yè)準(zhǔn)備執(zhí)行。(通過調(diào)用jobtracker的submitjob()方法實(shí)現(xiàn))
- initlialize job (初始化)
? 當(dāng)JobTracker接收到對(duì)其submitjob()方法的調(diào)用后答憔,會(huì)把此調(diào)用放入一個(gè)內(nèi)部隊(duì)列中味赃,交由作業(yè)調(diào)度器(job scheduler)進(jìn)行調(diào)度
? 并對(duì)其進(jìn)行初始化。初始化包括創(chuàng)建一個(gè)表示正在運(yùn)行的作業(yè)對(duì)象--封裝任務(wù)和記錄信息虐拓,以便跟蹤任務(wù)的狀態(tài)和進(jìn)程心俗。
- retrieve input splits (檢索 恢復(fù))
? --> 為了創(chuàng)建任務(wù)運(yùn)行列表,作業(yè)調(diào)度器首先從共享文件系統(tǒng)中獲取JobClient以計(jì)算好的輸入分片信息蓉驹,然后為每個(gè)分片分配一個(gè) map 任 務(wù)
? --> 創(chuàng)建的reduce任務(wù)數(shù)量有job的mapred.reduce.task屬性決定(setNumReduceTask()設(shè)置)城榛,scheduler創(chuàng)建相應(yīng)數(shù)量的r educe任 務(wù),任務(wù)在此時(shí)被分配ID
? --> 除了map任務(wù)和reduce任務(wù)态兴,還有setupJob,cleanupJob需要建立狠持,有tasktracker在所有map開始前和所有reduce結(jié)束后分別 執(zhí)行,這兩個(gè)方法在OutPutCommitter中(默認(rèn)是FileOutputCommiter),setupjob()創(chuàng)建輸出目錄和任務(wù)的臨時(shí)工作目錄诗茎, cleanupjob刪除臨時(shí)工作目錄
- heartbeat(returns task)
? -->TaskTracker運(yùn)行一個(gè)簡單的循環(huán)來定期發(fā)送心跳給JobTasker."心跳"告知JobTracker,tasktacker是否還存活工坊,同時(shí)也充當(dāng)著兩 者 之間的消息通道,作為心跳的一部分敢订,tasktracker 還會(huì)指明他自己是否準(zhǔn)備好運(yùn)行下一次任務(wù),如果是罢吃,jobtracker會(huì)為他分 配一 個(gè)新的任務(wù)楚午,并通過心跳的返回值與tasktracker進(jìn)行通信
? -->每個(gè)tasktracker會(huì)有固定的map和reduce任務(wù)槽,數(shù)量由tasktracker核的數(shù)量和內(nèi)存的大小來決定尿招,jobtracker會(huì)先將 tasktracker的所有map槽填滿矾柜,然后再填reduce槽
? -->jobtracker分配map任務(wù)時(shí)阱驾,會(huì)選取與輸入分片最近的tasktracker,分配reduce任務(wù)用不著考慮數(shù)據(jù)本地化怪蔑。
- retrieve job resources
? -->通過從共享文件系統(tǒng)把作業(yè)的JAR文件復(fù)制到tasktracker所在的文件系統(tǒng)里覆,從而實(shí)現(xiàn)作業(yè)的jar文件本地化,同時(shí) tasktracker將 應(yīng)用程序所需要的全部文件從分布式緩存復(fù)制到本地磁盤缆瓣。
? -->tasktracker為任務(wù)新建一個(gè)本地工作目錄喧枷,并把jar文件中的內(nèi)容解壓到這個(gè)文件夾下
- launch(發(fā)起)
? Tasktracker新建一個(gè)TaskRunner實(shí)例來運(yùn)行該任務(wù)
- run
? TaskRunner啟動(dòng)一個(gè)新的JVM來運(yùn)行每個(gè)任務(wù),以便客戶的map/reduce不會(huì)影響到tasktracker