介紹
HDFS滾動升級可以升級單獨的HDFS守護進程. 例如, datanode們可以獨立于namenode來升級. 一個namenode也可以獨立于其他的namenode們來升級. namenode們也可以獨立于datanode們和journal node們升級.
升級
在Hadoop版本2中, HDFS支持高可用(HA)namenode服務(wù)并結(jié)合兼容性. 這兩項能力使其可以在避免停機時間的情況升級HDFS. 要無停機地升級一個HDFS集群, 這個集群就必須是配置為高可用的.
如果升級后, 在新版中有任何在舊版本中不能使用的新特性, 那么這次升級就必須按以下步驟進行:
- 關(guān)閉新特性
- 升級集群
- 開啟新特性
請注意, 滾動升級是在Hadoop 2.4版本開始支持的.
無停機升級
在一個高可用集群中, 有至少2個namenodes(NNS), 多個datanodes(DNs), 少數(shù)JournalNodes(JNs)和少數(shù)Zookeeper節(jié)點(ZKNs). JNs相當穩(wěn)定,在多數(shù)情況下, 升級HDFS時不需要升級. 在本文描述的滾動升級中, 只考慮升級NNs(namenodes)和DNs(datanodes), 但是JNs和ZKNs不考慮. 升級JNs和ZKNs可能會導(dǎo)致集群停機.(按: Zookeeper其實也可以進行滾動升級)
升級非聯(lián)邦集群
假設(shè)集群有兩個namenodes: NN1和NN2, 各種處于活動和待機狀態(tài). 按以下步驟進行高可用集群升級:
準備滾動升級
1.1. 執(zhí)行"hdfs dfsadmin rollingUpgrade prepare"以生成一個文件系統(tǒng)鏡像以供回滾.
1.2. 執(zhí)行"hdfs dfsadmin -rollingUpgrade query
"來檢查回滾鏡像的狀態(tài). 來回執(zhí)行并等待, 直到顯示消息"Proceed with rolling upgrade".升級活動和待機NNs
2.1. 關(guān)閉并升級NN2 (待機節(jié)點)
2.2. 用"-rollingUpgrade started
"選項, 啟動NN2到待機狀態(tài).
2.3. 從NN1(活動)切換NN2(待機), NN2成為活動節(jié)點, NN1變成待機節(jié)點.
2.4. 關(guān)閉并重啟NN1
2.5. 用"-rollingUpgrade started
"選項, 啟動NN1到待機狀態(tài).升級DNs
3.1. 選擇一小部分datanodes(例如, 某個機架上的所有datanodes).
3.1.1 執(zhí)行"hdfs dfsadmin -shutdownDatanode <DATANODE_HOST:IPC_PORT> upgrade
"來關(guān)閉其中某一個指定的datanodes.
3.1.2 執(zhí)行 "hdfs dfsadmin -getDatanodeInfo <DATANODE_HOST:IPC_PORT>
" 來檢查并等待datanode關(guān)閉.
3.1.4. 同時對所有要操作所有datanode執(zhí)行以上操作.
3.2 反復(fù)執(zhí)行上述步驟直到集群中所有的datanode都被升級.結(jié)束滾動升級
4.1. 執(zhí)行"hdfs dfsadmin -rollingUpgrade finalize
"來結(jié)束滾動升級.
升級聯(lián)盟集群
在一個聯(lián)盟集群中, 有多個命名空間, 每個命名空間都有各自的活動和待機NNs. 升級一個聯(lián)盟集群的過程類似于升級非聯(lián)盟集群, 區(qū)別在于第一步和第四步在每一個命名空間上都執(zhí)行, 而第二步在每一對活動和待機namenodes上執(zhí)行. 例如:
- 為每個命名空間準備滾動升級
- 升級各個命名空間的活動和待機namenodes
- 升級datanodes
- 結(jié)束各個命名空間的升級
停機并升級
對于非高可用的集群, 是不可能升級HDFS且避免停機, 因為要重啟namenodes. 不過, datanodes還是可以滾動升級的.
升級非高可用集群
在一個非高可用集群中, 有一個Namenode(NN),一個SecondaryNameNode(SNN)和多個datanodes(DNs). 升級一個非高可用集群的過程類似于升級一個高可用集群, 除了第二步"升級活動和待機節(jié)點"要改成以下步驟:
- 升級namenode和secondary namenode
1.1 關(guān)閉Secondary namenode
1.2 關(guān)閉并升級Namenode
1.3 用"-rollingUpgrade started
"選項啟動Namenode
1.4 升級和啟動Secondary Namenode
降級和回滾
當升級的版本不是需要的版本,或者在某些不太可能的情況下, 升級失敗了(因為新版本中的某些bug), 管理員可以選擇降級HDFS到升級之前的版本, 或者回滾到升級前的版本和狀態(tài).
請注意, 降級可以用滾動方式進行, 但是回滾不行. 回滾時就要停機.
請注意, 降級和回滾只能在一個滾動升級開始后, 和升級終止之間進行. 一個升級過程可以被"結(jié)束", 降級或者回滾 其中之一操作終止. 所以, 結(jié)束升級,或者降級之后,或無法回滾, 或者結(jié)束后無法降級.
降級
降級把系統(tǒng)恢復(fù)到升級前版本,且保持用戶數(shù)據(jù). 假設(shè)在時間點T, 滾動升級開始, 這個升級被降級所終止的話, 在時間點T之前或者之后創(chuàng)建的文件都保持在HDFS上, 在時間點T之前或之后刪除的文件也是在HDFS里被刪除的.
在新版本和舊版本之間, 只有當兩邊的namenode版本和datanode版本還沒在這兩個版本之間改變時, 新版本才能降級到舊版本.(不清楚, 請賜教,謝謝. A newer release is downgradable to the pre-upgrade release only if both the namenode layout version and the datanode layout version are not changed between these two releases.)
在一個高可用集群, 當滾動升級從舊版本到新版本在進行中時, 是可以滾動方式降級的, 升級的機器回到舊版本. 同前例, 假設(shè)NN1和NN2各自在活動和待機狀態(tài). 以下是無停機滾動降級的步驟:
降級Datanodes
1.1 選擇一小部分datanodes(例如, 某個機架上的所有datanodes).
1.1.1. 執(zhí)行"hdfs dfsadmin -shutdownDatanode <DATANODE_HOST:IPC_PORT> upgrade" 來關(guān)閉其中某個datanode.
1.1.2. 執(zhí)行"hdfs dfsadmin -getDatanodeInfo <DATANODE_HOST:IPC_PORT>
" 來檢查并等待datanode關(guān)閉.
1.1.3. 降級并重新啟動datanode
1.1.4. 對所有選擇的datanode同時執(zhí)行上述操作.
1.2 對所有已經(jīng)升級的datanode同時執(zhí)行上述操作, 直到集群中所有datanode都被降級.降級活動和待機的namenodes
2.1. 關(guān)閉和降級待機的NN2
2.2. 正常重啟NN2到待機狀態(tài)
2.3. 從活動的NN1切換到待機NN2上, NN2變成活動狀態(tài), NN1變成待機狀態(tài).
2.4. 關(guān)閉和降級NN1
2.5. 重啟NN1到待機狀態(tài)結(jié)束滾動降級
3.1 執(zhí)行"hdfs dfsadmin -rollingUpgrade finalize
"來結(jié)束滾動降級.
請注意, datanodes必須在namenode降級之前降級, 因為通訊協(xié)議是向下兼容的而不是向上兼容的. 例如老版本的datanode可以和新版本的namenode通訊,但是新版本的datanode未必能和老版本的namenode通訊.
回滾
回滾把系統(tǒng)恢復(fù)到升級前版本, 還把用戶的數(shù)據(jù)恢復(fù)到升級前狀態(tài). 假設(shè)在時間點T, 滾動升級開始, 這個升級被回滾所終止的話, 在時間點T之前創(chuàng)建的文件都保持在HDFS上, 時間點T之后創(chuàng)建的文件就不存在了. 在時間點T之前的文件在HDFS里被刪除的, 在時間點T之后刪除的文件就被恢復(fù)了.
從新版本回滾到舊版本是一直支持的. 但是, 回滾操作不能滾動執(zhí)行. 這需要停機時間. 設(shè)NN1和NN2分別處于活動和待機狀態(tài). 以下是回滾步驟:
- 回滾HDFS
1.1. 關(guān)閉所有namenodes和datanodes
1.2. 在所有機器上恢復(fù)到舊版本
1.3. 用"-rollingUpgrade rollback
"選項吧NN1啟動為活動狀態(tài).
1.4. 用"-bootstrapStandby"選項執(zhí)行NN2,并啟動為待機狀態(tài).
1.5. 以"-rollback"選項啟動DNs
滾動升級用到的命令和啟動選項
DFSAdmin 命令
hdfs dfsadmin -rollingUpgrade <query|prepare|finalize>
執(zhí)行一個滾動升級操作
選項 | 說明 |
---|---|
query | 查詢當前滾動升級狀態(tài) |
prepare | 準備一個新的滾動升級 |
finalize | 結(jié)束當前滾動升級 |
dfsadmin -getDatanodeInfo
hdfs dfsadmin -getDatanodeInfo <DATANODE_HOST:IPC_PORT>
獲取指定datanode的信息, 這個命令就像unix的ping命令,可以檢查一個datanode是否還活著
dfsadmin -shutdownDatanode
hdfs dfsadmin -shutdownDatanode <DATANODE_HOST:IPC_PORT> [upgrade]
提交一個關(guān)閉請求到指定的datanode. 如果upgrade選項指定了, 訪問這個datanode的客戶端都會被指示要等這個datanode重啟, 同時快速啟動模式也要被激活. 當重啟不夠及時, 客戶端就超市,并忽略這個datanode. 在這種情況下, 快速啟動模式就被關(guān)閉.
請注意, 這個命令并不會等到datanode完全關(guān)閉. "hdfs dfsadmin -getDatanodeInfo"命令可以檢查datanode是否被完成了關(guān)閉.
Namenode 啟動選項
namenode -rollingUpgrade
hdfs namenode -rollingUpgrade <rollback|started>
當一個滾動升級在進行中, -rollingUpgrade 啟動選項可以指定不同滾動升級行為
選項 | 說明 |
---|---|
rollback | 恢復(fù)namenode回到升級前的版本,同時回滾用戶數(shù)據(jù)到升級前狀態(tài) |
started | 指定已啟動一個滾動升級, namenode啟動時可以允許鏡像目錄喲不同的layout版本 |