MapReducer的分區器的使用partition使用

Mapper
    Mapper的每次輸入只執行一次
    
Reducer
    只要key相同的,都會傳入到values進行
    
Partiton分區器
    默認的分區器採用的分區方式爲計算hashcode的值,從而進行分區,默認的分區類HashPartitioner,該類繼承了Partitioner這個分區類
    該類需要實現的方法爲int getPartition(),該類返回的值爲一個數字,該數字用來區分分區。
    
所以,java中,如果想設置Partition,就需要實現該類,通過調用setPartitionerClass(Class cls), 就可以設置分區器
同時設置分區器的時候,仍需要設置NumReduceTasks的數量,如果有幾個分區就設置爲幾個,
    該部分的案例如:聯通移動手機號分區,根據手機號碼的前幾個部分可以區分出手機號碼是移動還是聯通
        job.setPartitionerClass(ContextPartitioner.class);
        job.setNumReduceTasks(3);
1、    設置了分區器,還得設置reduceTask數量,否則生成的文件只有一個
2、    如果設置的reduceTask數量超過我們自定義分區器的數量,則會有些分區會沒有數據
3、    如果設置的reduceTask數量少於我們自定義分區器的數量,則會拋出異常,這個異常需要特別注意,如果你的reduceTask顯示的設置爲1,
它不會拋出異常的,它和不設置reduceTask的是一樣的,但是一旦你設置超過1的時候,則需要考慮分區與reduceTask映射關係,這種映射錯誤並非時常發生。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章