海量資料中,查詢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 了。有同學覺得這題特別簡單,但其實這題只是母...