關于磁區什么時候進行的問題
spark磁區是在maptask 到reduceTask的時候進行磁區,還是說在sc.textFile就開始磁區了呢
我測驗了一下,sc.textFile默認磁區后我把每個磁區的內容列印出來發現不是hash演算法磁區,但是當我經過了shuffle算子之后再列印各個磁區的內容就是按照hash演算法磁區
所以很疑惑,如果是sc.textFile就開始磁區,那么假設3個block塊,我在sc.textFile就指定5個磁區,那就得將3個block塊分成5個磁區,那會很占用記憶體和網路資源(map取各個block塊中的某一個磁區),感覺有點不太合理啊,然后再經過shuffle算子,再次磁區,感覺很慢啊;
我在想是不是一開始sc.textFile在讀取hdfs的資料時,按照平均的方式給每個一磁區資料(例如:3個block塊共384MB,5個磁區就是各76.8Mb,每個map讀取這76.bMB資料),然后在經過shuffle算子的時候才開始按照hash演算法磁區,生成檔案,再由reduce取各個節點的磁區值,這樣也能說的通,最后五個part-0000檔案,shuffle程序的桶也是5*5=25
uj5u.com熱心網友回復:
spark讀入RDD的時候,磁區數是由資料源決定的。如資料源是HDFS上的檔案,磁區則是由該檔案格式的InputSplit決定,一般磁區數等同于讀入檔案的總block數(這塊和MapReduce的MapTask是一樣的邏輯)
如果資料源是HBASE表,則一個磁區對應一個Region
如果資料源是KAFKA,則與topic磁區對應
其他道理類似。
至于說shuffle,spark默認有2種partitionor:一個是hash,另一個是range。hash你提到了。range則是由水塘抽樣演算法,計算出整個資料集的資料分布情況,再根據指定重磁區數劃分成對應個range,符合range的資料則會落到該磁區中。
uj5u.com熱心網友回復:
請問:那么假設3個block塊,我在sc.textFile就指定5個磁區 這種情況textFile如何讀取uj5u.com熱心網友回復:
sc.textFile指定的磁區數,是建議最低磁區數。另外這個數值,是由檔案的InputSplit決定如何滿足。
uj5u.com熱心網友回復:
多謝回復,不過還是想知道如果指定磁區為5會發生什么,又是如何讀取的uj5u.com熱心網友回復:
你可以看看org.apache.hadoop.mapred.InputFormat的具體檔案格式實作類的代碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/37590.html
標籤:Spark
上一篇:React 小白初入門
下一篇:Web程式設計筆記(二)
