(八)完全分散式模式搭建Hadoop叢集
小技巧:配置好一臺伺服器後,通過 scp -r /opt/zookeeper-3.4.7/ hadoop02:/opt/ 命令,把檔案傳送到另外兩臺機器。
1、搭建方案
- 引入zookeeper,通過註冊臨時節點來監控服務是否掛掉,保證能及時切換到正在執行的服務上,防止單點故障。
例如:NameNode(active)掛了 ,會有程序 FailOverController 來負責切換到 NameNode(standby)
ResourceManager(active)掛了, 會通過zookeeper自主切換到 ResourceManager(standby)
- 機器分配
主機名 | hadoop01 | hadoop02 | hadoop03 |
程序 | zookeeper | zookeeper | zookeeper |
NameNode(active) | NameNode(standby) | ||
FailOverController | FailOverController | ||
ResourceManager(active) | ResourceManager(standby) | ||
JournalNode | JournalNode | JournalNode | |
DataNode | DataNode | DataNode | |
NameNode | NameNode | NameNode |
2、環境準備
- 三臺linux伺服器,都配置好主機名。且每臺伺服器把主機名和ip關係配置到hosts檔案中
- 配置免密登入:每臺機器給自己和其他機器都發送一次免密登入。以hadoop01為例:
生成祕鑰,輸入命令後一直回車即可 | ssh-keygen |
把祕鑰傳送給自己 | ssh-copy-id [email protected] |
把祕鑰傳送給hadoop02 | ssh-copy-id [email protected] |
把祕鑰傳送給hadoop03 | ssh-copy-id [email protected] |
-
三臺伺服器防火牆確保關閉
3、zookeeper叢集搭建
搭建步驟參看:
https://mp.csdn.net/postedit/82818981
https://mp.csdn.net/postedit/82937890
4、hadoop叢集搭建
首先安裝和配置hadoop01節點,配置好後把hadoop整個資料夾拷貝到另外兩臺機器。
- vim hadoop-env.sh
配置jdk安裝所在目錄,hadoop配置檔案所在目錄
export JAVA_HOME=/usr/java/jdk1.8.0_181-amd64
export HADOOP_CONF_DIR=/opt/hadoop-2.7.1/etc/hadoop
- vim core-site.xml
該目錄需要手動建立:/opt/hadoop-2.7.1/tmp
<configuration>
<!--用來指定hdfs的老大,ns為固定屬性名,表示兩個namenode-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<!--用來指定hadoop執行時產生檔案的存放目錄-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop-2.7.1/tmp</value>
</property>
<!--執行zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
</configuration>
- vim hdfs-site.xml
下列目錄需要手動建立:
/opt/hadoop-2.7.1/journal
/opt/hadoop-2.7.1/tmp/namenode
/opt/hadoop-2.7.1/tmp/datanode
<configuration>
<!--執行hdfs的nameservice為ns,和core-site.xml保持一致-->
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<!--ns下有兩個namenode,分別是nn1,nn2-->
<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1,nn2</value>
</property>
<!--nn1的RPC通訊地址-->
<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>hadoop01:9000</value>
</property>
<!--nn1的http通訊地址-->
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>hadoop01:50070</value>
</property>
<!--nn2的RPC通訊地址-->
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>hadoop02:9000</value>
</property>
<!--nn2的http通訊地址-->
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>hadoop02:50070</value>
</property>
<!--指定namenode的元資料在JournalNode上的存放位置,這樣,namenode2可以從jn叢集裡獲
取最新的namenode的資訊,達到熱備的效果-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/ns</value>
</property>
<!--指定JournalNode存放資料的位置-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hadoop-2.7.1/journal</value>
</property>
<!--開啟namenode故障時自動切換-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--配置切換的實現方式
由這個類來實現故障時的切換-->
<property>
<name>dfs.client.failover.proxy.provider.ns</name>
<value>
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--配置隔離機制
祕鑰認證機制-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!--配置隔離機制的ssh登入祕鑰所在的位置
祕鑰存放目錄-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!--配置namenode資料存放的位置,可以不配置,如果不配置,預設用的是
core-site.xml裡配置的hadoop.tmp.dir的路徑-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///opt/hadoop-2.7.1/tmp/namenode</value>
</property>
<!--配置datanode資料存放的位置,可以不配置,如果不配置,預設用的是
core-site.xml裡配置的hadoop.tmp.dir的路徑-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///opt/hadoop-2.7.1/tmp/datanode</value>
</property>
<!--配置block副本數量-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--設定hdfs的操作許可權,false表示任何使用者都可以在hdfs上操作檔案
生產環境是不會這樣設定的-->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
- 配置mapred-site.xml
先複製一份模板並重命名 :cp mapred-site.xml.template mapred-site.xml
然後編輯: vim mapred-site.xml
<configuration>
<property>
<!--指定mapreduce執行在yarn上-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
- vim yarn-site.xml
<configuration>
<!-- 開啟YARN HA(高可用high available) -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定兩個resourcemanager的名稱 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 配置rm1,rm2的主機 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop03</value>
</property>
<!--開啟yarn恢復機制-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--執行rm恢復機制實現類-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>
org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!-- 配置zookeeper的地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<!-- 指定YARN HA的名稱
為yarn取一個別名,看日誌可用 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-ha</value>
</property>
<property>
<!--指定yarn的老大 resoucemanager的地址
即哪一個resourcemanager是active狀態-->
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>
<property>
<!--NodeManager獲取資料的方式-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
- vim 置slaves
配置datanode,nodemanager(儲存資料和計算資料的節點資訊)
hadoop01
hadoop02
hadoop03
- vim /etc/profile
在檔案末尾新增jdk和hadoop的配置資訊, 並執行命令 source /etc/profile 讓配置生效。
注意另外兩臺機器也要執行source命令,使其生效。
#JDK安裝目錄
JAVA_HOME=/usr/java/jdk1.8.0_181-amd64
#hadoop的安裝目錄
HADOOP_HOME=/opt/hadoop-2.7.1
PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH HADOOP_HOME
5、啟動
5.1、先啟動zookeeper叢集
進入zookeeper安裝目錄 | cd /opt/zookeeper-3.4.7/bin/ |
啟動三臺伺服器上的zookeeper | sh zkServer.sh start |
全部啟動後檢查各自的狀態 | sh zkServer.sh status |
5.2、格式化zookeeper
在zookeeper的leader節點上執行命令 hdfs zkfc -formatZK,作用是在zookeeper叢集上生成hadoop-ha節點(ns節點)
5.3、啟動分散式檔案系統
下面步驟可以用一步來替代:start-dfs.sh,第一次建議一步步執行。對應的停止操作為 stop-dfs.sh
- 啟動journalnode叢集
分別在三臺伺服器上,切換到hadoop安裝目錄的sbin目錄,啟動journalnode sh hadoop-daemon.sh start journalnode 。或者只在一臺機器上執行一次命令: sh hadoop-daemons.sh start journalnode 去啟動配置好的所有journalnode。
- 格式化hadoop01節點的namenode : hadoop namenode -format
- 啟動hadoop01節點的 namenode:sh hadoop-daemon.sh start namenode
- 把hadoop02節點的namenode配置為 standby,並啟動namenode
配置為standy狀態:hdfs namenode -bootstrapStandby
啟動namenode:sh hadoop-daemon.sh start namenode
- 啟動datanode
分別在三臺伺服器上執行命令:hadoop-daemon.sh start datanode
- 啟動失敗恢復程序(zkfc)
在hadoop01,hadoop02節點上執行: hadoop-daemon.sh start zkfc
5.4、啟動MapReduce
- 在hadoop01節點啟動 ResourceManager(active) start-yarn.sh,該命令會啟動hadoop01節點的 ResourceManager,並根據配置去啟動三個節點的NodeManager。
- 在hadoop03節點啟動 Resoucemanager(standby) yarn-daemon.sh start resourcemanager
6、訪問
檢視檔案系統:http://192.168.101.100:50070
訪問yarn控制檯:http://192.168.101.100:8088
此時kill掉hadoop01節點的NameNode(active)程序,會發現hadoop02節點的NameNode由standby狀態變為active狀態。由此看出高可用的hdfs搭建成功。