大資料問題一般解決方式:利用雜湊函式進行分流來解決記憶體限制或者其他限制的問題。
1. 雜湊函式又叫雜湊函式,雜湊函式的輸入域可以是非常大的範圍,但是輸出域是固定範圍。假設為s。
雜湊函式的性質:
1. 典型的雜湊函式都擁有無限的輸入值域。
2. 輸入值相同時 ,返回值一樣。
3. 輸入值不同時,返回值可能一樣,也可能不一樣。
4. 不同輸入值得到的雜湊值,整體均勻的分布在輸出域s上。(這是評價乙個雜湊函式優劣的關鍵)
不同輸入值得到的雜湊值越均勻分布在s上,該雜湊函式越優秀。
md5和sha1演算法都是經典的雜湊函式演算法,了解即可。!!
map-reduce:
1. map階段:利用雜湊函式把大任務分成子任務。同樣雜湊值的任務會被分配到同乙個節點(可能是一台機器、乙個計算節點)進行處理。
2. reduce階段:分開處理然後合併結果。子任務併發處理,然後合併結果。
map-reduce的難點:
1. 備份的考慮,分布式儲存的設計細節,以及容災策略。
2. 任務分配策略與任務進度跟蹤的細節設計,節點狀態的呈現。
3. 多使用者許可權的控制。
案例一:
用map—reduce方法統計一篇文章中每個單詞出現的個數。
去掉文章中的標點符號
對連字元'-'的處理,特別是單詞結尾處沒寫完,用連字元連線的情況。
對於縮寫的處理:例如i'm等
大小寫的處理
通過上面將有效的單詞抓取出來,就得到只包含單詞之後的文字。
2. map階段
只包含單詞之後的文字:對每個單詞生成詞頻為1的記錄:如(dog,1) (pig,1)乙個單詞可能有多個詞頻為1的記錄,此時還未進行合併。
3. 單個單詞的單一詞頻記錄:通過雜湊函式得到每個單詞的雜湊值,並根據該值分成若干組任務。
4. 子任務:每個子任務中包含若干種單詞,但同一種單詞不會分配進不同的子任務中。
單個子任務中同一種單詞的詞頻進行合併,生成乙個記錄。然後把所有記錄返回就是整篇文章的詞頻統計。
每個子任務都是並行處理,所以節省時間。
案例二:常見海量處理題目解題關鍵:
1. 分而治之,通過雜湊函式將大任務分流到機器,或分流成小檔案。
2. 常用的hashmap以及bitmap。
難點:通訊、時間和空間的估算。
請對10億個ipv4的ip位址進行排序,每個ip只會出現一次。
ipv4的ip數量一共是約等於42億。
ip------->無符號整數
普通方法為先將10億個ip位址全部轉化為無符號整數,然後對整數進行排序,之後將整數轉換為ip位址就可以了。
但是這種方式光是將ip位址轉換成整數就要占用 4*10億 也就是大約4g空間。
更節省空間的做法為:
1. 申請長度為pow(2,32)的bit型別的陣列。(bitmap)
2. 陣列每個位置上是乙個bit,只可表示0或1兩種狀態。因此,這個陣列一共占用過的空間大約是512m。
3. 如果整數1出現就將bitmap上面相應0位置置1。同理,如果整數k出現,就將k-1位置置1。
因為bitmap長度的原因,它可以表示任何乙個長度為32bit的整數。所以10億個ip位置,就可以在bitmap上置1十億個位置,最後掃瞄
這個bitmap從位置0開始,把ip位址通過位置值還原就可以了。
請對10億人的年齡進行排序。
年齡可以認為在0-200之間,然後用乙個足夠大的陣列,對10億個年齡進行計數排序就可以了。
案例三:
有乙個包含20億個全是32位整數的大檔案,在其中找到出現次數最多的數,但是記憶體限制只有2g。
普通解法:用hashmap記錄所有數出現的次數。
key:具體某一種數。整型。4位元組。
value:這種數出現的次數。4位元組。整型。之所以出現的次數也是整型是因為32位表示20億也是可以的。
這樣的話一條記錄占用8位元組,當記錄條數為2億時,大約1.6g記憶體。但是如果20億個整數都不相同的話就會有20億條記錄,
所以占用的記憶體就是8*20億。所以用雜湊表來直接統計20億個整數的方案可能會導致記憶體不足。
更好的解法:將20億個32位整數的大檔案利用雜湊函式進行分流形成多個小檔案,根據雜湊函式的性質可知:
同一種數不會被分流到不同檔案,這是雜湊函式性質決定的。
對於不同的數,每個檔案中含有整數的種數幾乎一樣,這也是雜湊函式性質決定的。
再對每乙個小檔案利用雜湊函式進行分流,統計每個小檔案中出現次數比較大的數字。最後再統計這些小檔案中產生的所有出現次數最多的數中的次數最多的就是最終的結果。
案例四:32位無符號整數的範圍是0~4294967295,現在有乙個正好包含40億個無符號整數的檔案,所以在整個範圍中必然有沒出現過的數。可以使用最多10m的記憶體,只用找到乙個沒有出現過的數即可。該如何找?
如果用雜湊表來記錄所有的數,最差情況下,將出現40億個不同的數。每一條記錄占用4位元組,大約需要16g記憶體。因此這種方式是絕對不可以的。
如果用bitmap的話,申請pow(2,32)的空間,每個位置為1bit,只能表示0或1兩種狀態,為1的話代表該下標所表示的數出現了。大約占用500m空間。也是不滿足情況的。
正確的方式應該是這樣的額:
將0~pow(2,32)-1範圍平均分成64個區間,然後統計每個區間的數出現的次數。因為總共的範圍為42億,但數一共為40億,所以必然會有區間計數不足(pow(2,32)/64)。只要找到乙個這樣的區間,這個區間一定少了某乙個數,對這個空間進行接下來的操作就可以了。假如這個空間為a:
對區間a,再遍歷一次40億個數,此時只關心區間a上的數,並用bitmap統計區間a上的數的出現情況。需要的空間為500m/64也就是差不多8m的空間。
系統總結一下上面的方法:
1. 根據記憶體限制決定區間大小,根據區間大小,得到有多少個變數,來記錄每個區間的數出現的次數。(剛才之所以將區間分成64個,是因為我們先計算10m的bitmap可以表示多大的區間,10m*pow(10,6)*8bit=8*pow(10,7)bit。(因為bitmap中乙個bit就表示乙個數,所以計算出有多少個bit就可以了)然後用pow(2,32)/(8*pow(10,7))就是需要分的區間的個數。)
2.利用區間計數的方式找到區間上的數不足的區間,這個區間上肯定有沒出現過的數。
3.利用bitmap對不滿的區間,進行這個區間上的數的詞頻統計。
案例五:某搜尋公司一天的使用者搜尋詞彙是海量的,假設有百億的資料量,請設計一種求出每天最熱100次的可行方法。
檔案上。然後處理每乙個小檔案,得到每個小檔案中詞彙的詞頻統計。需要注意的是,這裡面hash表統計每種詞,以及出現的頻率。雜湊表建立記錄,然後遍歷雜湊表。遍歷的過程中,利用大小為100的小根堆進行top100的篩選,選出每個小檔案的top100。每個小檔案都有自己詞頻的小根堆,小根堆裡的詞按照詞頻排序,得到每個小檔案排序後的
top100,。再利用小根堆或者外排序合併獲得機器上的top100。機器之間最後利用小根堆或者外排序獲得總體的top100.
對於topk問題,除了利用雜湊函式分流,利用雜湊表進行詞頻統計之外,還可能利用堆排序或者外排序等手段進行處理。
案例六:工程師常使用伺服器集群來設計和實現資料快取,一下是常見的策略。
1. 無論是新增、查詢還是刪除資料,都先將資料的id通過雜湊函式轉換成乙個雜湊值,記為key。
2. 如果目前機器有n臺,則計算key%n的值,這個值就是該資料所屬的機器編號,無論是新增、刪除還是查詢操作,都只在這台機器上進行。請分析這種快取策略可能帶來的問題,並提出改進的方案。
潛在問題:如果增加或刪除機器,資料遷移的代價很大。因為我們使用雜湊函式進行分流之後,對雜湊值結果需要%n計算相應的機器。但是當機器數n發生變化之後,所有資料必須重新計算雜湊值,以及對新的機器數n取餘,來決定各自資料的歸屬。並且機器之間需要進行大規模的資料遷移,代價很大。
因此引入一致性雜湊演算法(很好的資料快取設計方案):
大資料之MapReduce工作機制
mapreduce分布式計算系統,搭配yarn集群配合實現大資料計算任務。我們這裡不講mapreduce的 具體實現,而是講mapreduce的執行機制以及它的一些核心思想。了解了這些其實 都很簡單,只要有一些程式設計基礎的人都會寫得出那些 無非就是一堆檔案的內容進行分解整合變換的過程 mapred...
大資料MapReduce總結
mapreduce定義 hadoop mapreduce是乙個軟體框架,基於該框架能夠容易地編寫應用程式,這些應用程式能夠執行在由上千個商用機器組成的大集群上,並以一種可靠的,具有容錯能力的方式並行地處理上tb級別的海量資料集。mapreduce主要思想 分久必合 mapreduce兩個階段 map...
大資料 MapReduce概述
mapreduce 核心思想 總結mapreduce是乙個分布式執行程式的程式設計框架,是使用者開發 基於hadoop的資料分析應用的核心框架。mapreduce核心功能是把使用者編寫的業務邏輯 和自帶預設元件整合成乙個完整的分布式執行程式,併發執行在乙個hadoop集群上。下面分析官方wordco...