1. 程式人生 > >MapReducer糾錯之序列化反序列化問題

MapReducer糾錯之序列化反序列化問題

在MapReducer程式設計中經常會出現序列化反序列化的說法

在這裡解釋一下

序列化:序列化的意思就是把記憶體中的物件變成位元組儲存到磁碟上

反序列化:反序列化的意思就是把磁碟上的物件活化到記憶體中

說到這裡也許還是沒有說清楚序列化的意思,在大資料中,假設有一個非常大的叢集,也就是很多計算機,這一群計算機叫做叢集,MapReducer程式就是一個計算資料的程式,當A這臺機器計算完畢之後,A要把工作交給B機器做,但是在A中產生的資料(比如物件)如何給他呢?沒有無窮無盡的記憶體啊,就要通過磁碟IO傳輸,所以就需要序列化啦!A先將記憶體中的物件序列化到磁碟,然後B讀取之後,把磁碟中的物件反序列化成記憶體的物件。

序列化的方法

1.將需要序列化的物件,實現writeable介面

2.空參構造

3.重寫序列化方法write

4.重寫反序列化方法readwrite

5.重寫toString方法,為了可以將結果寫在檔案中,並且為了便於處理,用“\t“隔開

6.如果想要把這個序列化的物件當作key來傳遞,那麼還需要實現writableComparable,並重寫它的comparato方法,因為shuffle時他要根據key排序

今天在手寫一個MapReducer程式時,發現當map階段結束,reduce階段開始時,序列化的這個物件是空值,這就讓我覺得很奇怪,自己看了很久都沒有看出來,debug的時候,一步一步看才看到,原來是自己反序列化的方法裡面什麼都沒有,所以reduce階段反序列化得到的物件是空的。

用了IDEA這款軟體用了快半個月了,還是覺得不順手,過幾天把IDEA的除錯方法放出來給各位看看。