Hadoop2.7.2之叢集搭建(高可用)
叢集規劃
主機名 | ip | 安裝的軟體 | 程序 |
---|---|---|---|
hadoop01 | 192.168.1.101 | jdk、hadoop | NN、DFSZKFailoverController |
hadoop02 | 192.168.1.102 | jdk、hadoop | NN、DFSZKFailoverController |
hadoop03 | 192.168.1.103 | jdk、hadoop | RM |
hadoop04 | 192.168.1.104 | jdk、hadoop、zookeeper | DN、NM、journalnode |
hadoop05 | 192.168.1.105 | jdk、hadoop、zookeeper | DN、NM、journalnode |
hadoop06 | 192.168.1.106 | jdk、hadoop、zookeeper | DN、NM、journalnode |
六臺主機
使用者名稱:hadoop
密碼:12345678
設定主機名對映(root使用者)
將本機的主機名和IP建立對映關係
vi /etc/hosts
加入如下檔案:
192.168.2.101 hadoop01 192.168.2.102 hadoop02 192.168.2.103 hadoop03 192.168.2.104 hadoop04 192.168.2.105 hadoop05 192.168.2.106 hadoop06
拷貝/etc/hosts到其它主機
scp /etc/hosts hadoop02:/etc/
scp /etc/hosts hadoop03:/etc/
scp /etc/hosts hadoop04:/etc/
scp /etc/hosts hadoop05:/etc/
scp /etc/hosts hadoop06:/etc/
開放常用埠(root使用者)
#關閉防火牆
sudo systemctl stop firewalld.service
#關閉開機啟動
sudo systemctl disable firewalld.service
建立專有的使用者(root使用者)
一般是建專有的hadoop使用者,不在root使用者上面搭建
建立組和使用者
這裡每臺虛擬主機都應該有hadoop使用者
#先建立組cloud
groupadd cloud
#建立使用者並加入組cloud
useradd -g cloud hadoop
#修改使用者hadoop的密碼
passwd hadoop
將hadoop使用者加到sodu列表
1、檢視/etc/sudoers的許可權
ls -l /etc/sudoers
可以看的是隻讀許可權,如果我們要修改就必須先改變該檔案的許可權
2、修改許可權
chmod 777 /etc/sudoers
3、將hadoop新增root許可權
vim /etc/sudoers
在root下加入下面hadoop使用者
4、還原許可權
chmod 440 /etc/sudoers
拷貝/etc/sudoers到其它主機
scp /etc/sudoers hadoop02:/etc/
scp /etc/sudoers hadoop03:/etc/
scp /etc/sudoers hadoop04:/etc/
scp /etc/sudoers hadoop05:/etc/
scp /etc/sudoers hadoop06:/etc/
配置免密碼登入(hadoop使用者)
切換hadoop使用者
su hadoop
進入到當前使用者的根目錄
cd ~
檢視所有檔案
ls –la
進入.ssh目錄
cd .ssh
生產公鑰和私鑰(四個回車)
ssh-keygen -t rsa
執行完這個命令後,會生成兩個檔案id_rsa(私鑰)、id_rsa.pub(公鑰)
將公鑰拷貝到要免登陸的機器上
ssh-copy-id 192.168.2.101
ssh-copy-id 192.168.2.102
ssh-copy-id 192.168.2.103
ssh-copy-id 192.168.2.104
ssh-copy-id 192.168.2.105
ssh-copy-id 192.168.2.106
這時會在192.168.2.102主機的.ssh/下產生一個名為authorized_keys的檔案,這時通過 ssh 192.168.2.102時可以直接免登陸進入主機
如下:
同理可以給其他機器也設定免密碼登入。
準備軟體
在/home/hadoop/下建立cloud資料夾,用來安裝相關軟體,同時所用安裝包放在cloud下的soft-install資料夾下,如:
cd /home/hadoop
mkdir cloud
mkdir soft-install
在soft-install裡上傳我們需要的軟體:
上傳我們所需要的軟體到這個目錄
安裝jdk
解壓
tar -zxvf jdk-8u91-linux-x64.tar.gz -C /home/hadoop/cloud/
配置環境變數
# 修改配置檔案
sudo vi /etc/profile
# 在最後下新增
export JAVA_HOME=/home/hadoop/cloud/jdk1.8.0_91
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 重新整理配置檔案
source /etc/profile
將jdk和環境變數分別拷貝到其他主機上
可以直接將cloud資料夾複製過去
scp -r cloud/ hadoop02:/home/hadoop/
scp -r cloud/ hadoop03:/home/hadoop/
scp -r cloud/ hadoop04:/home/hadoop/
scp -r cloud/ hadoop05:/home/hadoop/
scp -r cloud/ hadoop06:/home/hadoop/
將環境變數拷貝到其他主機下
sudo scp /etc/profile hadoop02:/etc/
sudo scp /etc/profile hadoop03:/etc/
sudo scp /etc/profile hadoop04:/etc/
sudo scp /etc/profile hadoop05:/etc/
sudo scp /etc/profile hadoop06:/etc/
重新整理環境變數
source /etc/profile
安裝zookeeper
安裝
前面我們已經安裝的jdk,現在我們在hadoop04、hadoop05、hadoop06上安裝Zookeeper
1、解壓
tar -zxvf zookeeper-3.4.8.tar.gz -C /home/hadoop/cloud/
2、修改Zookeeper的預設配置 conf/zoo_sample.cfg
mv zoo_sample.cfg zoo.cfg
vi zoo.cfg
配置如下:
#修改dataDir指向我們資料
dataDir=/home/hadoop/cloud/zookeeper-3.4.8/data
#並在最後新增
server.1=hadoop04:2888:3888
server.2=hadoop05:2888:3888
server.3=hadoop06:2888:3888
3、在/home/hadoop/cloud/zookeeper-3.4.8/目錄下建立data資料夾
mkdir data
4、在data資料夾下建立myid檔案指明本機id
vim myid
id 分別對應為hadoop04為1,hadoop05為2,hadoop06為3 後面我們再統一拷貝
5、複製zookeeper-3.4.8到105、106機器上並修改相應的myid
scp -r zookeeper-3.4.8/ hadoop04:/home/hadoop/cloud/
scp -r zookeeper-3.4.8/ hadoop05:/home/hadoop/cloud/
scp -r zookeeper-3.4.8/ hadoop06:/home/hadoop/cloud/
啟動Zookeeper
分別在hadoop04、hadoop05、hadoop06上啟動Zookeeper
#執行/home/hadoop/cloud/zookeeper-3.4.8/bin目錄下的指令碼啟動
./zkServer.sh start
檢視zookeeper的狀態
./zkServer.sh status
在bin/目錄下執行,執行結果如下說明成功(此時至少執行2臺)
其實我們可以找到leader 然後stop,會發現Zookeeper會立即切換Leader
安裝hadoop
安裝(現在hadoop01安裝,然後複製其他機器)
解壓
tar -zxvf hadoop-2.7.2.tar.gz -C /home/hadoop/cloud/
配置環境變數
# 修改配置檔案
sudo vi /etc/profile
# 在最後下新增
export HADOOP_HOME=/home/hadoop/cloud/hadoop-2.7.2
export PATH=$PATH:$HADOOP_HOME/bin
# 重新整理配置檔案
source /etc/profile
測試:
which hadoop
修改配置檔案(6個)
hadoop-env.sh
# The java implementation to use.
export JAVA_HOME=/home/hadoop/cloud/jdk1.8.0_91
core-site.xml
<configuration>
<!-- 指定hadoop執行時產生檔案的儲存路徑 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/cloud/hadoop-2.7.2/tmp</value>
</property>
<!-- 指定hdfs的nameservice為ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<!-- 指定zookeeper地址,多個用,分割 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop04:2181,hadoop05:2181,hadoop06:2181</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<!-- dfs.nameservices 名稱空間的邏輯名稱,多個用,分割 -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!-- 指定ns1下有兩個namenode,分別是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!-- 指定nn1的RPC通訊地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>hadoop01:8020</value>
</property>
<!-- 指定nn1的HTTP通訊地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>hadoop01:50070</value>
</property>
<!-- 指定nn2的RPC通訊地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>hadoop02:8020</value>
</property>
<!-- 指定nn2的HTTP通訊地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>hadoop02:50070</value>
</property>
<!-- 指定namenode的元資料存放的Journal Node的地址,必須基數,至少三個 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop04:8485;hadoop05:8485;hadoop06:8485/ns1</value>
</property>
<!--這是JournalNode程序保持邏輯狀態的路徑。這是在linux伺服器檔案的絕對路徑-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/cloud/hadoop-2.7.2/journal/</value>
</property>
<!-- 開啟namenode失敗後自動切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失敗自動切換實現方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔離機制方法,多個機制用換行分割 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔離機制時需要ssh免登陸 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔離機制超時時間30秒 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
mapred-site.xml.template
需要重新命名: mv mapred-site.xml.template mapred-site.xml
<configuration>
<!-- 通知框架MR使用YARN -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
yarn-site.xml
<configuration>
<!-- 指定YARN的老大(RM)的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop03</value>
</property>
<!-- reducer取資料的方式是mapreduce_shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
slaves
hadoop04
hadoop05
hadoop06
並在 hadoop-2.7.2檔案下 建立tmp檔案:
mkdir tmp
將配置好的檔案拷貝到其他主機
將hadoop-2.5.2拷貝到其他主機下
scp -r hadoop-2.7.2 hadoop02:/home/hadoop/cloud/
scp -r hadoop-2.7.2 hadoop03:/home/hadoop/cloud/
scp -r hadoop-2.7.2 hadoop04:/home/hadoop/cloud/
scp -r hadoop-2.7.2 hadoop05:/home/hadoop/cloud/
scp -r hadoop-2.7.2 hadoop06:/home/hadoop/cloud/
將環境變數拷貝到其他主機下
sudo scp /etc/profile hadoop02:/etc/
sudo scp /etc/profile hadoop03:/etc/
sudo scp /etc/profile hadoop04:/etc/
sudo scp /etc/profile hadoop05:/etc/
sudo scp /etc/profile hadoop06:/etc/
重新整理環境變數
source /etc/profile
啟動
啟動的時候注意啟動順序
1、啟動zookeeper(在hadoop04、05、06 )
2、啟動journal node(在hadoop04、05、06)
#hadoop-2.7.2/sbin下
./sbin/hadoop-daemon.sh start journalnode
3、格式化HDFS(namenode)第一次要格式化(在hadoop01、02中任意一臺)(這裡直接複製會有問題,最好手動輸入)
./bin/hdfs namenode –format
並把/home/hadoop/cloud/hadoop-2.7.2/tmp 資料夾拷貝到另一臺namenode的目錄下
scp -r /home/hadoop/cloud/hadoop-2.7.2/tmp hadoop@hadoop02:/home/hadoop/cloud/hadoop-2.7.2/
4、格式化 zk(在hadoop01即可)(這裡直接複雜會有問題,最好手動輸入)
./bin/hdfs zkfc –formatZK
5、啟動zkfc來監控NN狀態(在hadoop01、02)
./sbin/hadoop-daemon.sh start zkfc
6、啟動HDFS(namenode)(在hadoop01即可)
#hadoop-2.7.2/sbin下
./sbin/start-dfs.sh
7、啟動YARN(MR)(在hadoop03即可)
#hadoop-2.7.2/sbin下
./sbin/start-yarn.sh
檢視結果
如果上面的啟動沒有報錯的的話,這時在我們的虛擬主機上應該分別有自己的程序,如前文我們規劃的一樣。
檢視本機的java程序
jps
通過瀏覽器測試如下:
http://192.168.2.101:50070/
可以看出hadoop01的namenode是處於一種standby狀態,那麼hadoop02應該是處於active狀態
檢視YARN的狀態
http://192.168.2.103:8088/