Spark 數據全局排序實現以及RangePartitioner的使用示例

Spark 數據全局排序實現以及RangePartitioner的使用示例

2017年09月13日 17:20:35 javartisan 閱讀數 2612

轉自鏈接:https://blog.csdn.net/Dax1n/article/details/77968427

使用Java 隨機數類隨機生成0到Integer.MAX_VALUE之間的10GB文件,然後使用Spark計算框架進行全局排序。

實現思路:可以局部排序(局部數據是全局數據的某一個範圍)最後合併到全同一個文件,保證全局有序,這樣可以設置一個reduce任務實現,但是對於更大量的數據容易出現OOM。如果不合併到同一個文件的話,可以將每一個分區有序的數據輸出到磁盤。最後借鑑Kafka的數據管理方式建立稀疏索引方便以後的數據訪問。

 

1:定義一個Partitioner保證某一範圍內的所有數據都在同一個分區。

該分區根據數據範圍劃分爲num個子範圍,然後將每個數字分配到對應的子範圍中,這種情況下當數據在各個子範圍分佈均勻時候可以表現良好。但是當數據嚴重聚集時候,會發生數據傾斜。當存在數據傾斜時候可以使用Spark提供的 RangePartitioner分區器進行分區。該分區器會根據RDD進行採樣然後根據數據的實際情況合理的劃分子範圍(此時的每一個子範圍區間長度可能是不相等的,要根據具體數據而定)。這樣可以緩解數據傾斜的發生。例如:

 

例如當我們數據如下:

 

Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 22, 33, 43, 26, 50, 81, 54, 76, 94, 100)

如果按照每個子範圍長度爲25的話。劃分4個區間的話,明顯第一個子範圍就會發生數據傾斜,而對於RangePartitioner劃分子範圍的話,劃分區間可以是:


這個劃分就比較均勻。

2:分區內部排序,保證分區內有序

 

要點: 

使用repartitionAndSortWithinPartitions算子進行分區並分區內部排序,而不是自行先分區在排序,這樣不如repartitionAndSortWithinPartitions效率高,具體原因見repartitionAndSortWithinPartitions這一篇博文。

 

 

 

 

 

 

基於Hadoop實現的全局排序可以參考:

三種方法實現Hadoop(MapReduce)全局排序(1)

三種方法實現Hadoop(MapReduce)全局排序(2)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章