maptask 工作過程
由程式內的inputformat來讀取外部的資料,呼叫recordreader的read方法來讀取並,返回(k,v)鍵值對
讀取的(k,v)鍵值對,傳送給map()方法,作為其傳入引數來執行使用者自定義的map邏輯。
context.write方法被呼叫時,outputcollector元件會將map()方法的輸出結果寫入到環形緩衝區
環形緩衝區就是乙個環形陣列,後端不斷接收資料的同時,前端不斷的溢位資料,長度用完後讀取的新資料再從前端開始覆蓋。這個緩衝區的預設size=100m,可以通過mr.sort.mb配置
spiller元件會從環形緩衝區溢位檔案,這個過程會按照定義的partitioner分割槽(預設的是hashpartition),並且按照key.compareto進行排序,如果有combiner也會執行combiner。spiller的不斷工作,會溢位形成很多小檔案(預設達到設定的80%時),會在本地建立溢位檔案
小檔案執行merge(合併),形成分割槽且區內排序
reduce會根據自己的分割槽,去所有map task中讀取相對應的資料
reduce task工作過程
reduce會從個個maptask上遠端複製一片資料,並針對某一片資料,如果大小超過一定的閾值,則會寫到磁碟上,否則直接放到記憶體中。
通過groupingcomparator()分辨同一組的資料,把他們傳送給reduce(k, iterator)方法(多個資料合成一組時,只取其中第乙個key)
呼叫context.write方法,會讓outputformat呼叫recordwriter的write()方法將處理結果寫入到資料倉儲,每乙個maptask對應乙個分割槽檔案。
mapreduce工作過程中,map階段處理的的資料如何傳遞給reduce階段,shuffle會將maptask輸出的處理結果資料分發給reducetask,並在分發的過程中,對資料按照key進行分割槽和排序。
小檔案處理的弊端:
解決方法
資料傳輸的io問題:
每乙個map可能會有多個spill檔案需要寫入磁碟,產生較多的磁碟io
資料量很小,但是map和reduce任務很多時,產生較多得到網路io
map端溢位spill檔案後,進行分割槽排序後,會執行combiner函式。
多個spill檔案合併成乙個大檔案時,會使用
在reduce任務端,複製map輸出,在合併後溢位到磁碟時,也會執行combiner函式
自定義分割槽函式,讓key值較為均勻的分布在reduce上
對map端進行壓縮處理
使用combiner函式
有四個階段可以進行效能調優:
hashMap hashtable知識點總結
a hashmap實際上是乙個 鍊錶雜湊 的資料結構,即陣列和鍊錶的結合體。hashmap的底層結構是乙個陣列,陣列中的每一項是一條鍊錶。b hashmap的例項有倆個引數影響其效能 初始容量 和 裝填因子。c hashmap實現不同步,執行緒不安全。hashtable執行緒安全 d hashmap...
Se Map Proxy Symbol知識點總結
se map proxy symbol總結 是es6中新增的乙個資料結構。可以理解為乙個內容不可重複的陣列 初始化 常用方法和屬性 add item 用於向set物件內新增一項 item 被新增的項 注 如果新增的是已經存在的內容 則新增失敗 var set new set 0,1,2,3,set....
Robotframework變數知識點總結
目錄 scarlar變數 變數使用 list變數 變數使用 list 元素的使用 變數轉換 其他變數 變數檔案 一,變數與常量 變數都用表示。變數主要有兩類 scalar類和list類。scalar 類表示為 list類表示為 rf的底層語法是python,所以不需要特別宣告變數,只需要進行初始化賦...