
MapReduce 角色
•Client :做業提交發起者。
•JobTracker: 初始化做業,分配做業,與TaskTracker通訊,協調整個做業。
•TaskTracker:保持JobTracker通訊,在分配的數據片斷上執行MapReduce任務。
提交做業
•在做業提交以前,須要對做業進行配置
•程序代碼,主要是本身書寫的MapReduce程序。
•輸入輸出路徑
•其餘配置,如輸出壓縮等。
•配置完成後,經過JobClinet來提交
做業的初始化
•客戶端提交完成後,JobTracker會將做業加入隊列,而後進行調度,默認的調度方法是FIFO調試方式。
任務的分配
•TaskTracker和JobTracker之間的通訊與任務的分配是經過心跳機制完成的。
•TaskTracker會主動向JobTracker詢問是否有做業要作,若是本身能夠作,那麼就會申請到做業任務,這個任務可使Map也多是Reduce任務。
任務的執行
•申請到任務後,TaskTracker會作以下事情:
•拷貝代碼到本地
•拷貝任務的信息到本地
•啓動JVM運行任務
狀態與任務的更新
•任務在運行過程當中,首先會將本身的狀態彙報給TaskTracker,而後由TaskTracker彙總告之JobTracker。
•任務進度是經過計數器來實現的。
做業的完成
•JobTracker是在接受到最後一個任務運行完成後,纔會將任務標誌爲成功。
•此時會作刪除中間結果等善後處理工做。
第二部分:錯誤處理
任務失敗
•MapReduce在設計之出,就假象任務會失敗,因此作了不少工做,來保證容錯。
•一種狀況: 子任務失敗
•另外一種狀況:子任務的JVM忽然退出
•任務的掛起
TaskTracker失敗
•TaskTracker崩潰後會中止向Jobtracker發送心跳信息。
•Jobtracker會將該TaskTracker從等待的任務池中移除。並將該TaskTracker上的任務,移動到其餘地方去從新運行。
•TaskTracker能夠被JobTracker放入到黑名單,即便它沒有失敗。
JobTracker失敗
•單點故障,Hadoop新的0.23版本解決了這個問題。
第三部分:做業調度
FIFO
Hadoop 中默認的調度器,它先按照做業的優先級高低,再按照到達時間的前後選 擇被執行的做業
公平調度器
爲任務分配資源的方法,其目的是隨着時間的推移,讓提交的做業獲取等量的集 羣共享資源,讓用戶公平地共享集羣。具體作法是:當集羣上只有一個任務在運行 時,它將使用整個集羣,當有其餘做業提交時,系統會將TaskTracker節點空間的時 間片分配給這些新的做業,並保證每一個任務都獲得大概等量的CPU時間。
容量調度器
支持多個隊列,每一個隊列可配置必定的資源量,每一個隊列採用 FIFO 調度策略,爲 了防止同一個用戶的做業獨佔隊列中的資源,該調度器會對同一用戶提交 的做業所 佔資源量進行限定。調度時,首先按如下策略選擇一個合適隊列:計算每一個隊列中正在運行的任務數與其應該分得的計算資源之間的比值,選擇一個該比值 最小的隊 列;而後按如下策略選擇該隊列中一個做業:按照做業優先級和提交時間順序選擇 ,同時考慮用戶資源量限制和內存限制。可是不可剝奪式
配置公平調度器
1.修改mapred-stie.xml 加入以下內容
<property>
<name>mapred.jobtracker.taskScheduler</name>
<value>org.apache.hadoop.mapred.FairScheduler</value>
</property>
<property>
<name>mapred.fairscheduler.allocation.file</name>
<value>/opt/hadoop/conf/allocations.xml</value>
</property>
<property>
<name>mapred.fairscheduler.poolnameproperty</name>
<value>pool.name</value>
</property>
2 . 在 Hadoop conf 下建立
allocations.xml
內容爲
<?xml version="1.0"?>
<alloctions>
</alloctions>
樣例:
<pool name="sample_pool">
<minMaps>5</minMaps>
<minReduces>5</minReduces>
<weight>2.0</weight>
</pool>
<user name="sample_user">
<maxRunningJobs>6</maxRunningJobs>
</user>
<userMaxJobsDefault>3</userMaxJobsDefault>
3. 重啓 JobTracker
4. 訪問 http://jobTracker:50030/scheduler , 查看 FariScheduler 的 UI
5 . 提交任務測試
第四部分:Shuffle與排序
Mapreduce 的 map 結束後,把數據從新組織,做爲 reduce 階段的輸入,該過程稱 之爲 shuffle--- 洗牌。
而數據在 Map 與 Reduce 端都會作排序。
Map
• Map 的輸出是由collector控制的
• 咱們從collect函數入手
Reduce
•reduce的Shuffle過程,分紅三個階段:複製Map輸出、排序合併、reduce處理。
•主要代碼在reduce的 run函數
Shuffle優化
•首先Hadoop的Shuffle在某些狀況並非最優的,例如,若是須要對2集合合併,那麼其實排序操做時不須要的。
•咱們能夠經過調整參數來優化Shuffle
•Map端
•io.sort.mb
•Reduce端
•mapred.job.reduce.input.buffer.percent
第五部分:任務的執行時的一些特有的概念
推測式執行
•每一道做業的任務都有運行時間,而因爲機器的異構性,可能會會形成某些任務會比全部任務的平均運行時間要慢不少。
•這時MapReduce會嘗試在其餘機器上重啓慢的任務。爲了是任務快速運行完成。
•該屬性默認是啓用的。
JVM重用
•啓動JVM是一個比較耗時的工做,因此在MapReduce中有JVM重用的機制。
•條件是統一個做業的任務。
•能夠經過mapred.job.reuse.jvm.num.tasks定義重用次數,若是屬性是-1那麼爲無限制。
跳過壞記錄
•數據的一些記錄不符合規範,處理時拋出異常,MapReduce能夠講次記錄標爲壞記錄。重啓任務時會跳過該記錄。
•默認狀況下該屬性是關閉的。
任務執行環境
•Hadoop爲Map與Reduce任務提供運行環境。
•如:Map能夠知道本身的處理的文件
•問題:多個任務可能會同時寫一個文件
•解決辦法:將輸出寫到任務的臨時文件夾。目錄爲:{mapred.out. put.dir}/temp/${mapred.task.id}
第六部分:MapReduce的類型與格式
類型
•MapReduce的類型 使用鍵值對做爲輸入類型(key,value)•輸入輸出的數據類型是經過輸入輸出的格式進行設定的。
輸入格式
•輸入分片與記錄
•文件輸入
•文本輸入
•二進制輸入
•多文件輸入
•數據庫格式的輸入
輸入分片與記錄
•Hadoop經過InputSplit表示分片。
•一個分片並非數據自己,而是對分片數據的引用。
•InputFormat接口負責生成分片
<ignore_js_op>
文件輸入
•實現類:FileInputFormat
•經過文件做爲輸入源的基類。
•四個方法:
•addInputPath()
•addInputPaths()
•setInputPath()
•setInputPaths()
•FileInputFormat會按HDFS塊的大小來分割文件
•避免分割
•繼承FileInputFormat 重載isSplitable()
•return false
文本輸入
•實現類:TextInputFormat
•TextInputFormat 是默認的輸入格式。
•包括:
•KeyValueTextInputFormat
•NLineInputFormat
•XML
•輸入分片與HDFS塊之間的關係
•TextInputFormat的某一條記錄可能跨塊存在
二進制輸入
•實現類:SequenceFileInputFormat
•處理二進制數據
•包括:
•SequenceFileAsTextInputFormat
•SequenceFileAsBinaryInputFormat
多文件輸入
•實現類:MultipleInputs
•處理多種文件輸入
•包括:
•addInputPath
數據庫輸入
•實現類:DBInputFormat
•注意使用,由於鏈接過多,數據庫沒法承受。
輸出格式
•文本輸出
•二進制輸出
•多文件輸出
•數據庫格式的輸出
文本輸出
•實現類:TextOutputFormat
•默認的輸出方式
• 以 "key \t value" 的方式輸出
二進制輸出
•基類: SequenceFileOutputFormat
•實現類: SequenceFileAsTextOutputFormat
MapFileOutputFormat
SequenceFileAsBinaryOutputFormat
多文件輸出
•MutipleOutputFormat•MutipleOutputs
•二者的不一樣在於MutipleOutputs能夠產生不一樣類型的輸出
數據庫格式輸出• 實現類 DBOutputFormat