1. 程式人生 > >Hadoop2.7.2之叢集搭建(高可用)

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/

這裡寫圖片描述