1. 程式人生 > >《資料演算法-Hadoop/Spark大資料處理技巧》讀書筆記(一)——二次排序

《資料演算法-Hadoop/Spark大資料處理技巧》讀書筆記(一)——二次排序

寫在前面:
在做直播的時候有同學問Spark不是用Scala語言作為開發語言麼,的確是的,從網上查資料的話也會看到大把大把的用Scala編寫的Spark程式,但是仔細看就會發現這些用Scala寫的文章絕大部分是初級內容,最常見的就是某一個API是怎麼用的,很多都是拷貝貼上的重複內容,真正深入的內容並不多見。之前看美團團隊寫的Spark優化相關放出的程式碼是用Java寫的,《資料演算法-Hadoop/Spark大資料處理技巧》這本書裡Spark的示例程式碼也是使用Java語言編寫的。所以有理由相信,在大多數企業裡做Spark開發時仍然是以Java為主的。
當然,使用Java開發Spark的確程式碼量比較大,比較繁瑣,很多使用Scala能夠直接呼叫的API需要在Java裡用幾步操作才能完成(比如Scala裡的SortByValue,在Java裡要先Reverse,再sortByKey,最後在Reverse回來。。。),但是我還是覺得對於水平沒那麼高的程式設計師來說,使用Java開發Spark仍然是不錯的選擇,或者說是最優的選擇。

ps:由於測試環境使用的是偽叢集,只有一個節點,所以我發實現資料在多節點上的混洗,所以很有有可能當前的執行結果和在真正叢集環境下執行是不一樣的。多節點叢集模式待以後驗證。

1.二次排序問題
①推薦使用MapReduce或Spark自帶的歸約器進行值排序。
MapReduce的二次排序思想是構造2元Key,重寫Key的compareTo(),規定排序原則,資料來源如下

年   月   日   氣溫
2012,01,01,5
2012,01,02,45
2000,12,04,20
2000,11,01,20
2000,12,02,-20
2000,11,07,30
2000,11,24,-40

排序後的結果(優先比年月,然後再比溫度)

200011,-40  -40,
200011,20   20,
200011,30   30,
200012,-20  -20,
200012,20   20,
201201,5    5,
201201,45   45,

之後通過setGroupingComparatorClass完成按照Key的分組Reduce。
setGroupingComparatorClass決定了Reduce的分組規則。

200011  -40,20,30,
200012  -20,20,
201201  5,45,

這樣就完成了對資料的二次排序
②spark的shuffle是基於雜湊的,因此是沒辦法直接使用框架完成二次排序的,value的排序只能基於List的Sort。(書裡例子是spark-1.1.0,不知道spark2.0以後的版本是否能夠實現二次排序)這裡的午飯完成二次排序的意思是,無法像MapReduce的例子裡一樣將Value通過Reduce生成按照排序順序排列的列表。但是基於RDD的二次排序是可以實現的。
實現的方法是Key類實現Ordered,Serializable兩個介面,實現其中的比較方法即可,然後在以此類為Key的PairRDD上呼叫SortByKey就可以了。