首先我們來思考下,當計算機集群在計算時,往往會遇到哪些的問題呢?
1.高故障率
1000臺伺服器的集群 => 平均故障率 1 次/天
100萬台伺服器的集群 => 平均故障率 1000 次/天
故障率這麼高,如何保持資料的持續性,即在某些節點故障的情形下不影響依舊能夠使用資料?
在執行時間較長的集群運算中,如何應對節點故障呢?
2.網路頻寬瓶頸
如果網路頻寬 = 1 gbps ,那麼移動10tb 資料需要花費將近一天
3.分布式程式設計非常複雜
能否有乙個簡單的模型能夠隱去所有的複雜性?
map-reduce集群運算時問題的解決方案
1.在多節點上冗餘地儲存資料,以保證資料的持續性和一直可取性
2.將計算移向資料端,以最大程度減少資料移動
3.簡單的程式模型隱藏所有的複雜度
同時,我們也創造了分布式檔案儲存系統
以提供全域性的檔案命名空間,冗餘度和可獲取性
例如google 的 gfs; hadoop 的 hdfs
典型的應用場景與模式
超大級別的資料量(100gb到100tb級別),資料很少就地整個被替換;
最常見的操作為讀取和追加資料;
資料以「塊狀」形式在多台機器上儲存;
每個資料塊都會重複地在多台機器上儲存,保證資料的持續性和隨時可取性;
計算模型示例
假設我們手頭上有個超大的文字檔案,我們需要統計每個文字中的詞所出的次數
假設所有的詞和頻次對都超出了記憶體大小,無法一次性放入記憶體進行計算
我們使用linux命令:
words(doc.txt)| sort | uniq -c
其實這行**體現了mapreduce的精髓,我們來看一下:
words(doc.txt)| sort | uniq -c
words命令輸出乙個文字內容中所有詞,乙個一行對應map-reduce就是:sort是進行排序
uniq -c是去重並統計重複的數字
map
逐個檔案逐行掃瞄
掃瞄的同時抽取出我們感興趣的內容
(keys)group by key
排序和洗牌
reduce
聚合、總結、過濾或轉換
寫入結果
我們可以看到總體框架都和上述描述過程一致,只是map和reduce函式要根據具體問題具實現
所以在工程上,我們基本是寫map或者reduce,再寫個執行指令碼就行了
如果不理解linux,可以看看鳥哥的私房菜基礎版(廣告費麻煩結下!~!)
我們總結下總流程
1.首先是利用map函式讀取輸入文字,產生一系列的鍵值對
2.接下來是key-value,即將所有有相同key的鍵值對排在一起
3.最後輸出key-value,即把不同key的value加起來,就能最終的輸出結果,每個key的統計結果value
故障及處理
1.map任務節點故障
所有執行中和已經完成的map任務,都被重置為待初始
所有這些待初始map任務,將重新被分配到能工作的節點worker
2.reduce任務節點故障
只有執行中而未完成的reduce任務被設定為待初始。
這些待初始reduce任務被重新分配至其他worker
3.主節點故障
整個map-reduce任務中斷,同時通知客戶端管理員。
不多就這樣了,希望本文能夠幫到你!~!
Map集合排序 根據value對key進行排序
在流水的業務中,碼出最優雅的 描述 有若干個鍵值對格式的json字串,根據其中的value進排序,取出其中的排位靠前的一半以上的key值,json資料為 這是業務上的乙個需求,於是針對這個需求就有了對map的排序一系列探索 前言 對於json轉map本篇就不介紹,直接從對map的排序開始,其他型別可...
java json 根據 key排序
阿里的jsonobject內部是用hashmap來儲存的,所以輸出是按key的排序來的,如果要讓jsonobject按固定順序 put的順序 排列,可以修改jsonobject的定義hashmap改為linkedhashmap。public jsonobject 即定義jsonobject可以這樣 ...
Map排序(按key排序,按value排序)
主要分兩種,按鍵排序 按值排序。而且,按key排序主要用於treemap,而按value排序則對於map的子類們都適用。按key排序主要用於treemap,可以實現按照key值的大小,在物件插入時直接插入到合適的位置,保持map的順序性。來看treemap的建構函式 treemap comparat...