@面試
NameNode
啓動(Fsimage)
載入內存,並執行編輯日誌(Edits)
中的各項操做。一旦在內存中成功創建文件系統元數據的映像,則建立一個新的Fsimage文件和一個空的編輯日誌。此時,NameNode開始監聽DataNode
請求。這個過程期間,NameNode
一直運行在安全模式
,即NameNode的文件系統對於客戶端來講是只讀
的,而且是有限只讀
,即在沒有啓動DataNode
的機器上的文件依舊不可讀!DataNode
啓動塊
列表的形式存儲在DataNode
中。在系統的正常操做期間,NameNode
會在內存中保留全部塊
位置的映射
信息。在安全模式
下,各個DataNode會向NameNode發送最新的塊列表信息,NameNode瞭解到足夠多
的塊位置信息以後,便可退出安全模式。安全模式
退出判斷當NN中所保存的全部塊的最小副本數(默認爲1) / 塊的總數 > 99.99%時,NN會自動離開安全模式!緩存
集羣處於安全模式,不能執行重要操做(寫操做)。集羣啓動完成後,自動退出安全模式。
(1)bin/hdfs dfsadmin -safemode get
(功能描述:查看安全模式狀態[on/off])
(2)bin/hdfs dfsadmin -safemode enter
(功能描述:進入安全模式)
(3)bin/hdfs dfsadmin -safemode leave
(功能描述:離開安全模式)
(4)bin/hdfs dfsadmin -safemode wait
(功能描述:輸入寫操做的命令,但不當即執行,而是放在緩存隊列中,等待安全模式退出再依次執行)安全
塊(block)
、副本數(replication)
的概念在hadoop2.x中,一個塊
的默認大小是128M
,至因而爲何請看我以前的文章HDFS的文件塊大小,
而一個塊的副本數
默認是3
。
這些參數在hdfs-default.xml
文件中有體現:bash
<property> <name>dfs.blocksize</name> <value>134217728</value> <description> The default block size for new files, in bytes. You can use the following suffix (case insensitive): k(kilo), m(mega), g(giga), t(tera), p(peta), e(exa) to specify the size (such as 128k, 512m, 1g, etc.), Or provide complete size in bytes (such as 134217728 for 128 MB). </description> </property> <property> <name>dfs.replication</name> <value>3</value> <description>Default block replication. 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. </description> </property>
知道了上面的概念,那麼就考你們一個小問題:
面試題:若是一個文件130M,將文件以塊的方式分割,去存儲,怎樣實現?ide
實際存儲 大小 副本 塊A: 128M 128M A0 A1 A2 塊B: 2M 128M B0 B1 B2
很明顯,130M的文件,128M的塊是存不下的,還須要2M的空間,雖然只有2M,但仍是得分配一個塊。oop
再來一個進階題:
題目: 塊大小128m,副本數3份,一個文件260m,請問多少塊,多少實際存儲?
存儲塊數:260%128=2塊…4M,因此須要3個塊,一個塊有3個副本,因此最後須要3*3=9塊
實際存儲
:260m * 3 =780M.net
有人看到這兒就懵了,爲何是260*3呢?日誌
分開算就一目瞭然了!
第一塊有128M,第二塊也是128M,第三塊是剩下的4M,每一塊有三個副本,那麼:
128 * 3 + 128 * 3 + 4 * 3 = (128+128+4) * 3 = 260 * 3code