文章目錄
- 背景
- 架構
- HDFS HA配置
- 錯誤原因
- 解決方案
- 方案一
- 方案二
- 方案三(首先查看自己各參數文件是否配置出錯)
- 后記
- 補充
- failover
- transitionToActive
- 常用端口號及配置文件
- 常用端口號
- hadoop3.x
- hadoop2.x
- 常用配置文件
這里說一下配置Hadoop HA集群可能出現的兩種情況,第一種就是兩個NameNode都是standby,第二種就是主Master是standby,從Master是active。
背景
針對Hadoop 1.x中可能出現的NameNode單點故障(SPOF)或者短時間無法使用的情況,Hadoop 2.x 通過增加一個NameNode的方式進行了改善,而增加一個NameNode后,實際在沒有出現問題時,只需要一個NameNode,所以兩個NameNode一個處于Standby狀態,一個處于Active狀態。Standby不對外提供服務,僅同步Active NameNode的狀態,以便Active NameNode出現問題時及時切換成Active狀態。
架構
Hadoop 2.x 的兩個NameNode一般會配置在兩臺獨立的機器上,Active NameNode會響應集群客戶端,而Standby NameNode只是作為Active NameNode的備份,保證在Active NameNode出現問題時能夠快速的替代它。
Standby NameNode通過JournalNodes的通信來與Active NameNode保持同步。
Active NameNode和Standby NameNode在哪個節點上,是由zookeeper通過主備選舉機制來確定的。
HDFS HA配置
NameNode:對應配置相同的兩臺物理機,分別運行Active NameNode和Standby NameNode。
JournalNode:JournalNode不會耗費太多的資源,可以和其它進程部署在一起,如NameNode、Datanode、ResourceManager等,需要至少3個且為基數,這樣可以允許(N-1)/2個JNS進程失敗。
DataNode:根據數據量的大小和處理數據所需資源進行配置,一般實際應用中數量較多,且分布在較多的機器上。
NameNode和SecondaryNameNode不要安裝在同一臺服務器
ResourceManager也很消耗內存,不要和NameNode、SecondaryNameNode放在同一臺機器上。
通過hdfs haadmin -getServiceState nn1
和hdfs haadmin -getServiceState nn2
命令查看,發現兩個NameNode的狀態都是standby
通過hdfs dfsadmin -report
命令查看,發現HDFS數據均為0
錯誤原因
當首次執行命令hadoop namenode -format
格式化NameNode時,會在dfs.namenode.name.dir對應路徑下生成current/VERSION文件,其中記錄了clusterID,同時dfs.datanode.data.dir對應的DataNode目錄中也會生成current/VERSION文件,其中clustreID的與NameNode中clusterID的值相同。
當再次執行hadoop namenode -format
命令時,NameNode對應的目錄下會重新生成clusterID,導致和DataNode對應的clusterID不一致,從而造成上述問題。
解決方案
方案一
- 關掉集群
./stop-dfs.sh
- 刪掉各個節點上DataNode對應的目錄
rm -rf data
- 格式化NameNode
hadoop namenode -format
- 重啟集群
./start-dfs.sh
方案二
- 關掉集群
./stop-dfs.sh
- 編輯clusterID使Namenode和DataNode同步
vim clusterID
- 重啟集群
./start-dfs.sh
注意:
在生產環境中,謹慎使用hadoop namenode -format
命令。以上操作是在首次搭建集群時且沒有重要數據的情況下執行的。
hdfs haadmin -transitionToActive nn1
方案三(首先查看自己各參數文件是否配置出錯)
1、首先在hdfs-site.xml中添加下面的參數,該參數的值默認為false:
<property><name>dfs.ha.automatic-failover.enabled.ns</name><value>true</value>
</property>
2、在core-site.xml文件中添加下面的參數,該參數的值為ZooKeeper服務器的地址,ZKFC將使用該地址。
<property><name>ha.zookeeper.quorum<name><value>spark01.kfk.com:2181,spark02.kfk.com:2181,spark03.kfk.com:2181<value>
<property>
首先你要確定不用ha的時候你的hadoop集群是正常的,不然找錯誤的方向就偏離了
配置HA 需要zookeeper,先要看看是不是zookeeper沒有配置好的問題
如果都正常,在hadoop安裝目錄執行sbin/hadoop-daemon.sh start zkfc
,這句是啟動zookeeper選舉制度,然后執行 hdfs haadmin -transitionToActive nn1
,其中nn1是你的namenode中的一個(如果是新配置的HAhadoop集群,可能是zkfc(DFSZKFailoverController)沒有格式化導致namenode節點的自動切換機制沒有開啟)
在HA或者HDFS中,上面的兩個參數還需要以NameServiceID為后綴,比如dfs.ha.automatic-failover.enabled.mycluster。除了上面的兩個參數外,還有其它幾個參數用于自動故障轉移,比如ha.zookeeper.session-timeout.ms,但對于大多數安裝來說都不是必須的。
在添加了上述的配置參數后,下一步就是在ZooKeeper中初始化要求的狀態,可以在任一NameNode中運行hdfs zkfc -formatZK
命令實現該目的,該命令在ZooKeeper中創建znode
執行該命令需要進入Hadoop的安裝目錄下面的bin目錄中找到hdfs這個命令,輸入上面的命令執行,然后就可以修復這個問題了。
注意:之前,先得啟動好每臺機器的zookeeper進程。
后記
對于hdfs的一些命令,不熟悉的情況下,可以先用以下的命令查看。
hdfs -help 查看命令
hdfs haadmin -help
這里記錄一下常用的命令
hdfs haadmin -getAllServiceState 查詢所有NN的服務狀態
hdfs haadmin -transitionToActive nn1 開啟nn1為active狀態
hdfs haadmin -transitionToActive nn2 開啟nn2為active狀態
hdfs haadmin -transitionToStandby nn1 開啟nn1為standby狀態
hdfs haadmin -failover nn1 nn2 手動執行故障轉移
hadoop-daemon.sh start namenode 啟動 namemode進程
kill -9 namenode進程號 使namenode進程掛掉
yarn rmadmin -getServiceState rm1 查看resourcemanager節點狀態
hdfs --daemon start/stop namenode/datanode/secondarynamenode 分別啟動/停止HDFS組件
yarn --daemon start/stop resourcemanager/nodemanager 啟動/停止YARN
注意,其實hdfs自帶的命令里,都提供了,若兩者都是standby狀態怎么執行。若兩者都是active狀態怎么執行。這里,不多贅述。
補充
failover
切換NameNode的主備狀態,一般推薦用此方式來切換主備
執行hdfs haadmin -failover <serviceId of current active> <serviceId of new active>
命令,切換NameNode的主備狀態。
例如:
nn1當前是Active NameNode,想讓nn2成為新的Active NameNode,可執行以下命令。
haadmin -getAllServiceState
hdfs haadmin -failover nn2 nn1 將 nn1 變為 主
如果nn2當前已是Active NameNode,執行以下命令后,nn2仍為新的Active NameNode。
haadmin -getAllServiceState
hdfs haadmin -failover nn1 nn2 將 nn2 變為 主
transitionToActive
將給定的NameNode切換成主,不會做fencing(和failover有區別的點)
當開啟了故障自動切換failover(dfs.ha.automatic-failover.enabled=true)之后,無法手動進行。想要 transitionToActive 切換主,就需要 帶上 強制手動的標志 --forcemanual
hdfs haadmin -transitionToActive nn1
此時 nn1: standby nn2: active
hdfs haadmin -getAllServiceState
hdfs haadmin -transitionToActive --forcemanual nn1
此時提示的是 nn2 已經是 active,切換不起作用
當active節點正常時,使用hdfs haadmin -transitionToActive命令對兩個namenode節點切換都不起作用.
此時試試將 active 狀態切換成 standby
hdfs haadmin -getAllServiceState
hdfs haadmin -transitionToStandby --forcemanual nn2
hdfs haadmin -getAllServiceState
此時提示的是 nn2 已經是 standby,切換生效
當active節點正常時,執行hdfs haadmin -transitionToStandby命令可以將active的namenode節點轉換成standby狀態。
常用端口號及配置文件
常用端口號
hadoop3.x
-
HDFS NameNode 內部通常端口:8020/9000/9820
-
HDFS NameNode 用戶查詢端口:9870
-
Yarn查看任務運行情況:8088
-
歷史服務器:19888
hadoop2.x
-
HDFS NameNode 內部通常端口:8020/9000
-
HDFS NameNode 用戶查詢端口:50070
-
Yarn查看任務運行情況:8088
-
歷史服務器:19888
常用配置文件
-
3.x core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml workers
-
2.x core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml slaves
轉載自 :https://blog.csdn.net/u014727709/article/details/131194566
歡迎start,歡迎評論,歡迎指正