最近看到這個面試問題,CSDN搜了半天也沒有確切答案,查詢資料思考後總結如下:
我們在HDFS中存儲數據是以塊(block)的形式存放在DataNode中的,塊(block)的大小可以通過設置dfs.blocksize來實現;
在Hadoop2.x的版本中,文件塊的默認大小是128M,老版本中默認是64M;
目錄
一、爲什麼HDFS中塊(block)不能設置太大,也不能設置太小?
二、 HDFS中塊(block)的大小爲什麼設置爲128M?
尋址時間:HDFS中找到目標文件塊(block)所需要的時間。
原理:
文件塊越大,尋址時間越短,但磁盤傳輸時間越長;
文件塊越小,尋址時間越長,但磁盤傳輸時間越短。
一、爲什麼HDFS中塊(block)不能設置太大,也不能設置太小?
1. 如果塊設置過大,
一方面,從磁盤傳輸數據的時間會明顯大於尋址時間,導致程序在處理這塊數據時,變得非常慢;
另一方面,mapreduce中的map任務通常一次只處理一個塊中的數據,如果塊過大運行速度也會很慢。
2. 如果塊設置過小,
一方面存放大量小文件會佔用NameNode中大量內存來存儲元數據,而NameNode的內存是有限的,不可取;
另一方面文件塊過小,尋址時間增大,導致程序一直在找block的開始位置。
因而,塊適當設置大一些,減少尋址時間,那麼傳輸一個由多個塊組成的文件的時間主要取決於磁盤的傳輸速率。
二、 HDFS中塊(block)的大小爲什麼設置爲128M?
1. HDFS中平均尋址時間大概爲10ms;
2. 經過前人的大量測試發現,尋址時間爲傳輸時間的1%時,爲最佳狀態;
所以最佳傳輸時間爲10ms/0.01=1000ms=1s
3. 目前磁盤的傳輸速率普遍爲100MB/s;
計算出最佳block大小:100MB/s x 1s = 100MB
所以我們設定block大小爲128MB。
ps:實際在工業生產中,磁盤傳輸速率爲200MB/s時,一般設定block大小爲256MB
磁盤傳輸速率爲400MB/s時,一般設定block大小爲512MB