基于Hadoop的日志分析系統的設計與實現_宋愛青.caj
//
由多個任務的作業處理流程如下圖所示,從圖中我們可以看出,每一個
任務的輸入都是由多個任務的輸出組成,這就是為什么要將map和
reduce之間的【數據流】稱為【shuffle(洗牌)】的原因。實際的要遠比圖中顯示的復雜很
多,并且的不同對于作業總得執行時間也有很大的影響。
過程
收到任務的將會讀取所需的數據,從數據中解析出,然
后經過函數處理后存入本地磁盤,【map函數的輸出數據存放的位置等信息將會被回傳給master】, 再由通知執行任務的。
基于Hadoop_Hive的海量web日志處理系統的設計與實現_劉永增.caj
//編程模型
MapReduce是一種編程模型,通過將一個大的任務分解成獨立的幾個【任務集】合,并行處理【大規模數據集】。
程序用來并行地處理大規模數據。這就需要將一個任務劃分到大量的不
同的機器中去。在這種模型中,不允許執行任務的各組件之間共享數據,否則,這種模
型就不能擴展到大規模的集群中去。【組件間的通信】只有在產生新的輸出鍵值對的時候進行,此時,將這些輸出轉交到下一個執行的階段。
處理任務的涉及到的主要操作有
①鏈表處理
簡單來說,程序的作用是將由輸入數據元素組成的【鏈表轉換】成輸出數據元素組成的鏈表。會將這個過程重復做兩次,不同的是兩次
的術語不同,第一次叫做即Map、第二次叫做Reduce。
②鏈表處理的過程工作的第一個階段叫做,在這
個階段中,一個稱作的函數將輸入元素鏈表中的每一個元素轉化成一個相應的
輸出元素。如圖所示。
③鏈表的處理過程可以把輸入元素的值按照某種【規則聚集】起
來。在這一階段中,一個稱為的函數接受來自輸入鏈表元素值的【迭代器】。然后將這些值按照某種【規則合并】,最終返回一個單一的輸出值。如圖所示。
//
②根據keys劃分reduce空旬
在中,并不是將所有值進行。只是把所有那些
具有相同的值進行。并且,處理不同的之間是相互獨立的。也
就是說,在中,每一個分別處理的是擁有相同的“鍵”的
“值”。如圖所示。
//p19
從圖中我們可以看到的輸入來自于已經導入到集群中的文件。
這些文件均勻分布在所有節點中。
運行一個程序會首先在部分或者所有節點中運行任務。所有
任務都是等價的。每個任務都不會與其他交換信息、,也不會
意識到其他的存在。
階段完成后,節點之間產生的【中間鍵值對可能會進行互相交換,將擁有相
同的值提交到同一個】。整個過程中,【節點之間的互相通信】就僅
可能在這一步發生。與任務一樣,任務也不會與其他任務互相通信。通過【自動完成數據轉移】和重啟失敗節點上的仟務來保證仟
務執行的可靠性。
圖中“重組”(shuffle)的作用是當一個任務完成后,雖然仍可能繼續執行
交給它的后續其他任務。但是,它們也開始互相交換任務產生的中間輸出,把每個
輸出交到恰當的中去。這就是所謂的“重組”。生成的中間鍵值對空間中,鍵
不同的子集被賦給不同的節點,這些子集,即是所謂的“劃分”(partition)。
單個節點上的中間鍵的集合在傳送到之前會由框架進行自動
的排序(sort)。
//
除此之外,框架為了提高系統的性能還支持許多其他的優化措
施。
①組合器組合器處于之后,之前用來優化。
會接收給定節點上實例產生的數據作為輸入。在這種情況下,
的輸入就是的輸出,而不是的輸出了。
②容錯提供高容錯性的主要方式是通過任務重啟的方
式。每個稱作的任務節點不斷的與系統中的任務調度節點進行
通信。如果一個在一定的時間內默認是分鐘沒有與進行通信,
會認為該由于某種原因而崩潰了。
如果一個正處于階段時節點失效,那么其他會被要求重
新執行失敗節點上的所有的任務。如果處于階段失效,那么其他
會被要求重新執行失敗節點中失效時正在執行的所有任務。
③推測執行組成集群的機器參差不齊,有的節點機器性能
高一些,而有的節點機器性能弱一點。此時,框架可能遇到的一個
問題是,由于將任務劃分到了不同的節點上,那么有些節點因為執行緩慢而使整個程序
執行的速率降下來了。
通過稱作推測執行的方式來解決這一問題。同一份輸入可能被
多次平行的執行,以利用不同機器的執行任務的不同能力。當一個的大部分任務即
將結束的時候,將調度剩余任務的副本到那些空閑的節點上去。當任務完成的
時候,它們會將這一事實通知。不論任務的哪一個副本首先完成,它將會成
為最終的副本,。如果其他任務正在推測執行,將告訴放棄這些任
務并丟棄它們的輸出。最后,會從首先執行成功的即獲取輸入。