hadoop案例之topK問題

2021-07-29 18:37:09 字數 1671 閱讀 7644

海量資料中,查詢topk問題的hadoop解法:

乙個map task就是乙個程序。有幾個map task就有幾個中間檔案,有幾個reduce task就有幾個最終輸出檔案。

要找的top k 是指的全域性的前k條資料,那麼不管中間有幾個map, reduce最終只能有乙個reduce來彙總資料,輸出top k。

下一步,我們來加入新記錄到treemap中去(這裡的treemap就是個大頂堆或小頂堆)。在map中,對每一條記錄都嘗試去更新treemap,

或者output.collector一次。而在這裡不是,這裡是把所有這個input split的資料處理完之後再進行寫入。所以,可以把這個context.write放在cleanup裡執行。

//求最大的前k個數,用小頂堆

//求最小的前k個數,用大頂堆

public class topk

});protected void map(longwritable key, text value ,context context)

throws ioexception, interruptedexception

}}

protected void cleanup(context context)

throws ioexception, interruptedexception }}

static class reducejob extends reducer

});@override

protected void reduce(intwritable key, iterablevalues,

context context)

throws ioexception, interruptedexception

}}

@override

protected void cleanup(context context)

throws ioexception, interruptedexception

} }public static void main(string args)

conf.set("k", otherargs[2]);

job job = new job(conf);

job.setjobname("top k");

job.setjarbyclass(topk.class);

job.setreducerclass(reducejob.class);

job.setmapoutputkeyclass(intwritable.class);

job.setmapoutputvalueclass(intwritable.class);

job.setnumreducetasks(1);

fileinputformat.addinputpath(job, new path("/usr/local/hadooptempdata/input/topk/"));

fileoutputformat.setoutputpath(job, new path("/usr/local/hadooptempdata/output/topk/"));

system.exit(job.waitforcompletion(true)? 0 : 1);

} catch (exception e)

}}

Hadoop之企業案例分析

或者如下闡述 雪域之鷹 演算法思想 分而治之 hash 1 ip 位址最多有2 32 4g種取值情況,所以不能完全載入到記憶體中處理 2 可以考慮採用 分而治之 的思想,按照ip位址的hash ip 1024值,把海量ip日誌分別儲存到1024個小檔案中。這樣,每個小檔案最多包含4mb個ip位址 3...

資料排序之TopK問題

前言 在大規模資料處理中,常遇到的一類問題是,在海量資料中找出出現頻率最高的前k個數,或者從海量資料中找出最大的前k個數,這類問題通常稱為 topk 問題 解決思路 針對topk類問題,通常比較好的方案是 分治 trie樹 hash 小頂堆 即先將資料集按照hash演算法分解成多個小資料集,然後使用...

必考演算法之 Top K 問題

top k 問題是面試中非常常考的演算法題。8leetcode 上這兩題大同小異,這裡以第一題為例。題意 給一組詞,統計出現頻率最高的 k 個。比如說 i love leetcode,i love coding 中頻率最高的 2 個就是 i 和 love 了。有同學覺得這題特別簡單,但其實這題只是母...