hadoop原始碼分析 切片的執行規則

2021-10-06 13:32:35 字數 1625 閱讀 5522

接觸hadoop的小夥伴應該都知道,split(切片)的數目就是mapreduce執行時將要產生的maptask數,那麼hadoop是如何進行切片的規則是什麼呢?

hadoop的切片功能是在fileinputformat中實現的,裡邊定義了切片相關的屬性配置和實現切片的getsplit()方法。以下是fileinputformat類中與切片相關的屬性及屬性的get、set方法。

public abstract class fileinputformatextends inputformat  //設定切片的最小尺寸

public static long getminsplitsize(jobcontext job) //獲得切片的最小尺寸

public static void setmaxinputsplitsize(job job, long size) //設定切片的最大尺寸

public static long getmaxsplitsize(jobcontext context) //獲得切片的最大尺寸

在job正式提交之前,fileinputformat會對輸入的檔案按照規則進行切片,那麼規則是什麼呢?首先,在執行切片之前,會收集切片相關的配置,主要是設定的最大和最小尺寸要求。具體**說明。

//獲得format的最小切片尺寸

protected long getformatminsplitsize()

//判定誰否能進行切片(有些壓縮檔案無法進行切片)

protected boolean issplitable(jobcontext context, path filename)

//通過比較format最小切片要求和設定的最小切片要求,用兩者最大為切片最小尺寸

long minsize = math.max(this.getformatminsplitsize(), getminsplitsize(job));

//獲得job設定的最大尺寸要求

long maxsize = getmaxsplitsize(job);

在獲取到所有的設定之後,就會開始進行切片操作,切片操作時,原始碼解釋

protected long computesplitsize(long blocksize, long minsize, long maxsize)
計算切片尺寸時,會先從設定的最大尺寸和塊尺寸中取最小值。然後再和設定的切片最小尺寸中取最大值。如果未設定最大最小尺寸,那麼得出的結果就是塊的大小,128mb。

假如:設定的最小尺寸為256mb,最大尺寸為512mb,那麼512mb和128mb取小128mb,然後再和256mb取大,最後就是256mb。

if (this.issplitable(job, path))
有了切片尺寸,那麼檔案大於切片尺寸就進行切片嗎?非也,執行切片前,會確定該輸入檔案是否可切分(某些格式的壓縮檔案無法切分),若可切分,則會再將檔案的大小與切片尺寸比較,若是比值大於1.1才執行切片。例如:切片大小為128mb,若是檔案大小是140mb,140/128=1.09<1.1,變不會再進行切片操作,整個檔案作為乙個切片。

了解了切片大小的底層原理之後,在使用時就可以結合實際需求,合理的進行最大最小尺寸設定了。

hadoop 原始碼分析一

inputformat inputsplit 繼承自writable介面,因此乙個inputsplit實則包含了四個介面函式,讀和寫 readfields和 write getlength能夠給出這個split中所記錄的資料大小,getlocations能夠得到這個split位於哪些主機之上 blk...

Hadoop 中 IPC 的原始碼分析

最近開始看 hadoop 的一些原始碼,展開hadoop的原始碼包,各個元件分得比較清楚,於是開始看一下 ipc 的一些原始碼。ipc模組,也就是程序間通訊模組,如果是在不同的機器上,那就可以理解為 rpc 了,也就是遠端呼叫。事實上,hadoop 中的 ipc 也就是基於 rpc 實現的。使用 s...

從原始碼分析MapReduce的資料切片原理

切片過程從jobsubmitter的writesplits 開始 step into getsplits 開始獲取新的切片 首先會選出format預設最小值和配置檔案中設定的切片最小值 二者中最大的乙個 getformatmainsplitsize 預設返回值為1 getminsplitsize 中...