spark RDD textFile運算元 分割槽數量詳解

泡麵也想去流浪發表於2020-11-24

在這裡插入圖片描述進入textFile原碼
發現 分割槽數量呼叫 hadoopFile中的TextInputFormat類,傳入引數Key為LongWritable即偏移量,value為Text,
由此得知是通過這個類來讀取

繼續進入TextInputFormat類中
在這裡插入圖片描述發現有個是否可以切分的判斷,可以知道 一些不可拆分的檔案由此過濾掉,可以切片拆分的檔案繼續往下尋找卻沒有相關處理邏輯 ,所以我們向上去到父類FileInputFormat中

在這裡插入圖片描述找到如上邏輯,呼叫了listStatu與namenode互動獲取檔案屬性,把要讀取的檔案總長度計算出來 totalSize

在這裡插入圖片描述下面找到一個關鍵變數goalSize他的值為所有檔案總長度除以預設最小分割槽數,
中間過程不一一贅述,關鍵程式碼在computeSplitSize
進入computeSplitSize中
在這裡插入圖片描述三個引數值 goalSize上述計算過,minSize預設為1,blockSize為HDFS預設塊大小 128M
computeSplitSize主處理很簡單,先比較goalSize和blockSize大小取兩者最小的,再與minSize比較取兩者最大的 最終結果賦給splitSize
在這裡插入圖片描述

之後回到先前邏輯, 定義一個bytesRemaining接收每個檔案的長度,進入while迴圈 條件為
檔案長度/splitSize >1.1即SPLIT_SLOP便執行切分操作 直到條件不滿足 停止迴圈切分

舉例說明:
4個檔案長度分別為100 100 100 1400位元組,預設最小分割槽為2
首先計算全部檔案總長度totalSize=100+100+100+1400=1700
goalSize=totalSize/最小分割槽數即2 =850
blockSize=128M換算成位元組為134217728
minSize=1
goalSize與blockSize取最小 值為850
850 與minSize取最大 值為850
即splitSize為850
然後 每個檔案長度除以850 判斷是否大於1.1
檔案1,2,3都是100所以各生成1個分割槽,
檔案4位1400,除以850>1.1 切分一個分割槽,剩餘
(1400-850)/850 >1.1不再成立 又生成一個分割槽.
所以舉例中的四個檔案 共生成5個分割槽

相關文章