MR Shuffle個人理解

2021-08-19 10:20:48 字數 851 閱讀 3409

(嘿嘿嘿,不考慮閱讀效果了)

shuffle分為map端shuffle和reduce端shuffle。

map端並不是處理一點寫一點,而是先將處理的資料寫入到環形緩衝區,緩衝區預設大小為100m,閾值預設為0.8,也就是說當閾值達到0.8即80m時,開始將資料以輪詢方式寫入到本地spll磁碟。如果緩衝區寫入資料達到100m時,則將map暫時阻塞,等待緩衝區寫出。在緩衝區寫到磁碟前,先將其資料按照reduer來分割槽,並且對分割槽的資料進行一次內排序,僅對分區內排序。如果有combiner,則將相同key的進行合併,減小寫入磁碟資料的大小,和磁碟的io消耗。由於每次緩衝區spill溢寫都會生成乙個spill檔案,map端的最後還要對這些spill進行合併,合併為乙個已知分割槽已排序的檔案,從map端到reduce端可以採用一種壓縮速率較快的壓縮方式,進行壓縮,這樣會提高速度以此map端結束

reduce端 reduce端第乙個操作就是複製操作,少量複製執行緒並行的將存在於磁碟的檔案複製到reduce的jvm記憶體或者磁碟中。如果map輸出資料不多,則直接複製到jvm記憶體中,如果很大,則可以寫到磁碟中。reduce通過心跳機制知道在map端的輸出資料在**。這個操作並不是在所有map結束才開始進行,而是由乙個引數掌控,reduce端記憶體緩衝區達到閾值或者達到map輸出閾值,則合併溢寫到磁碟中,當檔案數的增多,後台執行緒自動的對檔案先進行一次合併合併為更大的以排序的檔案。當然如果設定了壓縮,會在記憶體中解壓縮,然後再合併。複製階段到此結束。下一步時合併階段,根據合併因子,將檔案合併,例如合併因子為10,檔案數為50,則結果為5個檔案,但真實並不是每次十個那樣子有規律的合併,而是相對以一種優化的方式,儘量減少寫入到磁碟的資料量。最後一次合併是直接寫到reduce階段。reduce階段就是函式對資料的處理,最後直接寫到hdfs中或者輸出。

GRASP個人理解

這裡是一篇比較全面的概覽 個人比較注重 開閉原則 對擴充套件開發對修改關閉 變與不變的分離 將變化的部分和不變的部分分開 組合 聚合復用原則 盡量使用類的組合復用,不要使用繼承 還有即使高內聚低耦合 實際上著名的gof模式也不盡都對這些原則遵循的很好,如訪問者模型,將原被訪問者的部分內部邏輯分離出去...

ThreadLocal個人理解

為了加深理解,將最近對threadlocal的了解和原始碼分析記錄總結一下。threadlocal可以為執行緒提供區域性變數。使用threadlocal的get 方法,可以在當前執行緒能夠訪問的類和方法中,得與當前執行緒相關聯的變數值。不過,執行緒區域性變數並不是由threadlocal物件儲存維護...

JavaScript this個人理解

一.呼叫公共函式,this預設指向的為window 直接上幾個 1.var a 10 function test test 結果10 2.var a 10 function test function test1 test 結果 10 10 3.var a 10 function test test...