為什麼HDFS檔案塊(block)大小設定為128M解析.

2020-10-13 18:00:21

Table of Contents

一.前言

二. block 大小設定原則:最小化定址開銷,減少網路傳輸.

三、為什麼HDFS中塊(block)不能設定太大,也不能設定太小?

四、 HDFS中塊(block)的大小為什麼設定為128M?


 

一.前言

HDFS中儲存資料是以塊(block,這只是一個邏輯概念)的形式儲存在DataNode,block大小可通過設定HADOOP_HOME/etc/hadoop/hdfs-site.xmldfs.blocksize實現(設定時先stop叢集,修改完restart叢集)。在Hadoop2.x之後的版本中,檔案塊的預設大小是128M,老版本中預設是64M;

<property>
	<name>dfs.block.size</name>
	<value>134217728</value>
</property>

 

二. block 大小設定原則:最小化定址開銷,減少網路傳輸.

  1. 減少硬碟尋道時間(disk seek time)HDFS的設計是為了支援巨量資料操作,合適的block大小有助於減少硬碟尋道時間(平衡了硬碟尋道時間、IO時間),提高系統吞吐量。
  2. 減少NameNode記憶體消耗:NameNode需要在記憶體FSImage檔案中記錄DataNode中資料塊資訊,若block size太小,那麼需要維護的資料塊資訊會更多。而HDFS只有一個NameNode節點,記憶體是極其有限的。
  3. map崩潰問題:若Map任務崩潰,重新啟動執行需要重新載入資料,資料塊越大,資料載入時間將越長,恢復時間越長。
  4. 監管時間問題:主節點監管其他節點的情況,每個節點會週期性的把完成的工作和狀態的更新報告回來。若某個節點儲存沉默超過預設的時間間隔,主節點「宣告」該節點狀態為死亡,並把分配給這個節點的資料發到別的節點。預設的時間間隔是根據資料塊 size角度估算的,若size設定不合理,容易誤判節點死亡。
  5. 約束Map任務輸出:MapReduce框架中Map任務輸出的結果是要經過排序才給reduce函數操作的。在Map任務的merge on disk和Reduce任務中合併溢寫生的檔案,用到歸併排序演演算法,對小檔案進行排序,然後將小檔案歸併成大檔案。
  6. 網路傳輸問題: 在資料讀寫計算的時候,需要進行網路傳輸.如果block過大會導致網路傳輸時間增長,程式卡頓/超時/無響應. 任務執行的過程中拉取其他節點的block或者失敗重試的成本會過高.如果block過小,則會頻繁的進行檔案傳輸,對嚴重佔用網路/CPU資源.

 

定址時間:HDFS中找到目標檔案塊(block)所需要的時間。

原理:

檔案塊越大,定址時間越短,但磁碟傳輸時間越長;

檔案塊越小,定址時間越長,但磁碟傳輸時間越短。

 

三、為什麼HDFS中塊(block)不能設定太大,也不能設定太小?

1. 如果塊設定過大,

    第一點: 從磁碟傳輸資料的時間會明顯大於定址時間,導致程式在處理這塊資料時,變得非常慢;

    第二點: mapreduce中的map任務通常一次只處理一個塊中的資料,如果塊過大執行速度也會很慢。

    第三點: 在資料讀寫計算的時候,需要進行網路傳輸.如果block過大會導致網路傳輸時間增長,程式卡頓/超時/無響應. 任務執行的過程中拉取其他節點的block或者失敗重試的成本會過高.

    第四點: namenode監管容易判斷資料節點死亡.導致叢集頻繁產生/移除副本, 佔用cpu,網路,記憶體資源.

2. 如果塊設定過小,

    第一點: 存放大量小檔案會佔用NameNode中大量記憶體來儲存後設資料,而NameNode的實體記憶體是有限的;

    第二點: 檔案塊過小,定址時間增大,導致程式一直在找block的開始位置。

    第三點: 作業系統對目錄中的小檔案處理存在效能問題.比如同一個目錄下檔案數量操作100萬,執行"fs -l "之類的命令會卡死.

    第四點: ,則會頻繁的進行檔案傳輸,對嚴重佔用網路/CPU資源.

主要取決於磁碟/網路的傳輸速率。[其實就是CPU,磁碟,網路卡之間的協同效率 即 跨物理機/機架之間檔案傳輸速率]

 

四、 HDFS中塊(block)的大小為什麼設定為128M?

1. HDFS中平均定址時間大概為10ms;

2. 經過測試發現,定址時間為傳輸時間的1%時,為最佳狀態;

    所以最佳傳輸時間為10ms/0.01=1000ms=1s

3. 目前磁碟的傳輸速率普遍為100MB/s  ,  網路卡普遍為千兆網路卡傳輸速率普遍也是100MB/s;

    計算出最佳block大小:100MB/s x 1s = 100MB

    所以我們設定block大小為128MB。

4. 實際在工業生產中,需要經過叢集之間的具體情況進行設定.

    比如: 跨物理機/機架之間檔案傳輸速率為200MB/s時,一般設定block大小為256MB ,  檔案傳輸速率為400MB/s時,一般設定block大小為512MB . 不過最大一般不會超過512MB , 因為目前固態硬碟的讀寫速率應該不會超過512MB(如果做RAID另行考慮.). 

 

 

如果大家知道其他的原因或者問題 ,麻煩留言告知,不勝感激....


 

 

參考:

https://blog.csdn.net/wx1528159409/article/details/84260023