Hadoop 排重優化

ygp8 9年前發布 | 7K 次閱讀 Hadoop 分布式/云計算/大數據

如果覺得有幫助的話就頂下吧

在統計的時候經常會用到排重,比如想統計每日登陸用戶,但是一個用戶一次多次登陸情況,或者一個產品被多少個用戶下載。。等等情況

截圖一是我之前寫的代碼:

Hadoop 排重優化

下面是我優化后代碼

public static class ReduceTask extends Reducer<Text, Text, Text, IntWritable> {

    private IntWritable rval = new IntWritable();
    private Multiset<Text> multiset=HashMultiset.create();

    @Override
    protected void reduce(Text key, Iterable<Text> values, Context context)
            throws IOException, InterruptedException {

        multiset.clear();
        for (Text item:values){
            multiset.add(item);
        }

        rval.set(multiset.elementSet().size());
        context.write(key, rval);
    }
}

Multiset,會將相同的key,存到value種,只要將key遍歷出來取值的個數就是排重后的數據。

前者是循環嵌套查找但是占用內存少 ,1179個組,平均每個組被分到6萬條,最壞情況下(6w/2)^2*1179級別的循環,后者利用hashmap高效的存取值方式,是O(n)的級別,但是占用內存比較大

性能對比,下圖是輸入的數據,經過map的篩選,,

Hadoop 排重優化

下圖是代碼1執行的用時

Hadoop 排重優化

執行了一小時還沒結束,下圖是代碼二的時間 只要倆分鐘不到,執行速度有大幅提升

Hadoop 排重優化

來自:http://my.oschina.net/osenlin/blog/500819

 本文由用戶 ygp8 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!