Hadoop叢集之淺析安全模式
阿新 • • 發佈:2020-07-10
@[toc]
## 叢集啟動順序:
1. `NameNode`啟動
NameNode啟動時,首先將映象檔案`(Fsimage)`載入記憶體,並執行編輯日誌`(Edits)`中的各項操作。一旦在記憶體中成功建立檔案系統元資料的映像,則建立一個新的Fsimage檔案和一個空的編輯日誌。此時,NameNode開始監聽`DataNode`請求。這個過程期間,`NameNode`一直執行在`安全模式`,即NameNode的檔案系統對於客戶端來說是`只讀`的,並且是`有限只讀`,即在沒有啟動`DataNode`的機器上的檔案依舊不可讀!
2. `DataNode`啟動
系統中的資料塊的位置並不是由NameNode維護的,而是以`塊`列表的形式儲存在`DataNode`中。在系統的正常操作期間,`NameNode`會在記憶體中保留所有`塊`位置的`對映`資訊。在`安全模式`下,各個DataNode會向NameNode傳送最新的塊列表資訊,NameNode瞭解到`足夠多`的塊位置資訊之後,即可退出安全模式。
3. `安全模式`退出判斷
如果滿足“最小副本條件”,NameNode會在30秒鐘之後就退出安全模式。所謂的最小副本條件指的是在整個檔案系統中99.9%的塊滿足最小副本級別(預設值:dfs.replication.min=1)。在啟動一個剛剛格式化的HDFS叢集時,因為系統中還沒有任何塊,所以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的檔案塊大小](https://blog.csdn.net/DTFT_/article/details/107186512),
而一個塊的`副本數`預設是`3`。
這些引數在`hdfs-default.xml`檔案中有體現:
```bash
dfs.blocksize
134217728
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).
dfs.replication
3
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.
```
知道了上面的概念,那麼就考大家一個小問題:
==面試題==:**如果一個檔案130M,將檔案以塊的方式分割,去儲存,怎樣實現?**
實際儲存 大小 副本
塊A: 128M 128M A0 A1 A2
塊B: 2M 128M B0 B1 B2
很明顯,130M的檔案,128M的塊是存不下的,還需要2M的空間,雖然只有2M,但還是得分配一個塊。
再來一個進階題:
==題目==: 塊大小128m,副本數3份,一個檔案260m,請問多少塊,多少實際儲存?
儲存塊數:260%128=2塊…4M,所以需要3個塊,一個塊有3個副本,所以最後需要3*3=9塊
`實際儲存`:260m * 3 =780M
有人看到這兒就懵了,為什麼是260*3呢?
分開算就一目瞭然了!
第一塊有128M,第二塊也是128M,第三塊是剩下的4M,每一塊有三個副本,那麼:
128 * 3 + 128 * 3 + 4 * 3 = (128+128+4) * 3 =