分割槽介紹
RDD 如何分割槽?
預設情況下,為每個 HDFS 分割槽建立一個分割槽,預設情況下為 64MB。在這裡閱讀更多。
如何跨分割槽平衡我的資料?
首先,看看可以重新分配資料的三種方式 :
-
將第二個引數 ( RDD 的所需最小分割槽數) 傳遞給
textFile()
,但要小心:在[14]中:lines = sc.textFile(
data
)在[15]中:
lines.getNumPartitions()
Out [15]:1000在[16]中:lines = sc.textFile(
data
,500)在[17]中:
lines.getNumPartitions()
Out [17]:1434在[18]中:lines = sc.textFile(
data
,5000)在[19]中:
lines.getNumPartitions()
Out [19]:5926
正如你所看到的,[16]
沒有達到預期的效果,因為 RDD 具有的分割槽數量已經大於我們請求的最小分割槽數量。
-
使用
repartition()
,如下所示:在[22]中:lines =
lines.repartition(10)
在[23]中:
lines.getNumPartitions()
Out [23]:10
警告:這將呼叫隨機播放,並且當你想要增加 RDD 具有的分割槽數時應該使用它。
來自文件 :
隨機播放是 Spark 的重新分配資料的機制,因此它可以跨分割槽進行不同的分組。這通常涉及跨執行程式和機器複製資料,使得混洗成為複雜且昂貴的操作。
-
使用
coalesce()
,如下所示:在[25]中:lines =
lines.coalesce(2)
在[26]中:
lines.getNumPartitions()
Out [26]:2
在這裡,Spark 知道你會縮小 RDD 並獲得它的優勢。閱讀有關 repartition()
vs coalesce()
的更多資訊。
但這一切能否保證你的資料在你的分割槽中完美平衡?不是真的,因為我在如何跨分割槽平衡資料方面經驗豐富?