大資料之hadoop分散式計算框架MapReduce
一、MapReduce構成
MapReduce分為兩部分,即map和reduce。 其中map是入隊(key,value),reduce則是聚合(計算)。 map過程的輸出時reduce過程的輸入。 需要注意的是這裡map中的key是可以重複的,reduce做聚合的時候可以把相同的key放到同一組裡,做聚合運算。
二、MapReduce原理分析
map過程:
上圖左側是map的task,其中一個split可以可看成一個maptask(jvm程序),那麼多個jvm程序就可以在叢集中分發到各個服務節點上計算,實現平行計算。
split是資料切割的過程,切割的結果輸出給map,預設情況下切割是以行為單位的。每讀一行呼叫一次map方法。(切割是可以人為干預的,可以依次切割多行,也可以一次只切割一個單詞)
map則是用來設定鍵值對,在這裡可以參考關係型資料庫中每一行資料中的每個值都有對應的欄位,key即欄位,值即value。這裡map的key要靈活應用,按照mapreduce的原語來定義,利用其特性。 split是讀資料,map是根據需求加工資料。
Map計算完成後會生成一個檔案儲存在本機的磁碟中。磁碟中直接建立好分割槽索引,reduce讀取的時候可以直接重分割槽中讀取。之所以採用分割槽是因為若每生成一組鍵值對就要用io向磁碟輸出內容,這樣會導致io頻率過大,影響效率,所以這裡用了一個記憶體緩衝區,將生成的鍵值對先放到緩衝區裡,在放置的過程同時做了按key排序(在記憶體中做排序效率很高)。當資料達到定量的標準就會產生一次溢寫io,將內容寫到磁碟生成一個檔案,這樣能大大減少了與磁碟互動的頻率,提升了整體計算的效率。
reduce過程
reduce是根據加工好的資料來計算資料。 由於map的過程中已經做了排序,那麼reduce在讀取資料的時候key已經是有序的了,reduce讀取資料的時候將相同的key放在一組(因為有序,所以在分割槽裡只要找到相同的key效率很高,不用做全文檢索。)
然後reduce對key相同的鍵值對進行計算,得出我們想要的結果。 最後將結果寫入hdfs指定的輸出路徑或者寫入資料庫。
三、MapReduce簡單案例
這是一個典型的wordcount案例,就是計算單詞重複的次數。 第一步,split切片,這裡定義了三個分割槽,這樣有三個節點並行做map計算,將整個文件切成三行輸入到map,map的key為單詞,value為1 第二步