1. 程式人生 > >(八)完全分散式模式搭建Hadoop叢集

(八)完全分散式模式搭建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搭建成功。