如何解決海量資料的Top K問題

2021-09-06 22:26:40 字數 1607 閱讀 1983

在大規模資料處理中,常遇到的一類問題是,在海量資料中找出出現頻率最高的前k個數,或者從海量資料中找出最大的前k個數針對top k類問題,通常比較好的方案是【分治+trie樹/hash+小頂堆】,即先將資料集按照hash方法分解成多個小資料集,然後使用trie樹或者hash統計每個小資料集中的query詞頻,之後用小頂堆求出每個資料集中出頻率最高的前k個數,最後在所有top k中求出最終的top k。

實際上,最優的解決方案應該是最符合實際設計需求的方案,在實際應用中,可能有足夠大的記憶體,那麼直接將資料扔到記憶體中一次性處理即可,也可能機器有多個核,這樣可以採用多執行緒處理整個資料集。

本文針對不同的應用場景,介紹了適合相應應用場景的解決方案。

3.1 單機+單核+足夠大記憶體

3.2 單機+多核+足夠大記憶體

這時可以直接在記憶體中實用hash方法將資料劃分成n個partition,每個partition交給乙個執行緒處理,執行緒的處理邏輯是同3.1節類似,最後乙個執行緒將結果歸併。

該方法存在乙個瓶頸會明顯影響效率,即資料傾斜,每個執行緒的處理速度可能不同,快的執行緒需要等待慢的執行緒,最終的處理速度取決於慢的執行緒。解決方法是,將資料劃分成c*n個partition(c>1),每個執行緒處理完當前partition後主動取下乙個partition繼續處理,直到所有資料處理完畢,最後由乙個執行緒進行歸併。

3.3 單機+單核+受限記憶體

這種情況下,需要將原資料檔案切割成乙個乙個小檔案,如,採用hash(x)%m,將原檔案中的資料切割成m小檔案,如果小檔案仍大於記憶體大小,繼續採用hash的方法對資料檔案進行切割,直到每個小檔案小於記憶體大小,這樣,每個檔案可放到記憶體中處理。採用3.1節的方法依次處理每個小檔案。

3.4 多機+受限記憶體

這種情況下,為了合理利用多台機器的資源,可將資料分發到多台機器上,每台機器採用3.3節中的策略解決本地的資料。可採用hash+socket方法進行資料分發。

從實際應用的角度考慮,3.1~3.4節的方案並不可行,因為在大規模資料處理環境下,作業效率並不是首要考慮的問題,演算法的擴充套件性和容錯性才是首要考慮的。演算法應該具有良好的擴充套件性,以便資料量進一步加大(隨著業務的發展,資料量加大是必然的)時,在不修改演算法框架的前提下,可達到近似的線性比;演算法應該具有容錯性,即當前某個檔案處理失敗後,能自動將其交給另外乙個執行緒繼續處理,而不是從頭開始處理。

top k問題很適合採用mapreduce框架解決,使用者只需編寫乙個map函式和兩個reduce 函式,然後提交到hadoop(採用mapchain和reducechain)上即可解決該問題。對於map函式,採用hash演算法,將hash值相同的資料交給同乙個reduce task;對於第乙個reduce函式,採用hashmap統計出每個詞出現的頻率,對於第二個reduce 函式,統計所有reduce task輸出資料中的top k即可。

top k問題是乙個非常常見的問題,公司一般不會自己寫個程式進行計算,而是提交到自己核心的資料處理平台上計算,該平台的計算效率可能不如直接寫程式高,但它具有良好的擴充套件性和容錯性,而這才是企業最看重的。

**

海量大資料處理——從十億詞找出頻率最高10個

海量資料 TopK問題

在海量資料中找出出現頻率最高的前k個數,或者從海量資料中找出最大的前k個數,這類問題通常被稱為topk問題。下面我們通過乙個簡單的例子來說明 假如面試官給你100w個資料,請找出其最大的前k個數,而且現在只有1m的空間?在32位作業系統中,預設乙個位元組為4個位元組,則有下列運算 needsize ...

海量資料topK問題

給你一億個資料,從中找出前k個大的資料。有兩種解決辦法。1.直接將資料從大到小排序,然後取前k個。但是由於資料的數量過於龐大,要開闢很大的空間,很浪費記憶體,所以這種方法不建議使用。2.用堆來解決。要找前k個大的資料,則將待找的元素的前k個元素建立大小為k的小根堆,小根堆的堆頂元素是這k個資料中最小...

海量資料的TopK問題

乙個基本的是思想是分治法,將1億個資料分成100份,每份100萬個資料,找出每份中最大的100個,最終可以在這100 100個資料中找出最大的100個。我們知道,快排一次的結果是分界點前面的資料比他小,分界點後的比他大,我們可以做如下的討論 如果分界點後面的資料個數大於k個,那麼可以在後面的資料中重...