hadoop培訓課程:mapreduce環境、原理、架構及操作
1、環境說明
hadoop搭建環境:
l 虛擬機器作業系統: centos6.6 64位,單核,1g記憶體
l jdk:1.7.0_55 64位
l hadoop:1.1.2
2、mapreduce原理
2.1 mapreduce簡介
mapreduce 是現今乙個非常流行的分布式計算框架,它被設計用於平行計算海量資料。第乙個提出該技術框架的是google 公司,而google 的靈感則來自於函式式程式語言,如lisp,scheme,ml 等。mapreduce 框架的核心步驟主要分兩部分:map 和reduce。當你向mapreduce 框架提交乙個計算作業時,它會首先把計算作業拆分成若干個map 任務,然後分配到不同的節點上去執行,每乙個map 任務處理輸入資料中的一部分,當map 任務完成後,它會生成一些中間檔案,這些中間檔案將會作為reduce 任務的輸入資料。reduce 任務的主要目標就是把前面若干個map 的輸出彙總到一起並輸出。從高層抽象來看,mapreduce的資料流圖如下圖所示:
2.2 mapreduce流程分析
2.2.1 map過程
1. 每個輸入分片會讓乙個map任務來處理,預設情況下,以hdfs的乙個塊的大小(預設為64m)為乙個分片,當然我們也可以設定塊的大小。map輸出的結果會暫且放在乙個環形記憶體緩衝區中(該緩衝區的大小預設為100m,由io.sort.mb屬性控制),當該緩衝區快要溢位時(預設為緩衝區大小的80%,由io.sort.spill.percent屬性控制),會在本地檔案系統中建立乙個溢位檔案,將該緩衝區中的資料寫入這個檔案;
2. 在寫入磁碟之前,執行緒首先根據reduce任務的數目將資料劃分為相同數目的分割槽,也就是乙個reduce任務對應乙個分割槽的資料。這樣做是為了避免有些reduce任務分配到大量資料,而有些reduce任務卻分到很少資料,甚至沒有分到資料的尷尬局面。其實分割槽就是對資料進行hash的過程。然後對每個分割槽中的資料進行排序,如果此時設定了combiner,將排序後的結果進行combia操作,這樣做的目的是讓盡可能少的資料寫入到磁碟;
3. 當map任務輸出最後乙個記錄時,可能會有很多的溢位檔案,這時需要將這些檔案合併。合併的過程中會不斷地進行排序和combia操作,目的有兩個:
l儘量減少每次寫入磁碟的資料量
l儘量減少下一複製階段網路傳輸的資料量。最後合併成了乙個已分割槽且已排序的檔案。為了減少網路傳輸的資料量,這裡可以將資料壓縮,只要將mapred.compress.map.out設定為true就可以了
4. 將分割槽中的資料拷貝給相對應的reduce任務。有人可能會問:分割槽中的資料怎麼知道它對應的reduce是哪個呢?其實map任務一直和其父tasktracker保持聯絡,而tasktracker又一直和jobtracker保持心跳。所以jobtracker中儲存了整個集群中的巨集觀資訊。只要reduce任務向jobtracker獲取對應的map輸出位置就可以了。
2.2.2 reduce過程
1. reduce會接收到不同map任務傳來的資料,並且每個map傳來的資料都是有序的。如果reduce端接受的資料量相當小,則直接儲存在記憶體中(緩衝區大小由mapred.job.shuffle.input.buffer.percent屬性控制,表示用作此用途的堆空間的百分比),如果資料量超過了該緩衝區大小的一定比例(由mapred.job.shuffle.merge.percent決定),則對資料合併後溢寫到磁碟中;
2. 隨著溢寫檔案的增多,後台執行緒會將它們合併成乙個更大的有序的檔案,這樣做是為了給後面的合併節省時間。其實不管在map端還是reduce端,mapreduce都是反覆地執行排序,合併操作;
3. 合併的過程中會產生許多的中間檔案(寫入磁碟了),但mapreduce會讓寫入磁碟的資料盡可能地少,並且最後一次合併的結果並沒有寫入磁碟,而是直接輸入到reduce函式。
2.3 mapreduce工作機制剖析
1.在集群中的任意乙個節點提交mapreduce程式;
2.jobclient收到作業後,jobclient向jobtracker請求獲取乙個job id;
3.將執行作業所需要的資源檔案複製到hdfs上(包括mapreduce程式打包的jar檔案、配置檔案和客戶端計算所得的輸入劃分資訊),這些檔案都存放在jobtracker專門為該作業建立的資料夾中,資料夾名為該作業的job id;
4.獲得作業id後,提交作業;
5.jobtracker接收到作業後,將其放在乙個作業佇列裡,等待作業排程器對其進行排程,當作業排程器根據自己的排程演算法排程到該作業時,會根據輸入劃分資訊為每個劃分建立乙個map任務,並將map任務分配給tasktracker執行;
6.對於map和reduce任務,tasktracker根據主機核的數量和記憶體的大小有固定數量的map槽和reduce槽。這裡需要強調的是:map任務不是隨隨便便地分配給某個tasktracker的,這裡有個概念叫:資料本地化(data-local)。意思是:將map任務分配給含有該map處理的資料塊的tasktracker上,同時將程式jar包複製到該tasktracker上來執行,這叫「運算移動,資料不移動」;
7.tasktracker每隔一段時間會給jobtracker傳送乙個心跳,告訴jobtracker它依然在執行,同時心跳中還攜帶著很多的資訊,比如當前map任務完成的進度等資訊。當jobtracker收到作業的最後乙個任務完成資訊時,便把該作業設定成「成功」。當jobclient查詢狀態時,它將得知任務已完成,便顯示一條訊息給使用者;
8.執行的tasktracker從hdfs中獲取執行所需要的資源,這些資源包括mapreduce程式打包的jar檔案、配置檔案和客戶端計算所得的輸入劃分等資訊;
9.tasktracker獲取資源後啟動新的jvm虛擬機器;
10. 執行每乙個任務;
hive架構原理簡析 mapreduce部分
整個處理流程包括主要包括,語法解析 抽象語法樹,ast,採用antlr 語義分析 sematic analyzer生成查詢塊 邏輯計畫生成 op tree 邏輯計畫優化,物理計畫生成 task tree 以及物理計畫執行組成。下面這張圖 不知道是誰畫的 簡要的說明了整個處理的流程 這裡重點說一下物理...
hive架構原理簡析 mapreduce部分
整個處理流程包括主要包括,語法解析 抽象語法樹,ast,採用antlr 語義分析 sematic analyzer生成查詢塊 邏輯計畫生成 op tree 邏輯計畫優化,物理計畫生成 task tree 以及物理計畫執行組成。下面這張圖 不知道是誰畫的 簡要的說明了整個處理的流程 這裡重點說一下物理...
hive架構原理簡析 mapreduce部分
整個處理流程包括主要包括,語法解析 抽象語法樹,ast,採用antlr 語義分析 sematic analyzer生成查詢塊 邏輯計畫生成 op tree 邏輯計畫優化,物理計畫生成 task tree 以及物理計畫執行組成。下面這張圖 不知道是誰畫的 簡要的說明了整個處理的流程 這裡重點說一下物理...