mapreduce是一種程式設計模型,用於大規模資料集的並行運算. 概念 map(對映)和 reduce(歸約), 是他們的主要思想,它極大方便了程式設計人員在不會分
傳送到同乙個reduce上,進行合併處理).
那麼這個mapreduce程式設計模型究竟是怎麼樣的呢? 他實際上說了這樣的乙個事兒:已知手頭上有許許多多(成萬上億)pc機,現在有乙個複雜的任務,
需要處理海量的資料,資料在**呢? 資料實際上是隨機的儲存於這些個pc機器上,我們不需要統一地將資料一起存到乙個超大的硬碟上,資料可
以據可以直接散布在這些個pc上,這些pc自身不僅是許許多多個處理器,也是許許多多個小硬碟.
這些pc機器分為三類,第一類稱為master,master是負責排程的,相當於工地的工頭,第二類叫worker,相當於幹活的工人. woker進一步分為兩
包括任務時間,任務出錯情況等等.
再舉個例子來說,統計一系列文件中的詞頻,文件數量規模很大,有1000萬個文件,英文單詞的總數可能只有3000。 那麼input就為10000000,
後和詞表中前30個詞彙相關的中間結果都傳給這個reducer做最終的處理分析,至此mapreduce最核心的流程已經說明白了.
其實mapreduce講的就是分而治之的程式處理理念,把乙個複雜的任務劃分為若干個簡單的任務來做,另外,就是程式的排程問題,那些任務給那些
一切都是從最上方的user program開始的,user program鏈結了mapreduce庫,實現了最基本的map函式和reduce函式.
圖中執行的順序都用了數字
標記了.
1.mapreduce庫先把user program的輸入檔案劃分為m份,每乙份通常有16mb到64mb,如圖所示最左邊的split0~4;
然後使用fork將使用者僅此拷貝至集
群內其他機器上.
2.user program的副本中有乙個稱為master,其餘稱為worker,master是負責排程的,為空閒worker分配作業(map作業或者reduce作業)
,worker的
數量也是有使用者指定的
3.被分配了map作業的worker,開始讀取對應分片的輸入資料,map作業數量由m決定,和split一一對應; map作業從輸入資料中抽取出鍵值
對,每一
4.喚醒緩衝區的中間鍵值對會定期寫入本地磁碟當中,並且被分為r個區,r的大小是由使用者定於的,將來每乙個區會對應乙個reduce作業;這些中間
鍵值對的位置會通報給master,master負責將資訊**給reduce worker.
5.master通知分配了reduce作業的worker它負責的分割槽在什麼位置(肯定不止乙個地方,每乙個map作業產生的中間鍵值對都可能對映到所有r
個不同分割槽),當reduce worker把它負責的中間鍵值對都讀過來後,先對他們進行排序,使得相同鍵的鍵值對聚集在一起. 因為不同的鍵可能
會對映到同
一分割槽也就是同乙個reduce作業,所以排序是必須的.
6.reduce worker遍歷排序後的中間鍵值對,對於每個唯一的鍵,都將鍵與關聯的值傳遞給reduce函式,reduce函式產生的輸出會添
加到這個
分割槽的輸出檔案中
7.當所有的map和reduce作業都完成了,master喚醒正版的user program,mapreduce函式呼叫返回user program**.
所有執行完畢後,mapreduce輸出放在了r個分割槽的輸出檔案中,使用者通常並不需要合併這r個檔案,而是將其作為輸入交給另乙個maoreduce程式處
理. 整個過程中,輸入資料是來自底層分布式檔案系統的,中間資料是放在本地檔案系統的,最終輸出資料是寫在底層分布式檔案系統的,而且我
們要注意map/reduce作業和map/reduce函式的區別: map作業處理乙個輸入資料的分片,可能需要呼叫多次map函式來處理每乙個輸入鍵值對,
reduce作業處理乙個分割槽的中間鍵值對,期間要對每個不同的鍵呼叫一次reduce函式,reduce作業最終也對應乙個輸出檔案.
mapreduce其實是分治演算法的一種實現,所謂分支演算法就是"分而治之",將大的問題分解成相同型別的子問題(最好具有相同的規模),對子問題進行
求解,然後合併成大問題的解. mapreduce就是分治法的一種,將輸入進行分片,然後交給不同的task進行處理,然後合併成最終的解,
mapreduce實際的處理過程可以理解為input->map->sork->combine->partition->reduce->output
format等可以使用
2.map階段對輸入的key,value進行處理,既map(k1,v1) -> list(k2,v2),
4.combine階段對sort之後又想用key的結果進行合併
7.output階段, reduce輸出資料的格式.
1.每乙個map可能會產生大量的輸出,combiner的作用就是在map端對輸出先做一次合併,以減少傳輸到reducer的資料量,因為從map端對輸出先做一
次合併,以減少傳輸到reduce的資料量,因為map端到reduce端會涉及到網路io
2.combiner最基本就是實現本地key的歸併,combiner具有類似本地的reduce功能,合併相同的key對應的value,通常與reduce邏輯一樣.
3.如果不用combiner,那麼所有的結果都是reduce完成,效率會相對低下,使用combiner,先完成的map會在本地聚合,提公升速度.
系統執行排序的過程,稱為shuffle,既這張圖主要是對shuffle過程的描述,shuffle的是mapreduce的心臟,shuffle的主要工作就是從map結束
到reduce開始之間的過程. 首先看下這張圖,就能夠理解shuffle所處的位置。 圖中的partitions,copy phase,sort phase所代表的就是shuffle的
不同階段,也可以這樣理解,shuffle描述著資料從map task輸出到reduce task輸入的這段過程.
map端的shuffle細節:
1.在map task執行時,它的輸入資料**於hdfd的block(map函式產生輸出時,利用緩衝的方式寫入記憶體,並出於效率考慮的方式進行預排序. 如上
圖。 此處預設的記憶體大小100m,可通過io.sort.mr來設定,當此緩衝變成80%的時候,乙個後台執行緒就會將內容寫入磁碟,在寫入磁碟之前,執行緒
首先根據最終要傳的reduce把這些資料劃分成相應的分割槽,在每個分割槽當中,後台執行緒進行內排序,如果有combine,就會在排序後的分區內執行)
partition的作用.接下來,需要將資料寫入記憶體緩衝區中,緩衝區的作用是批量收集map的結果,減少磁碟io的影響.key/value對以及partition的
結果都會被寫入緩衝區,當然寫入之前,key與value值都會被序列化成位元組數目. reduce task在執行之前的工作就是不斷地拉取當前job裡面每一
個map task的最終結果,然後將不同地方拉取過來的資料不斷地進行merge,也最終形成了乙個檔案作為reduce task的輸入檔案.
map的結果,會通過partition分發到reduce上,reducer做完reduce操作後,通過outputformat,進行輸出. partition是分割map上每個節點的結果
理的鍵值對.
應的reducer.這樣保證如果有相同的key值,肯定會被分配到同乙個reduce上. 如果有n個reducer,編號就為0,1,2,3....(n-1).
參照資料:
大資料處理
大資料處理的流程主要包括以下四個環節 採集 匯入 預處理 統計 分析 挖掘,下面針對這四環節進行簡單闡述。大資料處理之一 採集 在大資料的採集過程中,其主要特點和挑戰是併發數高,因為同時有可能會有成千上萬的使用者來進行訪問和操作,比如火車票售票 和 它們併發的訪問量在峰值時達到上百萬,所以需要在採集...
大資料處理隨筆
1.mssql當資料庫資料超過1000萬的時候超時是正常的,所以當表資料到1000萬時候注意delete 2.今天遇到資料庫時間格式2014021000 當然是int型別哦 3.聯合索引使用 開始時間與結束時間這樣一起查詢的要建成索引 4.訂閱資料庫,只可以查詢操作,這樣的話可以在這個表上面建立索引...
大資料處理方案
假設目前有一千萬個記錄 這些查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。乙個查詢串的重複度越高,說明查詢它的使用者越多,也就是越熱門。請你統計最熱門的10個查詢串,要求使用的記憶體不能超過1g。2 32為40億多,所以給定乙個數可能在,也可能不在其中 這裡我們把40億個...