實戰 | 史上最詳細Hadoop大數據集羣搭建,不看後悔系列

1. 搭建環境

1.1 實驗環境

本文基於 HA 分佈式文件系統(HDFS),搭建 MapReduce on yarn 大數據集羣。總共需要四臺虛擬機node01、node02、node03、node04,各個角色進程的分配如下表所示:

虛擬機 Namenode-1 Namenode-2 Datanode zookeeper zkfc journalnode ResourceManager NodeManager
node01 * * *
node02 * * * * * *
node03 * * * * *
node04 * * * *

1.2 架構模型

HDFS 2.x 通過Namenode主備模型解決了 HDFS 1.x 的單點故障和內存受限問題。本文采用基於 ZooKeeper 的名稱節點自動切換方案。由 ZooKeeper Failover Controller 進程實時的監控 namenode 的健康狀態,ZooKeeper Failover Controller 進程幫助 Namenode 向 ZooKeeper 爭搶鎖,獲得鎖的 Namenode 成爲 Active ,另一臺 Namenode 爲 standby。 Active 對外提供服務,Standby 通過 journalnode 保持通信,同步 Active 元數據,隨時以待切換。此外,Standby 完成了edits.log 文件的合併,併產生新的 image ,然後推回給 Active。如果 Active 發生故障,則自動切換到備 Standby。Datanode 同時向 Active 和 Standby 保持心跳,報告數據塊的信息。HDFS 2.x 的架構模型如下圖所示:
Alt

1.3 前期準備

  • 修改 /etc/hosts 文件,使IP地址與主機一一映射。
//修改node01/etc/hosts文件:
[root@node01~]#  vi /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.179.101 node01
192.168.179.102 node02
192.168.179.103 node03
192.168.179.104 node04

2. 軟件環境依賴部署

衆所周知,Hadoop是由熱門的Java語言開發的,所以,大數據集羣的運行需要依賴Java環境。首先,需要準備java環境。

2.1 jdk安裝及配置

把jdk-7u67-linux-x64.rpm、hadoop-2.6.5.tar.gz兩個軟件包通過ftp上傳到node01/home目錄下:

  1. 解壓jdk-7u67-linux-x64.rpm:
 //將jdk解壓至node01的/usr/local目錄下
 [root@node01 ~]#  rpm -ivh  jdk-7u67-linux-x64.rpm
  1. 修改配置文件/etc/profile:
[root@node01 ~]# vi /etc/profile

在這裏插入圖片描述

  1. 執行並驗證
1 [root@node01 ~]# source /etc/profile  //使配置文件生效
2 [root@node01 ~]# jps          //驗證Java環境
  1348 jps                     //java環境成功安裝
  1. 分發給node02、node03、node04
//將jdk部署到其它三臺機器
[root@node01 ~]# scp -r  /usr/local/java node02:/usr/local/  
[root@node01 ~]# scp -r  /usr/local/java node03:/usr/local/  
[root@node01 ~]# scp -r  /usr/local/java node04:/usr/local/  

//將配置文件遠程拷貝到其它三臺機器
[root@node01 ~]# scp -r  /etc/profile node02:/etc/
[root@node01 ~]# scp -r  /etc/profile node03:/etc/
[root@node01 ~]# scp -r  /etc/profile node04:/etc/

2.2 ssh免密鑰配置

  • 免密鑰需求場景
    • 管理腳本遠程管理其它節點啓停服務時,namenode上的管理腳本需要免密鑰訪問其他節點
    • 在HA架構模型中,主備namenode上的ZKFC需要通過免密鑰控制對方和自己
