1. 程式人生 > >Hadoop使用ByteWritable時的一個注意事項

Hadoop使用ByteWritable時的一個注意事項

今天使用ByteWritable時候遇到了問題,浪費了好多時間,最後通過檢視ByteWritable的原始碼才解決這個問題。分享一下,希望能幫助別人節約點時間。

自己寫了一個類繼承了RecordReader<IntWritable, BytesWritable>,在這裡value是使用BytesWritable,並且列印了一下byte[]

輸出如下:

-27-128-110-26-114-11032-25-76-94-27-68-10732-26-106-121-26-95-9332Len21

在Mapper裡輸入自然是<IntWritable, BytesWritable>,但是我用這個方法列印穿過來的BytesWritable型別的contents時候,確不和上面的結果相同:

 

輸出是:

-27-128-110-26-114-11032-25-76-94-27-68-10732-26-106-121-26-95-93320000000000Len31

注意到長度是不一樣的,但是前21個內容是相同的。這是由於Hadoop裡面BytesWritable的實現機制造成的,BytesWritable的實現中,儲存了一個byte[]存放內容,一個int size表示byte數組裡面前多少位是有效的,後面的是無效的,但是ByteWritable的getBytes()方法返回的確實byte陣列的全部內容(長度很可能大於size),所以在Mapper中進行處理的時候應該只操縱size大小的內容後面的應該無視掉,如: