Hadoop是怎麼分塊的(R1)
The actual number of replications can be specified when the file is created.
The default is used if replication is not specified in create time.
return Math.max(minSize, Math.min(goalSize, blockSize));
}
splits = JobClient.readSplitFile(splitFile);
} finally {
splitFile.close();
}
numMapTasks = splits.length;
maps = new TaskInProgress[numMapTasks];
==================================================================================================================
hadoop的分塊有兩部分。
第一部分就是資料的劃分(即把File劃分成Block),這個是物理上的劃分,資料檔案上傳到HDFS裡的時候,需要劃分成一塊一塊,每塊的大小由hadoop-default.xml裡配置選項進行劃分(大小不足一塊時,便按實際大小存放):
這裡設定的是每個塊64MB。
資料劃分的時候也可以設定備份的份數:
具體的物理劃分步驟由Namenode決定,下面hadoop中的第二種劃分,用來決定M/R執行時,一個map處理的資料量。
在hadoop中第二種劃分是由InputFormat這個介面來定義的,其中有個getSplits方法。這裡有一個新的概念:fileSplit。每個map處理一個fileSplit,所以有多少個fileSplit就有多少個map(map數並不是單純的由使用者設定決定的)。
我們來看一下hadoop分配splits的原始碼:
if ((length != 0) && isSplitable(fs, path)) {
long blockSize = file.getBlockSize();
long splitSize = computeSplitSize(goalSize, minSize, blockSize);
long bytesRemaining = length;
while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) {
int blkIndex = getBlockIndex(blkLocations, length-bytesRemaining);
splits.add(new FileSplit(path, length-bytesRemaining, splitSize, blkLocations[blkIndex].getHosts()));
bytesRemaining -= splitSize; }
if (bytesRemaining != 0) {
splits.add(new FileSplit(path, length-bytesRemaining, bytesRemaining, blkLocations[blkLocations.length-1].getHosts())); }
} else if (length != 0) {
splits.add(new FileSplit(path, 0, length,blkLocations[0].getHosts()));
} else {
//Create empty hosts array for zero length files
splits.add(new FileSplit(path, 0, length, new String[0]));
}
}
從程式碼可以看出,一個塊為一個splits,即一個map,只要搞清楚一個塊的大小,就能計算出執行時的map數。而一個split的大小是由goalSize, minSize, blockSize這三個值決定的。computeSplitSize的邏輯是,先從goalSize和blockSize兩個值中選出最小的那個(比如一般不設定map數,這時blockSize為當前檔案的塊size,而goalSize是檔案大小除以使用者設定的map數得到的,如果沒設定的話,預設是1),在預設的大多數情況下,blockSize比較小。然後再取bloceSize和minSize中最大的那個。而minSize如果不透過”mapred.min.split.size”設定的話(”mapred.min.split.size”預設為0),minSize為1,這樣得出的一個splits的size就是blockSize,即一個塊一個map,有多少塊就有多少map。
上面說的是splitable的情況,unsplitable可以根據實際情況來計算,一般為一個檔案一個map。
下面是摘自網上的一個總結:
幾個簡單的結論:
1. 一個split不會包含零點幾或者幾點幾個Block,一定是包含大於等於1個整數個Block
2. 一個split不會包含兩個File的Block,不會跨越File邊界
3. split和Block的關係是一對多的關係
4. maptasks的個數最終決定於splits的長度
還有一點需要說明,在FileSplit類中,有一項是private String[] hosts;
看上去是說明這個FileSplit是放在哪些機器上的,實際上hosts裡只是儲存了一個Block的冗餘機器列表。
比如有個fileSplit 有4個block: Block11, Block12, Block13,Block14,這個FileSplit中的hosts裡最終儲存的是Block11本身和其備份所在的機器列表,也就是說 Block12,Block13,Block14存在哪些機器上沒有在FileSplit中記錄。
FileSplit中的這個屬性有利於排程作業時候的資料本地性問題。如果一個tasktracker前來索取task,jobtracker就會找個 task給他,找到一個maptask,得先看這個task的輸入的FileSplit裡hosts是否包含tasktracker所在機器,也就是判斷 和該tasktracker同時存在一個機器上的datanode是否擁有FileSplit中某個Block的備份。
但總之,只能牽就一個Block,其他Block就要從網路上傳。不過對於預設大多數情況下的一個block對應一個map,可以透過修改hosts使map的本地化數更多一些。 在講block的hosts傳給fileSplit時,hosts中的主機地址可以有多個,表示map可以從優先從這些hosts中選取(只是優先,但hdfs還很可能根據當時的網路負載選擇不是hosts中的主機起map task)。
知道這個特性之後,可以修改傳回給fileSplit的hosts,在列表中只寫block所在的那些hosts,這樣hdfs就會優先將這些map放到這些hosts上去執行,由於hosts上有該block,就省掉了網路傳輸資料的時間。
這樣做的話,在job很多的時候,可能會出現hot spot,即資料用的越多,它所在hosts上的map task就會越多。所以在考慮修改傳給fileSplit的時候要考慮平衡諸多因素
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26613085/viewspace-1107142/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- hadoop 配置項的調優(R1)Hadoop
- Hadoop中一個distcp (R1)HadoopTCP
- 看看關係型資料庫是怎麼吊打Hadoop的資料庫Hadoop
- 什麼是Hadoop?Hadoop
- 區塊鏈是怎麼做到保護食品安全的區塊鏈
- 什麼是 Apache Hadoop?ApacheHadoop
- 商場分佈圖是怎麼做,地圖資料分佈圖怎麼做地圖
- HTML中的塊是什麼?HTML
- win10桌面圖示怎麼進行分類分塊管理_win10桌面圖示如何分塊管理Win10
- 短影片自媒體是怎麼一鍵分發的?分發到那麼多平臺是真的嗎?
- 堅果R1手機引數詳解和開箱圖賞 堅果R1配置怎麼樣?
- 《openstack 和hadoop的區別是什麼?》Hadoop
- 區塊鏈的原理是什麼?區塊鏈
- 區塊鏈是做什麼的?區塊鏈
- laravel chunk 分塊後 第二塊資料是物件Laravel物件
- ssl/tls是什麼?是怎麼工作的?TLS
- 怎麼面試,怎麼評分,怎麼決定面試
- 五分鐘讀懂區塊鏈到底是個什麼鏈?區塊鏈
- 什麼是塊元素?什麼是行內元素?
- 區塊鏈專案是怎樣盈利的區塊鏈
- Hadoop現在怎麼樣了?Hadoop
- 當前區塊鏈交易所開發的現狀是怎麼樣的?區塊鏈
- 熱備與冷備分別是什麼意思?怎麼通俗理解?
- 華納公司上下分客服(hn0066.com)大資料中Hadoop是什麼?大資料Hadoop
- 區塊鏈每日一問 | 什麼是區塊鏈的“分叉”?區塊鏈
- 區塊鏈「橋」是什麼?區塊鏈
- 一張新型肺炎地區分佈地圖是怎麼製作的?地圖
- 為什麼區塊鏈是不可篡改的區塊鏈
- 區塊鏈的核心技術是什麼?區塊鏈
- 區塊鏈的概念定義是什麼區塊鏈
- 區塊鏈最大的價值是什麼?區塊鏈
- synchronized 程式碼塊怎麼用synchronized
- 區塊鏈怎麼賺錢區塊鏈
- 區塊鏈怎麼賺錢?區塊鏈
- 怎麼製作區塊鏈區塊鏈
- mysql order by是怎麼工作的?MySql
- Mybatis是怎麼工作的(二)MyBatis
- JavaScript是怎麼誕生的JavaScript