[root@node01 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa   //獲取密鑰,四臺節點都要做
  
  ##想免密鑰訪問誰,就把自己的公鑰放到誰的authorized_keys文件中
1 [root@node01 .ssh]# cat id_dsa.pub >> authorized_keys   //和自己免密鑰
2 [root@node01 .ssh]# scp id_dsa node02:`pwd`/node01.pub   //把node01公鑰發給node02,並命名爲node01.pub
3 [root@node02 .ssh]# cat node01.pub >> authorized_keys   //實現了node01對node02的免密鑰登錄
 
 ##對node03、node04採用上述2、3步驟
 ##本集羣搭建需要做node01免密鑰訪問node02、node03、node04
 ##以及node02免密鑰訪問node01
 

3. Hadoop及Zookeeper部署

3.1 Hadoop安裝及配置

3.1.1 解壓hadoop-2.6.5.tar.gz:

爲了簡便,只需要在 node01 上安裝和配置好 Hadoop ,然後通過遠程拷貝命令分發給 node02、node03、node04。

 //將hadoop-2.6.5.tar.gz解壓至node01的/opt/soft目錄下
 [root@node01 ~]# tar -zxvf  hadoop-2.6.5.tar.gz
 [root@node01 ~]# mv hadoop-2.6.5 /opt/soft   //把解壓的目錄移動至/opt/soft
3.1.2 修改配置文件/etc/profile:
[root@node01 ~]# vi /etc/profile

export JAVA_HOME=/usr/java/jdk1.7.0_67
export HADOOP_HOME=/opt/sxt/hadoop-2.6.5 #配置家目錄
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin  #配置bin和sbin執行目錄

在這裏插入圖片描述

3.1.3 修改 hadoop-env.sh 和 mapred-env.sh 配置文件

在 Hadoop 中主要修改的配置文件有以下7個:
hadoop-env.shmapred-env.shhdfs-site.xmlcore-site.xmlslavesmapred-site.xmlyarn-site.xml
在 MR 離線計算時,名稱節點在使用腳本遠程訪問其它節點時,不會讀取到 /etc/pofile 文件的 java 配置,所以要在這兩個文件中配置 java 的絕對路徑,上述配置的 JAVA_HOME。

[root@node01~]# cd $HADOOP_HOME
[root@node01 hadoop-2.6.5]# cd etc/hadoop
[root@node01 hadoop]# vi hadoop-env.sh

在這裏插入圖片描述

[root@node01 hadoop]# vi mapred-env.sh

在這裏插入圖片描述

3.1.4 配置hdfs-site.xml 文件

該文件的配置總共包含以下五點:

  • 指定存放block塊的數據節點(Datanode)的副本數,一般不超過所設定的數據節點數,本文設爲3,提供以下配置源代碼:
[root@node01 hadoop]# vi hdfs-site.xml
	<property>
        <name>dfs.replication</name>
        <value>3</value>
	</property>
  • 邏輯到物理的映射,namenode服務集羣node01、node02,以及他們的啓動時所用的端口:8020,和瀏覽器訪問時所用的端口:50070。提供以下配置源代碼:
 <property>
  <name>dfs.nameservices</name>
  <value>mycluster</value>
 </property>

 <property>
  <name>dfs.ha.namenodes.mycluster</name>
  <value>nn1,nn2</value>
 </property>
 
 <property>
  <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  <value>node01:8020</value>
 </property>
 
 <property>
  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  <value>node02:8020</value>
 </property>
 
 <property>
  <name>dfs.namenode.http-address.mycluster.nn1</name>
  <value>node01:50070</value>
 </property>
 
 <property>
  <name>dfs.namenode.http-address.mycluster.nn2</name>
  <value>node02:50070</value>
 </property>

  • journalnode相關信息配置,包括三臺journalnode的節點及啓動端口,和存放數據的目錄。提供以下配置源代碼:
 <property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
 </property>
 
 <property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/var/hadoop/ha/jn</value>
 </property>

  • 故障的切換的實現和代理。提供以下配置源代碼:
 <property>
  <name>dfs.client.failover.proxy.provider.mycluster</name>  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
 </property>

 <property>
  <name>dfs.ha.fencing.methods</name>
  <value>sshfence</value>
 </property>

 <property>
  <name>dfs.ha.fencing.ssh.private-key-files</name>
  <value>/root/.ssh/id_dsa</value>
 </property>

  • 實現 HDFS 的 HA(高可用)模型自動故障轉移開關,打開後,會在名稱節點上創建 ZooKeeper Failover Controller 進程,監控名稱節點的健康狀態。提供以下配置源代碼:
 <property>
   <name>dfs.ha.automatic-failover.enabled</name>
   <value>true</value>
 </property>
3.1.5 配置 core-site.xml 和 Slaves 文件
3.1.5.1 core-site.xml 文件的配置
  • fs.defaultFS 的入口修改爲上述配置的邏輯名稱:hdfs://mycluster
[root@node01 hadoop]# vi core-site.xml
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value>
    </property>
    
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/var/hadoop/ha</value>
    </property>

注意:hadoop.tmp.dir 是存放數據的目錄,默認是 /tmp/ ,需要手動指定一個持久目錄例:/var/hadoop/ha

  • ZooKeeper Failover Controller 會用到 ZooKeeper ,需要配置 ZooKeeper 節點信息
 <property>
   <name>ha.zookeeper.quorum</name>
   <value>node02:2181,node03:2181,node04:2181</value>
 </property>
3.1.5.2 Slaves 文件的配置

配置數據節點(Datanode)的位置:

[root@node01 hadoop]# vi slaves

#打開後添加如下內容:
node02
node03
node04
3.1.6 Hadoop 分發以及 HA HDFS on yarn 配置
3.1.6.1 Hadoop 分發

鑑於以上所有的操作全部都在 node01 虛擬機上操作,所以需要把 node01 上安裝配置好的 Hadoop 遠程分發到 node02 、node03 、node04 上。

#分發 Hadoop
[root@node01~]# cd $HADOOP_HOME  //回到 hadoop 的家目錄
[root@node01 hadoop-2.6.5]# scp ./hadoop-2.6.5/   node2:`pwd`
[root@node01 hadoop-2.6.5]# scp ./hadoop-2.6.5/   node3:`pwd`
[root@node01 hadoop-2.6.5]# scp ./hadoop-2.6.5/   node4:`pwd`

#分發 Hadoop 的配置文件 /etc/profile
[root@node01 hadoop-2.6.5]# cd    //回到家目錄
[root@node01~]# scp /etc/profile  node02:/etc/
[root@node01~]# scp /etc/profile  node03:/etc/
[root@node01~]# scp /etc/profile  node04:/etc/
3.1.6.2 HA HDFS on yarn 配置
  • yarn 是 Hadoop 2.x 新引入的資源管理系統,yarn 的引入把資源管理計算調度進行解耦,可使得多個計算框架運行在一個集羣,如MapReduce、spark、storm 。yarn 主要有 Resourcemanager (負責整個集羣的資源管理及調度)和 Nodemanager (向 RM 彙報集羣節點的資源使用情況,管理container的生命週期)兩個角色。
    該項配置主要包括 mapre-site.xml 和 yarn-site.xml 兩個文件:
[root@node01 hadoop]# cp  mapre-site.xml.template  mapre-site.xml   //複製一份
[root@node01 hadoop]# vi mapre-site.xml
 #實現了 MapReduce on yarn
 <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
  </property>

注:以上爲配置源代碼

[root@node01 hadoop]# vi yarn-site.xml
 <property>
   <name>yarn.nodemanager.aux-services</name>
   <value>mapreduce_shuffle</value>
 </property>
 <property>
   <name>yarn.resourcemanager.ha.enabled</name>
   <value>true</value>
 </property>
 <property>
   <name>yarn.resourcemanager.cluster-id</name>
   <value>cluster1</value>
 </property>
 <property>
   <name>yarn.resourcemanager.ha.rm-ids</name>
   <value>rm1,rm2</value>
 </property>
 <property>
   <name>yarn.resourcemanager.hostname.rm1</name>
   <value>node03</value>
 </property>
 <property>
   <name>yarn.resourcemanager.hostname.rm2</name>
   <value>node04</value>
 </property>
 <property>
   <name>yarn.resourcemanager.zk-address</name>
   <value>node02:2181,node03:2181,node04:2181</value>
 </property>

注: 以上爲配置源代碼。主要配置 Resourcemanager 和 Nodemanager 的主機位置

  • 將 mapre-site.xml 和 yarn-site.xml 兩個文件分發給 node02。
[root@node01 hadoop]# scp  mapre-site.xml  yarn-site.xml  node02:`pwd`

至此所有虛擬機 Hadoop 的安裝及配置已經完成。

3.2 ZooKeeper 安裝及配置

由 1.1 中的角色進程分配表可知,ZooKeeper 分配在node02、node03、node04 三臺節點上,所以只需要在 node02 上安裝配置好 ZooKeeper ,然後通過遠程拷貝命令分發給 node03、node04。

3.2 .1 ZooKeeper 安裝
[root@node02~]# tar -zxvf zookeeper-3.4.6.tar.gz
[root@node02~]# mv  zookeeper-3.4.6.tar.gz  /opt/soft    //把解壓的文件移至此目錄
[root@node02~]# vi /etc/profile

//配置 ZooKeeper home 目錄和 bin 目錄
export JAVA_HOME=/usr/java/jdk1.7.0_67
export HADOOP_HOME=/opt/sxt/hadoop-2.6.5
export ZOOKEEPER_HOME=/opt/sxt/zookeeper-3.4.6
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
3.2 .1 ZooKeeper 配置
[root@node02~]# cd $ZOOKEEPER_HOME
[root@node02 zookeeper-3.4.6]# cd conf
[root@node02 conf]# mv  zoo_sample.cfg  zoo.cfg  //複製一份並重命名爲 zoo.cfg
[root@node02 conf]# vi zoo.cfg

在這裏插入圖片描述
保存後退出。
創建剛剛配置的目錄,並把事務 id 存入 myid 文件中。

[root@node02 conf]# mkdir -p /var/hadoop/zk   //創建目錄
[root@node02 conf]# echo 1  >>  /var/hadoop/zk/myid   //把事務 id 存入 myid 文件中
[root@node02 conf]# cd /opt/soft
[root@node02 soft]# scp -r  ./zookeeper-3.4.6  node03:`pwd` //將 ZooKeeper 分發給node03
[root@node02 soft]# scp -r  ./zookeeper-3.4.6  node04:`pwd` //將 ZooKeeper 分發給node04

//同時將 /etc/profile 配置文件分發給 node03 node04
[root@node02 soft]# scp -r /etc/profile  node03:/etc/
[root@node02 soft]# scp -r /etc/profile  node03:/etc/

值得注意的是,需要分別切換到 node03 、node04 上,重複創建目錄存事務 id兩件事。

# 在 node03 上:
[root@node03 ~]# mkdir -p /var/hadoop/zk   //創建目錄
[root@node03 ~]# echo 2  >>  /var/hadoop/zk/myid   //把事務 id 存入 myid 文件中

# 在 node04 上:
[root@node04 ~]# mkdir -p /var/hadoop/zk   //創建目錄
[root@node04 ~]# echo 3  >>  /var/hadoop/zk/myid   //把事務 id 存入 myid 文件中

值得恭喜,Hadoop 和 ZooKeeper 兩個軟件都已經安裝配置成功啦!

3.3 HDFS 、ZooKeeper 和 yarn 啓動

3.3.1 啓動 ZooKeeper
# 分別在 node02 node03 node04 執行以下命令,依次啓動 ZooKeeper,ZooKeeper 要先啓動
[root@node02 ~]# zkServer.sh  start
3.3.2 啓動 HDFS

啓動 HDFS 前,需要格式化 Namenode,格式化 Namenode 前需要啓動 journalnode ,因爲主備兩臺 Namenode 需要通過 journalnode 傳遞數據。

  # 第一、分別在 node01 node02 node03 執行以下命令,依次啓動 journalnode
[root@node01 ~]# hadoop-daemon.sh  start  journalnode

 # 第二、在 node01 上格式化 namenode
[root@node01 ~]# hdfs namenode  -format  

 # 第三、啓動 node01 上的 namenode 
 [root@node01 ~]# hadoop-daemon.sh  start  namenode

 # 第四、在 node02 上同步
 [root@node02 ~]# hdfs  namenode  -bootstrapStandby

 # 第五、在 node01 上格式化 ZooKeeper,此步是啓動  ZooKeeper Failover Controller 進程的前置依賴
 [root@node01 ~]# hdfs  zkfc  -formatZK

注意:第二步,需要見到 successfully 字樣,namenode纔算格式化成功,否則重來
在這裏插入圖片描述

兩次格式化做完,終於可以啓動 HDFS 了。

 # 在 node01 上 執行以下命令啓動 HDFS
[root@node01 ~]# start-dfs.sh
 # 在四臺虛擬機上執行 jps 命令驗證 HDFS 啓動情況
 # node01
[root@node01 ~]# jps 
4213 NameNode
5148 Jps
4089 JournalNode
4650 DFSZKFailoverController

 # node02
[root@node02 ~]# jps
3099 DFSZKFailoverController
2809 JournalNode
1813 QuorumPeerMain
2923 NameNode
4475 Jps

 # node03
[root@node03 ~]# jps
 2372 Jps
1610 QuorumPeerMain
2171 JournalNode

 # node04
[root@node04 ~]# jps
1511 QuorumPeerMain
1982 Jps
3.3.3 啓動 yarn
 # 第一、在 node01 上執行以下命令,啓動 三臺 Nodemanager
[root@node01 ~]# start-yarn.sh

 # 第二、在 node03 上執行以下命令,手工啓動 Resourcemanager
[root@node03 ~]# yarn-daemon.sh  start  resourcemanager

# 第三、在 node04 上執行以下命令,手工啓動 Resourcemanager
[root@node04 ~]# yarn-daemon.sh  start  resourcemanager  

注意:上述命令執行完後,依次在 node02、node03 、node04 上執行 jps 驗證:node02 比原來多了一個 NodeManager 進程;node03 和 node04 都多了一個 NodeManager 和 ResourceManager 進程。

結語:感謝你!耐心的看完了這篇文章!也恭喜你!我們又成長了一步!建議大家親手實踐一遍,搭建集羣不是最終目的,最重要的是理解整個基於 HDFS ,MapReduce on yarn 架構模型!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章