MapReduce最佳化之位元組級別快速排序

破棉襖發表於2015-06-10

MapReduce預設使用RawComparator對map的輸出鍵進行比較排序。內建的Writable類(例如Text和IntWritable)是位元組級實現。這樣不用將位元組形式的類解排列(unmarshal)成類物件。如果要透過WritableComparable實現自定義Writable,就有可能延長洗牌和排序階段的時間,因為它需要進行解排列。 

問題:
    存在自定義的Writable。需要減少作業的排序時間。 


方案:

    實現位元組級的Comparator來最佳化排序中的比較過程。


解決:
 RawComparator介面提供兩個方法:

1.public int compare(WritableComparable w1, WritableComparable w2){}
2.public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {}
採用第一種方法簡單、易實現,但其效能也是我們需進行最佳化的原因。那麼,讓我們實現第二種:

例項:
假設我們定製的Writable為兩個String的封裝:



我們知道DataOutput.writeUTF方法會首先用兩個位元組儲存字串的長度,然後再儲存該字串。

OK,接下來,讓我們看該如何實現快速排序:

1.實現一個RawComparator介面,但這裡我們只需繼承WritableComparator 即可
    WritableComparator 是RawComparator 的一個通用實現。它提供了一個compareBytes方法實現位元組級排序。

2.定製一個物件繼承WritableComparator,實現以下方法:
  
先說一下compare的引數:
   b1欄位包含一個位元組陣列,其中包括位元組形式的WritableComparable。
   s1欄位是指WritableComparable物件起始位元組的偏移量。
   l1欄位是指WritableComparable在位元組陣列中佔用的位元組數。

readUnsignedShort方法為獲取從起始偏移量開始的前兩個位元組,該兩個位元組儲存的為字串的長度。

OK,排序完成。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29754888/viewspace-1694667/,如需轉載,請註明出處,否則將追究法律責任。

相關文章