關於mapreduce中類重用機制

2021-06-27 02:37:33 字數 1201 閱讀 7980

今天寫了乙個writable,其**如下:

public class cfwritable implements writable 

public cfwritable(int mark,listitems)

@override

public void write(dataoutput out) throws ioexception

} @override

public void readfields(datainput in) throws ioexception }

public int getmark()

public void setmark(int mark)

public listgetitems()

public void setitems(listitems)

}

上面的**在跑集群任務的時候,發現reduce到66%這個數後就基本上不動了。排查一番,感覺類中的items的個數不會超過100個,那麼在計算的時候不應該慢下來。為了驗證想法,自己在程式中列印了一些資訊,其中就包含items的size;列印出來的結果令我不解,items的size就是前面的累計。

仔細排查**後,突然在腦中一閃:在ruduce的時候,mr為了加快速度(不要重新new)就復用了writable的類,而我這裡卻沒有任何機制清空items,所以這裡會一直在items 的後面新增資料。

問題找到後,修改**如下:

public class cfwritable implements writable 

public cfwritable(int mark,listitems)

@override

public void write(dataoutput out) throws ioexception

} @override

public void readfields(datainput in) throws ioexception

} public void clear()

public int getmark()

public void setmark(int mark)

public listgetitems()

public void setitems(listitems)

}

MapReduce物件重用問題

mapreduce 計算,輸出時key的值都是乙個,而且都是最後乙個put進入的值!原因 key value物件的重用導致的 key是乙個引用,它在棧中,指向堆中乙個物件,同樣value也是如此。雖然reduce方法會反覆執行多次,但key和value相關的物件只有兩個,key和value的引用也是...

關於軟體重用

在現實的大多數專案中,我們都在考慮著軟體重用的問題,因為這是在軟體開發中無法避免的乙個很現實的問題,也是乙個很讓人的頭疼的問題。下面是我對軟體重用的非常個人的理解,僅作參考。軟體重用可分為兩個層次,乙個層次是設計上的重用,另外乙個層次是 級的重用,而 級的重用上又可分細分為兩個層次,乙個是基於源 的...

c 類的重用

一.類的組合 當類的成員是另乙個類的物件時,就形成了類的組合。組合類建構函式定義的一般形式如下 類名 類名 形參表 內嵌物件1 形參表 內嵌物件2 形參表 class point class line line line point p1,point p2 pt1 p1 pt2 p2 二.類的繼承 ...