MapReduce最佳化之位元組級別快速排序
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MapReduce框架排序和分組框架排序
- MapReduce之WritableComparable排序排序
- 排序之快速排序排序
- 排序演算法之 '快速排序'排序演算法
- MapReduce程式設計例項之自定義排序程式設計排序
- 位元組跳動開源Katalyst:在離線混部排程,成本最佳化升級
- 演算法之快速排序演算法排序
- int型別按位元組列印輸出型別
- SQL最佳化:組內排序取最大值SQL排序
- 排序演算法之快速排序的實現排序演算法
- 看動畫學演算法之:排序-快速排序動畫演算法排序
- Java基本型別佔用的位元組數(char佔用幾個位元組問題)Java型別
- python反編譯之位元組碼Python編譯
- 學習 Java 之 位元組碼驗證Java
- Android AOP之位元組碼插樁Android
- JAVA將快速將列表分組並排序鍵Java排序
- Python之排序演算法:快速排序與氣泡排序Python排序演算法
- Java char 型別究竟佔幾個位元組?Java型別
- java中基本型別佔用位元組數Java型別
- 筆試之排序-直接插入排序、氣泡排序、快速排序筆試排序
- 各種快速排序-史詩級鉅作排序
- 排序演算法之「快速排序(Quick Sort) _c++ 」排序演算法UIC++
- 位元組流
- MapReduce應用案例--簡單排序排序
- MapReduce(三):分割槽、排序、合併排序
- MapReduce 二次排序詳解排序
- MapReduce實現之Reduce端重分割槽Join操作最佳化!
- Clojure 執行原理之位元組碼生成篇
- MapReduce之topN
- 機器碼和位元組碼分別介紹機器碼
- 演算法圖解之快速排序演算法圖解排序
- 演算法之快速排序(php版)演算法排序PHP
- 經典演算法之快速排序演算法排序
- 排序:氣泡排序&快速排序排序
- Hadoop-MapReduce之自定義資料型別Hadoop資料型別
- Java 位元組碼Java
- 理解位元組序
- 位元組對齊