今天寫了乙個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 二.類的繼承 ...