GitChat·大資料 | 史上最詳細的Hadoop環境搭建

gb4215287發表於2017-10-11

目錄(?)[-]

  1. 前言
    1. 第一部分Linux環境安裝
    2. 第二部分Hadoop本地模式安裝
    3. 第三部分Hadoop偽分散式模式安裝
    4. 第四部分完全分散式安裝
    5. 第五部分Hadoop HA安裝
  2. 第一部分Linux環境安裝
    1. 第一步配置Vmware NAT網路
    2. 第二步安裝Linux作業系統
    3. 第三步安裝JDK
  3. 第二部分Hadoop本地模式安裝
    1. 第四步Hadoop部署模式
    2. 第五步本地模式部署
  4. 第三部分Hadoop偽分散式模式安裝
    1. 第六步偽分散式Hadoop部署過程
    2. 十七配置啟動YARN
    3. 第七步開啟歷史服務
  5. 第四部分完全分散式安裝
    1. 第八步完全布式環境部署Hadoop
  6. 第五部分Hadoop HA安裝
    1. 第十步Zookeeper分散式機器部署
    2. 第十一步Hadoop 2x HDFS HA 部署
    3. 第十二步Hadoop 2x YARN HA 部署
    4. 第十三步HDFS Federation 架構部署
  7. 後記
  8. 彩蛋重磅 Chat 分享如何在三年內快速成長為一名技術專家

GitChat 作者:鳴宇淳 
原文: 史上最詳細的Hadoop環境搭建 
關注公眾號:GitChat 技術雜談,一本正經的講技術 
【不要錯過文末活動哦】

前言

Hadoop在大資料技術體系中的地位至關重要,Hadoop是大資料技術的基礎,對Hadoop基礎知識的掌握的紮實程度,會決定在大資料技術道路上走多遠。

這是一篇入門文章,Hadoop的學習方法很多,網上也有很多學習路線圖。本文的思路是:以安裝部署Apache Hadoop2.x版本為主線,來介紹Hadoop2.x的架構組成、各模組協同工作原理、技術細節。安裝不是目的,通過安裝認識Hadoop才是目的。

本文分為五個部分、十三節、四十九步。

第一部分:Linux環境安裝

Hadoop是執行在Linux,雖然藉助工具也可以執行在Windows上,但是建議還是執行在Linux系統上,第一部分介紹Linux環境的安裝、配置、Java JDK安裝等。

第二部分:Hadoop本地模式安裝

Hadoop本地模式只是用於本地開發除錯,或者快速安裝體驗Hadoop,這部分做簡單的介紹。

第三部分:Hadoop偽分散式模式安裝

學習Hadoop一般是在偽分散式模式下進行。這種模式是在一臺機器上各個程式上執行Hadoop的各個模組,偽分散式的意思是雖然各個模組是在各個程式上分開執行的,但是隻是執行在一個作業系統上的,並不是真正的分散式。

第四部分:完全分散式安裝

完全分散式模式才是生產環境採用的模式,Hadoop執行在伺服器叢集上,生產環境一般都會做HA,以實現高可用。

第五部分:Hadoop HA安裝

HA是指高可用,為了解決Hadoop單點故障問題,生產環境一般都做HA部署。這部分介紹瞭如何配置Hadoop2.x的高可用,並簡單介紹了HA的工作原理。 
安裝過程中,會穿插簡單介紹涉及到的知識。希望能對大家有所幫助。 

第一部分:Linux環境安裝

第一步、配置Vmware NAT網路

一、Vmware網路模式介紹

參考:http://blog.csdn.net/collection4u/article/details/14127671

二、NAT模式配置

NAT是網路地址轉換,是在宿主機和虛擬機器之間增加一個地址轉換服務,負責外部和虛擬機器之間的通訊轉接和IP轉換。

我們部署Hadoop叢集,這裡選擇NAT模式,各個虛擬機器通過NAT使用宿主機的IP來訪問外網。

我們的要求是叢集中的各個虛擬機器有固定的IP、可以訪問外網,所以進行如下設定:

1、 Vmware安裝後,預設的NAT設定如下:

enter image description here

2、 預設的設定是啟動DHCP服務的,NAT會自動給虛擬機器分配IP,但是我們需要將各個機器的IP固定下來,所以要取消這個預設設定。

3、 為機器設定一個子網網段,預設是192.168.136網段,我們這裡設定為100網段,將來各個虛擬機器Ip就為 192.168.100.*。

4、 點選NAT設定按鈕,開啟對話方塊,可以修改閘道器地址和DNS地址。這裡我們為NAT指定DNS地址。

enter image description here

5、 閘道器地址為當前網段裡的.2地址,好像是固定的,我們不做修改,先記住閘道器地址就好了,後面會用到。

第二步、安裝Linux作業系統

三、Vmware上安裝Linux系統

1、 檔案選單選擇新建虛擬機器

2、 選擇經典型別安裝,下一步。

3、 選擇稍後安裝作業系統,下一步。

4、 選擇Linux系統,版本選擇CentOS 64位。

enter image description here

5、 命名虛擬機器,給虛擬機器起個名字,將來顯示在Vmware左側。並選擇Linux系統儲存在宿主機的哪個目錄下,應該一個虛擬機器儲存在一個目錄下,不能多個虛擬機器使用一個目錄。

enter image description here

6、 指定磁碟容量,是指定分給Linux虛擬機器多大的硬碟,預設20G就可以,下一步。

7、 點選自定義硬體,可以檢視、修改虛擬機器的硬體配置,這裡我們不做修改。

8、 點選完成後,就建立了一個虛擬機器,但是此時的虛擬機器還是一個空殼,沒有作業系統,接下來安裝作業系統。

9、 點選編輯虛擬機器設定,找到DVD,指定作業系統ISO檔案所在位置。

enter image description here

10、 點選開啟此虛擬機器,選擇第一個回車開始安裝作業系統。

enter image description here

11、 設定root密碼。

enter image description here

12、 選擇Desktop,這樣就會裝一個Xwindow。

enter image description here

13、 先不新增普通使用者,其他用預設的,就把Linux安裝完畢了。

四、設定網路

因為Vmware的NAT設定中關閉了DHCP自動分配IP功能,所以Linux還沒有IP,需要我們設定網路各個引數。

1、 用root進入Xwindow,右擊右上角的網路連線圖示,選擇修改連線。

enter image description here

2、 網路連線裡列出了當前Linux裡所有的網路卡,這裡只有一個網路卡System eth0,點選編輯。

enter image description here

3、 配置IP、子網掩碼、閘道器(和NAT設定的一樣)、DNS等引數,因為NAT裡設定網段為100.*,所以這臺機器可以設定為192.168.100.10閘道器和NAT一致,為192.168.100.2

enter image description here

4、 用ping來檢查是否可以連線外網,如下圖,已經連線成功。

enter image description here

五、修改Hostname

1、 臨時修改hostname

[root@localhost Desktop]# hostname bigdata-senior01.chybinmy.com
  • 1

這種修改方式,系統重啟後就會失效。

2、 永久修改hostname

想永久修改,應該修改配置檔案 /etc/sysconfig/network。

命令:[root@bigdata-senior01 ~] vim /etc/sysconfig/network
  • 1

開啟檔案後,

NETWORKING=yes  #使用網路
HOSTNAME=bigdata-senior01.chybinmy.com  #設定主機名
  • 1
  • 2

六、配置Host

命令:[root@bigdata-senior01 ~] vim /etc/hosts
新增hosts: 192.168.100.10 bigdata-senior01.chybinmy.com
  • 1
  • 2

七、關閉防火牆

學習環境可以直接把防火牆關閉掉。

(1) 用root使用者登入後,執行檢視防火牆狀態。

[root@bigdata-senior01 hadoop]# service iptables status
  • 1

(2) 用[root@bigdata-senior01 hadoop]# service iptables stop關閉防火牆,這個是臨時關閉防火牆。

[root@bigdata-senior01 hadoop-2.5.0]# service iptables stop
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]
  • 1
  • 2
  • 3
  • 4

(3) 如果要永久關閉防火牆用。

[root@bigdata-senior01 hadoop]# chkconfig iptables off
  • 1

關閉,這種需要重啟才能生效。

八、關閉selinux

selinux是Linux一個子安全機制,學習環境可以將它禁用。

[hadoop@bigdata-senior01 hadoop-2.5.0]$ vim /etc/sysconfig/selinux
  • 1
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

enter image description here

第三步、安裝JDK

九、安裝Java JDK

1、 檢視是否已經安裝了java JDK。

[root@bigdata-senior01 Desktop]# java –version
  • 1

注意:Hadoop機器上的JDK,最好是Oracle的Java JDK,不然會有一些問題,比如可能沒有JPS命令。 
如果安裝了其他版本的JDK,解除安裝掉。

2、 安裝java JDK

(1) 去下載Oracle版本Java JDK:jdk-7u67-linux-x64.tar.gz

(2) 將jdk-7u67-linux-x64.tar.gz解壓到/opt/modules目錄下

[root@bigdata-senior01 /]# tar -zxvf jdk-7u67-linux-x64.tar.gz -C /opt/modules
  • 1

(3) 新增環境變數

設定JDK的環境變數 JAVA_HOME。需要修改配置檔案/etc/profile,追加

export JAVA_HOME="/opt/modules/jdk1.7.0_67"
export PATH=$JAVA_HOME/bin:$PATH
  • 1
  • 2

修改完畢後,執行 source /etc/profile

(4)安裝後再次執行 java –version,可以看見已經安裝完成。

[root@bigdata-senior01 /]# java -version
java version "1.7.0_67"
Java(TM) SE Runtime Environment (build 1.7.0_67-b01)
Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)
  • 1
  • 2
  • 3
  • 4

第二部分:Hadoop本地模式安裝

第四步、Hadoop部署模式

Hadoop部署模式有:本地模式、偽分佈模式、完全分散式模式、HA完全分散式模式。

區分的依據是NameNode、DataNode、ResourceManager、NodeManager等模組執行在幾個JVM程式、幾個機器。

模式名稱 各個模組佔用的JVM程式數 各個模組執行在幾個機器數上
本地模式 1個 1個
偽分散式模式 N個 1個
完全分散式模式 N個 N個
HA完全分散式 N個 N個

第五步、本地模式部署

十、本地模式介紹

本地模式是最簡單的模式,所有模組都執行與一個JVM程式中,使用的本地檔案系統,而不是HDFS,本地模式主要是用於本地開發過程中的執行除錯用。下載hadoop安裝包後不用任何設定,預設的就是本地模式。

十一、解壓hadoop後就是直接可以使用

1、 建立一個存放本地模式hadoop的目錄

[hadoop@bigdata-senior01 modules]$ mkdir /opt/modules/hadoopstandalone
  • 1

2、 解壓hadoop檔案

[hadoop@bigdata-senior01 modules]$ tar -zxf /opt/sofeware/hadoop-2.5.0.tar.gz  -C /opt/modules/hadoopstandalone/
  • 1

3、 確保JAVA_HOME環境變數已經配置好

[hadoop@bigdata-senior01 modules]$ echo ${JAVA_HOME}
/opt/modules/jdk1.7.0_67
  • 1
  • 2

十二、執行MapReduce程式,驗證

我們這裡用hadoop自帶的wordcount例子來在本地模式下測試跑mapreduce。

1、 準備mapreduce輸入檔案wc.input

[hadoop@bigdata-senior01 modules]$ cat /opt/data/wc.input
hadoop mapreduce hive
hbase spark storm
sqoop hadoop hive
spark hadoop
  • 1
  • 2
  • 3
  • 4
  • 5

2、 執行hadoop自帶的mapreduce Demo

[hadoop@bigdata-senior01 hadoopstandalone]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar wordcount /opt/data/wc.input output2
  • 1

enter image description here

這裡可以看到job ID中有local字樣,說明是執行在本地模式下的。

3、 檢視輸出檔案

本地模式下,mapreduce的輸出是輸出到本地。

[hadoop@bigdata-senior01 hadoopstandalone]$ ll output2
total 4
-rw-r--r-- 1 hadoop hadoop 60 Jul  7 12:50 part-r-00000
-rw-r--r-- 1 hadoop hadoop  0 Jul  7 12:50 _SUCCESS
  • 1
  • 2
  • 3
  • 4

輸出目錄中有_SUCCESS檔案說明JOB執行成功,part-r-00000是輸出結果檔案。 

第三部分:Hadoop偽分散式模式安裝

第六步、偽分散式Hadoop部署過程

十三、Hadoop所用的使用者設定

1、 建立一個名字為hadoop的普通使用者

[root@bigdata-senior01 ~]# useradd hadoop
[root@bigdata-senior01 ~]# passwd hadoop
  • 1
  • 2

2、 給hadoop使用者sudo許可權

[root@bigdata-senior01 ~]# vim /etc/sudoers
  • 1

設定許可權,學習環境可以將hadoop使用者的許可權設定的大一些,但是生產環境一定要注意普通使用者的許可權限制。

root    ALL=(ALL)       ALL
hadoop ALL=(root) NOPASSWD:ALL
  • 1
  • 2

注意:如果root使用者無權修改sudoers檔案,先手動為root使用者新增寫許可權。

[root@bigdata-senior01 ~]# chmod u+w /etc/sudoers
  • 1

3、 切換到hadoop使用者

[root@bigdata-senior01 ~]# su - hadoop
[hadoop@bigdata-senior01 ~]$
  • 1
  • 2

4、 建立存放hadoop檔案的目錄

[hadoop@bigdata-senior01 ~]$ sudo mkdir /opt/modules
  • 1

5、 將hadoop資料夾的所有者指定為hadoop使用者

如果存放hadoop的目錄的所有者不是hadoop,之後hadoop執行中可能會有許可權問題,那麼就講所有者改為hadoop。

[hadoop@bigdata-senior01 ~]# sudo chown -R hadoop:hadoop /opt/modules
  • 1

十四、解壓Hadoop目錄檔案

1、 複製hadoop-2.5.0.tar.gz到/opt/modules目錄下。

2、 解壓hadoop-2.5.0.tar.gz

[hadoop@bigdata-senior01 ~]# cd /opt/modules
[hadoop@bigdata-senior01 hadoop]# tar -zxvf hadoop-2.5.0.tar.gz
  • 1
  • 2

十五、配置Hadoop

1、 配置Hadoop環境變數

[hadoop@bigdata-senior01 hadoop]# vim /etc/profile
  • 1

追加配置:

export HADOOP_HOME="/opt/modules/hadoop-2.5.0"
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
  • 1
  • 2

執行:source /etc/profile 使得配置生效

驗證HADOOP_HOME引數:

[hadoop@bigdata-senior01 /]$ echo $HADOOP_HOME
/opt/modules/hadoop-2.5.0
  • 1
  • 2

2、 配置 hadoop-env.sh、mapred-env.sh、yarn-env.sh檔案的JAVA_HOME引數

[hadoop@bigdata-senior01 ~]$ sudo vim  ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh
  • 1
修改JAVA_HOME引數為:
export JAVA_HOME="/opt/modules/jdk1.7.0_67"
  • 1
  • 2

3、 配置core-site.xml

enter image description here

[hadoop@bigdata-senior01 ~]sudovim{HADOOP_HOME}/etc/hadoop/core-site.xml

(1) fs.defaultFS引數配置的是HDFS的地址。

<property>
<name>fs.defaultFS</name>
<value>hdfs://bigdata-senior01.chybinmy.com:8020</value>
</property>
  • 1
  • 2
  • 3
  • 4

(2) hadoop.tmp.dir配置的是Hadoop臨時目錄,比如HDFS的NameNode資料預設都存放這個目錄下,檢視*-default.xml等預設配置檔案,就可以看到很多依賴${hadoop.tmp.dir}的配置。

預設的hadoop.tmp.dir/tmp/hadoop-${user.name},此時有個問題就是NameNode會將HDFS的後設資料儲存在這個/tmp目錄下,如果作業系統重啟了,系統會清空/tmp目錄下的東西,導致NameNode後設資料丟失,是個非常嚴重的問題,所有我們應該修改這個路徑。

  • 建立臨時目錄:
    [hadoop@bigdata-senior01 hadoop-2.5.0]$ sudo mkdir -p /opt/data/tmp
  • 1
  • 將臨時目錄的所有者修改為hadoop
[hadoop@bigdata-senior01 hadoop-2.5.0]$ sudo chown –R hadoop:hadoop /opt/data/tmp
  • 1
  • 修改hadoop.tmp.dir
 <property>
   <name>hadoop.tmp.dir</name>
    <value>/opt/data/tmp</value>
  </property>
  • 1
  • 2
  • 3
  • 4

十六、配置、格式化、啟動HDFS

1、 配置hdfs-site.xml

enter image description here

[hadoop@bigdata-senior01 hadoop-2.5.0]$ vim ${HADOOP_HOME}/etc/hadoop/hdfs-site.xml
  • 1
    <property>
       <name>dfs.replication</name>
       <value>1</value>
    </property>
  • 1
  • 2
  • 3
  • 4

dfs.replication配置的是HDFS儲存時的備份數量,因為這裡是偽分散式環境只有一個節點,所以這裡設定為1。

2、 格式化HDFS

enter image description here

[hadoop@bigdata-senior01 ~]$ hdfs namenode –format
  • 1

格式化是對HDFS這個分散式檔案系統中的DataNode進行分塊,統計所有分塊後的初始後設資料的儲存在NameNode中。

格式化後,檢視core-site.xml裡hadoop.tmp.dir(本例是/opt/data目錄)指定的目錄下是否有了dfs目錄,如果有,說明格式化成功。

注意:

  1. 格式化時,這裡注意hadoop.tmp.dir目錄的許可權問題,應該hadoop普通使用者有讀寫許可權才行,可以將/opt/data的所有者改為hadoop。 
    [hadoop@bigdata-senior01 hadoop-2.5.0]$ sudo chown -R hadoop:hadoop /opt/data

  2. 檢視NameNode格式化後的目錄。

   [hadoop@bigdata-senior01 ~]$ ll /opt/data/tmp/dfs/name/current
  • 1

enter image description here

fsimage是NameNode後設資料在記憶體滿了後,持久化儲存到的檔案。

fsimage*.md5 是校驗檔案,用於校驗fsimage的完整性。

seen_txid 是hadoop的版本

vession檔案裡儲存:

  • namespaceID:NameNode的唯一ID。

  • clusterID:叢集ID,NameNode和DataNode的叢集ID應該一致,表明是一個叢集。

#Mon Jul 04 17:25:50 CST 2016
namespaceID=2101579007
clusterID=CID-205277e6-493b-4601-8e33-c09d1d23ece4
cTime=0
storageType=NAME_NODE
blockpoolID=BP-1641019026-127.0.0.1-1467624350057
layoutVersion=-57
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3、 啟動NameNode

[hadoop@bigdata-senior01 hadoop-2.5.0]$ ${HADOOP_HOME}/sbin/hadoop-daemon.sh start namenode
starting namenode, logging to /opt/modules/hadoop-2.5.0/logs/hadoop-hadoop-namenode-bigdata-senior01.chybinmy.com.out
  • 1
  • 2

enter image description here

4、 啟動DataNode

[hadoop@bigdata-senior01 hadoop-2.5.0]$ ${HADOOP_HOME}/sbin/hadoop-daemon.sh start datanode
starting datanode, logging to /opt/modules/hadoop-2.5.0/logs/hadoop-hadoop-datanode-bigdata-senior01.chybinmy.com.out
  • 1
  • 2

enter image description here

5、 啟動SecondaryNameNode

[hadoop@bigdata-senior01 hadoop-2.5.0]$ ${HADOOP_HOME}/sbin/hadoop-daemon.sh start secondarynamenode
starting secondarynamenode, logging to /opt/modules/hadoop-2.5.0/logs/hadoop-hadoop-secondarynamenode-bigdata-senior01.chybinmy.com.out
  • 1
  • 2

enter image description here

6、 JPS命令檢視是否已經啟動成功,有結果就是啟動成功了。

[hadoop@bigdata-senior01 hadoop-2.5.0]$ jps
3034 NameNode
3233 Jps
3193 SecondaryNameNode
3110 DataNode
  • 1
  • 2
  • 3
  • 4
  • 5

enter image description here

7、 HDFS上測試建立目錄、上傳、下載檔案

HDFS上建立目錄

[hadoop@bigdata-senior01 hadoop-2.5.0]$ ${HADOOP_HOME}/bin/hdfs dfs -mkdir /demo1
  • 1

上傳本地檔案到HDFS上

[hadoop@bigdata-senior01 hadoop-2.5.0]$ ${HADOOP_HOME}/bin/hdfs dfs -put 
${HADOOP_HOME}/etc/hadoop/core-site.xml /demo1
  • 1
  • 2

讀取HDFS上的檔案內容

[hadoop@bigdata-senior01 hadoop-2.5.0]$ ${HADOOP_HOME}/bin/hdfs dfs -cat /demo1/core-site.xml
  • 1

enter image description here

從HDFS上下載檔案到本地

[hadoop@bigdata-senior01 hadoop-2.5.0]$ bin/hdfs dfs -get /demo1/core-site.xml
  • 1

enter image description here

十七、配置、啟動YARN

1、 配置mapred-site.xml

預設沒有mapred-site.xml檔案,但是有個mapred-site.xml.template配置模板檔案。複製模板生成mapred-site.xml。

[hadoop@bigdata-senior01 hadoop-2.5.0]# cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
  • 1

新增配置如下:

<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
  • 1
  • 2
  • 3
  • 4

指定mapreduce執行在yarn框架上。

enter image description here

2、 配置yarn-site.xml

新增配置如下:

<property>
  <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce_shuffle</value>
</property>
<property>
    <name>yarn.resourcemanager.hostname</name>
    <value>bigdata-senior01.chybinmy.com</value>
 </property>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • yarn.nodemanager.aux-services配置了yarn的預設混洗方式,選擇為mapreduce的預設混洗演算法。

  • yarn.resourcemanager.hostname指定了Resourcemanager執行在哪個節點上。

    enter image description here

3、 啟動Resourcemanager

[hadoop@bigdata-senior01 hadoop-2.5.0]$ ${HADOOP_HOME}/sbin/yarn-daemon.sh start resourcemanager
  • 1

enter image description here

4、 啟動nodemanager

[hadoop@bigdata-senior01 hadoop-2.5.0]$ ${HADOOP_HOME}/sbin/yarn-daemon.sh start nodemanager
  • 1

enter image description here

5、 檢視是否啟動成功

[hadoop@bigdata-senior01 hadoop-2.5.0]$ jps
3034 NameNode
4439 NodeManager
4197 ResourceManager
4543 Jps
3193 SecondaryNameNode
3110 DataNode
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

可以看到ResourceManager、NodeManager已經啟動成功了。

enter image description here

6、 YARN的Web頁面

YARN的Web客戶端埠號是8088,通過http://192.168.100.10:8088/可以檢視。

enter image description here

十八、執行MapReduce Job

在Hadoop的share目錄裡,自帶了一些jar包,裡面帶有一些mapreduce例項小例子,位置在share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar,可以執行這些例子體驗剛搭建好的Hadoop平臺,我們這裡來執行最經典的WordCount例項。

1、 建立測試用的Input檔案

建立輸入目錄:

[hadoop@bigdata-senior01 hadoop-2.5.0]$ bin/hdfs dfs -mkdir -p /wordcountdemo/input
  • 1

建立原始檔案:

在本地/opt/data目錄建立一個檔案wc.input,內容如下。

enter image description here

將wc.input檔案上傳到HDFS的/wordcountdemo/input目錄中:

[hadoop@bigdata-senior01 hadoop-2.5.0]$ bin/hdfs dfs -put /opt/data/wc.input /wordcountdemo/input
  • 1

enter image description here

2、 執行WordCount MapReduce Job

[hadoop@bigdata-senior01 hadoop-2.5.0]$ bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-
2.5.0.jar wordcount /wordcountdemo/input /wordcountdemo/output
  • 1
  • 2

enter image description here

3、 檢視輸出結果目錄

[hadoop@bigdata-senior01 hadoop-2.5.0]$ bin/hdfs dfs -ls /wordcountdemo/output
-rw-r--r--   1 hadoop supergroup          0 2016-07-05 05:12 /wordcountdemo/output/_SUCCESS
-rw-r--r--   1 hadoop supergroup         60 2016-07-05 05:12 /wordcountdemo/output/part-r-00000
  • 1
  • 2
  • 3

enter image description here

  • output目錄中有兩個檔案,_SUCCESS檔案是空檔案,有這個檔案說明Job執行成功。

  • part-r-00000檔案是結果檔案,其中-r-說明這個檔案是Reduce階段產生的結果,mapreduce程式執行時,可以沒有reduce階段,但是肯定會有map階段,如果沒有reduce階段這個地方有是-m-。

  • 一個reduce會產生一個part-r-開頭的檔案。

  • 檢視輸出檔案內容。

[hadoop@bigdata-senior01 hadoop-2.5.0]$ bin/hdfs dfs -cat /wordcountdemo/output/part-r-00000
hadoop  3
hbase   1
hive    2
mapreduce       1
spark   2
sqoop   1
storm   1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

結果是按照鍵值排好序的。

十九、停止Hadoop

 [hadoop@bigdata-senior01 hadoop-2.5.0]$ sbin/hadoop-daemon.sh stop namenode
stopping namenode
[hadoop@bigdata-senior01 hadoop-2.5.0]$ sbin/hadoop-daemon.sh stop datanode
stopping datanode
[hadoop@bigdata-senior01 hadoop-2.5.0]$ sbin/yarn-daemon.sh stop resourcemanager
stopping resourcemanager
[hadoop@bigdata-senior01 hadoop-2.5.0]$ sbin/yarn-daemon.sh stop nodemanager
stopping nodemanager
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

enter image description here

二十、 Hadoop各個功能模組的理解

1、 HDFS模組

HDFS負責大資料的儲存,通過將大檔案分塊後進行分散式儲存方式,突破了伺服器硬碟大小的限制,解決了單臺機器無法儲存大檔案的問題,HDFS是個相對獨立的模組,可以為YARN提供服務,也可以為HBase等其他模組提供服務。

2、 YARN模組

YARN是一個通用的資源協同和任務排程框架,是為了解決Hadoop1.x中MapReduce裡NameNode負載太大和其他問題而建立的一個框架。

YARN是個通用框架,不止可以執行MapReduce,還可以執行Spark、Storm等其他計算框架。

3、 MapReduce模組

MapReduce是一個計算框架,它給出了一種資料處理的方式,即通過Map階段、Reduce階段來分散式地流式處理資料。它只適用於大資料的離線處理,對實時性要求很高的應用不適用。

第七步、開啟歷史服務

二十一、歷史服務介紹

Hadoop開啟歷史服務可以在web頁面上檢視Yarn上執行job情況的詳細資訊。可以通過歷史伺服器檢視已經執行完的Mapreduce作業記錄,比如用了多少個Map、用了多少個Reduce、作業提交時間、作業啟動時間、作業完成時間等資訊。

二十二、開啟歷史服務

[hadoop@bigdata-senior01 hadoop-2.5.0]$ sbin/mr-jobhistory-daemon.sh start historyserver、
  • 1

開啟後,可以通過Web頁面檢視歷史伺服器:

http://bigdata-senior01.chybinmy.com:19888/

二十三、Web檢視job執行歷史

1、 執行一個mapreduce任務

[hadoop@bigdata-senior01 hadoop-2.5.0]$ bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-
2.5.0.jar wordcount /wordcountdemo/input /wordcountdemo/output1
  • 1
  • 2

2、 job執行中

enter image description here

3、 檢視job歷史

enter image description here

enter image description here

歷史伺服器的Web埠預設是19888,可以檢視Web介面。

但是在上面所顯示的某一個Job任務頁面的最下面,Map和Reduce個數的連結上,點選進入Map的詳細資訊頁面,再檢視某一個Map或者Reduce的詳細日誌是看不到的,是因為沒有開啟日誌聚集服務。

二十四、開啟日誌聚集

4、 日誌聚集介紹

MapReduce是在各個機器上執行的,在執行過程中產生的日誌存在於各個機器上,為了能夠統一檢視各個機器的執行日誌,將日誌集中存放在HDFS上,這個過程就是日誌聚集。

5、 開啟日誌聚集

配置日誌聚集功能:

Hadoop預設是不啟用日誌聚集的。在yarn-site.xml檔案裡配置啟用日誌聚集。

<property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
 </property>
<property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>106800</value>
 </property>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

yarn.log-aggregation-enable:是否啟用日誌聚集功能。

yarn.log-aggregation.retain-seconds:設定日誌保留時間,單位是秒。

將配置檔案分發到其他節點:

[hadoop@bigdata-senior01 hadoop]$ scp /opt/modules/hadoop-2.5.0/etc/hadoop/yarn-site.xml bigdata-senior02.chybinmy.com:/opt/modules/hadoop-2.5.0/etc/hadoop/
[hadoop@bigdata-senior01 hadoop]$ scp /opt/modules/hadoop-2.5.0/etc/hadoop/yarn-site.xml bigdata-senior03.chybinmy.com:/opt/modules/hadoop-2.5.0/etc/hadoop/
  • 1
  • 2

重啟Yarn程式:

[hadoop@bigdata-senior01 hadoop-2.5.0]$ sbin/stop-yarn.sh
[hadoop@bigdata-senior01 hadoop-2.5.0]$ sbin/start-yarn.sh
  • 1
  • 2

重啟HistoryServer程式:

[hadoop@bigdata-senior01 hadoop-2.5.0]$ sbin/mr-jobhistory-daemon.sh stop historyserver
[hadoop@bigdata-senior01 hadoop-2.5.0]$ sbin/mr-jobhistory-daemon.sh start historyserver
  • 1
  • 2

6、 測試日誌聚集

執行一個demo MapReduce,使之產生日誌:

bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar wordcount /input /output1
  • 1

檢視日誌:

執行Job後,就可以在歷史伺服器Web頁面檢視各個Map和Reduce的日誌了。 

第四部分:完全分散式安裝

第八步、完全布式環境部署Hadoop

完全分部式是真正利用多臺Linux主機來進行部署Hadoop,對Linux機器叢集進行規劃,使得Hadoop各個模組分別部署在不同的多臺機器上。

二十五、環境準備

1、 克隆虛擬機器

  • Vmware左側選中要克隆的機器,這裡對原有的BigData01機器進行克隆,虛擬機器選單中,選中管理選單下的克隆命令。

  • 選擇“建立完整克隆”,虛擬機器名稱為BigData02,選擇虛擬機器檔案儲存路徑,進行克隆。

  • 再次克隆一個名為BigData03的虛擬機器。

2、 配置網路

修改網路卡名稱:

在BigData02和BigData03機器上編輯網路卡資訊。執行sudo vim /etc/udev/rules.d/70-persistent-net.rules命令。因為是從BigData01機器克隆來的,所以會保留BigData01的網路卡eth0,並且再新增一個網路卡eth1。並且eth0的Mac地址和BigData01的地址是一樣的,Mac地址不允許相同,所以要刪除eth0,只保留eth1網路卡,並且要將eth1改名為eth0。將修改後的eth0的mac地址複製下來,修改network-scripts檔案中的HWADDR屬性。

sudo vim /etc/sysconfig/network-scripts/ifcfg-eth0
  • 1

enter image description here

修改網路引數:

BigData02機器IP改為192.168.100.12

BigData03機器IP改為192.168.100.13

3、 配置Hostname

BigData02配置hostname為 bigdata-senior02.chybinmy.com

BigData03配置hostname為 bigdata-senior03.chybinmy.com

4、 配置hosts

BigData01、BigData02、BigData03三臺機器hosts都配置為:

[hadoop@bigdata-senior01 hadoop-2.5.0]$ sudo vim /etc/hosts
192.168.100.10 bigdata-senior01.chybinmy.com
192.168.100.12 bigdata-senior02.chybinmy.com
192.168.100.13 bigdata-senior03.chybinmy.com
  • 1
  • 2
  • 3
  • 4

5、 配置Windows上的SSH客戶端

在本地Windows中的SSH客戶端上新增對BigData02、BigData03機器的SSH連結。

二十六、伺服器功能規劃

bigdata-senior01.chybinmy.com bigdata-senior02.chybinmy.com bigdata-senior03.chybinmy.com
NameNode ResourceManage  
DataNode DataNode DataNode
NodeManager NodeManager NodeManager
HistoryServer   SecondaryNameNode

二十七、在第一臺機器上安裝新的Hadoop

為了和之前BigData01機器上安裝偽分散式Hadoop區分開來,我們將BigData01上的Hadoop服務都停止掉,然後在一個新的目錄/opt/modules/app下安裝另外一個Hadoop。 
我們採用先在第一臺機器上解壓、配置Hadoop,然後再分發到其他兩臺機器上的方式來安裝叢集。

6、 解壓Hadoop目錄:

[hadoop@bigdata-senior01 modules]$ tar -zxf /opt/sofeware/hadoop-2.5.0.tar.gz -C /opt/modules/app/
  • 1

7、 配置Hadoop JDK路徑修改hadoop-env.sh、mapred-env.sh、yarn-env.sh檔案中的JDK路徑:

export JAVA_HOME="/opt/modules/jdk1.7.0_67"
  • 1

8、 配置core-site.xml

[hadoop@bigdata-senior01 hadoop-2.5.0]$ vim etc/hadoop/core-site.xml
  • 1
<configuration>
 <property>
   <name>fs.defaultFS</name>
   <value>hdfs://bigdata-senior01.chybinmy.com:8020</value>
 </property>
 <property>
   <name>hadoop.tmp.dir</name>
   <value>/opt/modules/app/hadoop-2.5.0/data/tmp</value>
 </property>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

fs.defaultFS為NameNode的地址。

hadoop.tmp.dir為hadoop臨時目錄的地址,預設情況下,NameNode和DataNode的資料檔案都會存在這個目錄下的對應子目錄下。應該保證此目錄是存在的,如果不存在,先建立。

9、 配置hdfs-site.xml

[hadoop@bigdata-senior01 hadoop-2.5.0]$ vim etc/hadoop/hdfs-site.xml
  • 1
<configuration>
 <property>
   <name>dfs.namenode.secondary.http-address</name>
   <value>bigdata-senior03.chybinmy.com:50090</value>
 </property>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

dfs.namenode.secondary.http-address是指定secondaryNameNode的http訪問地址和埠號,因為在規劃中,我們將BigData03規劃為SecondaryNameNode伺服器。

所以這裡設定為:bigdata-senior03.chybinmy.com:50090

10、 配置slaves

[hadoop@bigdata-senior01 hadoop-2.5.0]$ vim etc/hadoop/slaves
bigdata-senior01.chybinmy.com
bigdata-senior02.chybinmy.com
bigdata-senior03.chybinmy.com
  • 1
  • 2
  • 3
  • 4

slaves檔案是指定HDFS上有哪些DataNode節點。

11、 配置yarn-site.xml

[hadoop@bigdata-senior01 hadoop-2.5.0]$ vim etc/hadoop/yarn-site.xml
  • 1
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>bigdata-senior02.chybinmy.com</value>
    </property>
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>106800</value>
    </property>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

根據規劃yarn.resourcemanager.hostname這個指定resourcemanager伺服器指向bigdata-senior02.chybinmy.com

yarn.log-aggregation-enable是配置是否啟用日誌聚集功能。

yarn.log-aggregation.retain-seconds是配置聚集的日誌在HDFS上最多儲存多長時間。

12、 配置mapred-site.xml

從mapred-site.xml.template複製一個mapred-site.xml檔案。

[hadoop@bigdata-senior01 hadoop-2.5.0]$ cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
  • 1
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>bigdata-senior01.chybinmy.com:10020</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>bigdata-senior01.chybinmy.com:19888</value>
    </property>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

mapreduce.framework.name設定mapreduce任務執行在yarn上。

mapreduce.jobhistory.address是設定mapreduce的歷史伺服器安裝在BigData01機器上。

mapreduce.jobhistory.webapp.address是設定歷史伺服器的web頁面地址和埠號。

二十八、設定SSH無密碼登入

Hadoop叢集中的各個機器間會相互地通過SSH訪問,每次訪問都輸入密碼是不現實的,所以要配置各個機器間的

SSH是無密碼登入的。

1、 在BigData01上生成公鑰

[hadoop@bigdata-senior01 hadoop-2.5.0]$ ssh-keygen -t rsa
  • 1

一路回車,都設定為預設值,然後再當前使用者的Home目錄下的.ssh目錄中會生成公鑰檔案(id_rsa.pub)和私鑰檔案(id_rsa)

2、 分發公鑰

[hadoop@bigdata-senior01 hadoop-2.5.0]$ ssh-copy-id bigdata-senior01.chybinmy.com
[hadoop@bigdata-senior01 hadoop-2.5.0]$ ssh-copy-id bigdata-senior02.chybinmy.com
[hadoop@bigdata-senior01 hadoop-2.5.0]$ ssh-copy-id bigdata-senior03.chybinmy.com
  • 1
  • 2
  • 3

3、 設定BigData02、BigData03到其他機器的無金鑰登入

同樣的在BigData02、BigData03上生成公鑰和私鑰後,將公鑰分發到三臺機器上。

二十九、分發Hadoop檔案

1、 首先在其他兩臺機器上建立存放Hadoop的目錄

[hadoop@bigdata-senior02 ~]$ mkdir /opt/modules/app
[hadoop@bigdata-senior03 ~]$ mkdir /opt/modules/app
  • 1
  • 2

2、 通過Scp分發

Hadoop根目錄下的share/doc目錄是存放的hadoop的文件,檔案相當大,建議在分發之前將這個目錄刪除掉,可以節省硬碟空間並能提高分發的速度。

doc目錄大小有1.6G。

[hadoop@bigdata-senior01 hadoop-2.5.0]$ du -sh /opt/modules/app/hadoop-2.5.0/share/doc
1.6G    /opt/modules/app/hadoop-2.5.0/share/doc
[hadoop@bigdata-senior01 hadoop-2.5.0]$ scp -r /opt/modules/app/hadoop-2.5.0/ bigdata-senior02.chybinmy.com:/opt/modules/app
[hadoop@bigdata-senior01 hadoop-2.5.0]$ scp -r /opt/modules/app/hadoop-2.5.0/ bigdata-senior03.chybinmy.com:/opt/modules/app
  • 1
  • 2
  • 3
  • 4

三十、格式NameNode

在NameNode機器上執行格式化:

[hadoop@bigdata-senior01 hadoop-2.5.0]$ /opt/modules/app/hadoop-2.5.0/bin/hdfs namenode –format
  • 1

注意:

如果需要重新格式化NameNode,需要先將原來NameNode和DataNode下的檔案全部刪除,不然會報錯,NameNode和DataNode所在目錄是在core-site.xmlhadoop.tmp.dirdfs.namenode.name.dirdfs.datanode.data.dir屬性配置的。

<property>
     <name>hadoop.tmp.dir</name>
     <value>/opt/data/tmp</value>
  </property>
<property>
     <name>dfs.namenode.name.dir</name>
     <value>file://${hadoop.tmp.dir}/dfs/name</value>
  </property>
<property>
     <name>dfs.datanode.data.dir</name>
     <value>file://${hadoop.tmp.dir}/dfs/data</value>
  </property>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

因為每次格式化,預設是建立一個叢集ID,並寫入NameNode和DataNode的VERSION檔案中(VERSION檔案所在目錄為dfs/name/current 和 dfs/data/current),重新格式化時,預設會生成一個新的叢集ID,如果不刪除原來的目錄,會導致namenode中的VERSION檔案中是新的叢集ID,而DataNode中是舊的叢集ID,不一致時會報錯。

另一種方法是格式化時指定叢集ID引數,指定為舊的叢集ID。

三十一、啟動叢集

1、 啟動HDFS

[hadoop@bigdata-senior01 hadoop-2.5.0]$ /opt/modules/app/hadoop-2.5.0/sbin/start-dfs.sh
  • 1

enter image description here

2、 啟動YARN

[hadoop@bigdata-senior01 hadoop-2.5.0]$ /opt/modules/app/hadoop-2.5.0/sbin/start-yarn.sh
  • 1

在BigData02上啟動ResourceManager:

[hadoop@bigdata-senior02 hadoop-2.5.0]$ sbin/yarn-daemon.sh start resourcemanager
  • 1

enter image description here

3、 啟動日誌伺服器

因為我們規劃的是在BigData03伺服器上執行MapReduce日誌服務,所以要在BigData03上啟動。

[hadoop@bigdata-senior03 ~]$ /opt/modules/app/hadoop-2.5.0/sbin/mr-jobhistory-daemon.sh start historyserver
starting historyserver, logging to /opt/modules/app/hadoop-2.5.0/logs/mapred-hadoop-historyserver-bigda       ta-senior03.chybinmy.com.out
  • 1
  • 2
[hadoop@bigdata-senior03 ~]$ jps
3570 Jps
3537 JobHistoryServer
3310 SecondaryNameNode
3213 DataNode
3392 NodeManager
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4、 檢視HDFS Web頁面

http://bigdata-senior01.chybinmy.com:50070/

5、 檢視YARN Web 頁面

http://bigdata-senior02.chybinmy.com:8088/cluster

三十二、測試Job

我們這裡用hadoop自帶的wordcount例子來在本地模式下測試跑mapreduce。

1、 準備mapreduce輸入檔案wc.input

[hadoop@bigdata-senior01 modules]$ cat /opt/data/wc.input
hadoop mapreduce hive
hbase spark storm
sqoop hadoop hive
spark hadoop
  • 1
  • 2
  • 3
  • 4
  • 5

2、 在HDFS建立輸入目錄input

[hadoop@bigdata-senior01 hadoop-2.5.0]$ bin/hdfs dfs -mkdir /input
  • 1

3、 將wc.input上傳到HDFS

[hadoop@bigdata-senior01 hadoop-2.5.0]$ bin/hdfs dfs -put /opt/data/wc.input /input/wc.input
  • 1

4、 執行hadoop自帶的mapreduce Demo

[hadoop@bigdata-senior01 hadoop-2.5.0]$ bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar wordcount /input/wc.input /output
  • 1

enter image description here

5、 檢視輸出檔案

[hadoop@bigdata-senior01 hadoop-2.5.0]$ bin/hdfs dfs -ls /output
Found 2 items
-rw-r--r--   3 hadoop supergroup          0 2016-07-14 16:36 /output/_SUCCESS
-rw-r--r--   3 hadoop supergroup         60 2016-07-14 16:36 /output/part-r-00000
  • 1
  • 2
  • 3
  • 4

第五部分:Hadoop HA安裝

HA的意思是High Availability高可用,指噹噹前工作中的機器當機後,會自動處理這個異常,並將工作無縫地轉移到其他備用機器上去,以來保證服務的高可用。

HA方式安裝部署才是最常見的生產環境上的安裝部署方式。Hadoop HA是Hadoop 2.x中新新增的特性,包括NameNode HA 和 ResourceManager HA。因為DataNode和NodeManager本身就是被設計為高可用的,所以不用對他們進行特殊的高可用處理。

第九步、時間伺服器搭建

Hadoop對叢集中各個機器的時間同步要求比較高,要求各個機器的系統時間不能相差太多,不然會造成很多問題。可以配置叢集中各個機器和網際網路的時間伺服器進行時間同步,但是在實際生產環境中,叢集中大部分伺服器是不能連線外網的,這時候可以在內網搭建一個自己的時間伺服器(NTP伺服器),叢集的各個機器與這個時間伺服器進行時間同步。

三十三、配置NTP伺服器

我們選擇第三臺機器(bigdata-senior03.chybinmy.com)為NTF伺服器,其他機器和這臺機器進行同步。

1、 檢查ntp服務是否已經安裝

[hadoop@bigdata-senior03 data]$ sudo rpm -qa | grep ntp
ntpdate-4.2.6p5-1.el6.centos.x86_64
ntp-4.2.6p5-1.el6.centos.x86_64
  • 1
  • 2
  • 3

顯示已經安裝過了ntp程式,其中ntpdate-4.2.6p5-1.el6.centos.x86_64 是用來和某臺伺服器進行同步的,ntp-4.2.6p5-1.el6.centos.x86_64是用來提供時間同步服務的。

2、 修改配置檔案ntp.conf

[hadoop@bigdata-senior03 data]$ vim /etc/ntp.conf
  • 1

啟用restrice,修改網段

restrict 192.168.100.0 mask 255.255.255.0 nomodify notrap 
將這行的註釋去掉,並且將網段改為叢集的網段,我們這裡是100網段。

註釋掉server域名配置

#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
  • 1
  • 2
  • 3
  • 4

是時間伺服器的域名,這裡不需要連線網際網路,所以將他們註釋掉。

修改

server 127.127.1.0

fudge 127.127.1.0 stratum 10

3、 修改配置檔案ntpd

[hadoop@bigdata-senior03 ~]$ sudo vim /etc/sysconfig/ntpd
  • 1

新增一行配置:SYNC_CLOCK=yes

enter image description here

4、 啟動ntp服務

[hadoop@bigdata-senior03 ~]$ sudo chkconfig ntpd on
  • 1

這樣每次機器啟動時,ntp服務都會自動啟動。

三十四、配置其他機器的同步

切換到root使用者進行配置通過contab進行定時同步:

[root@bigdata-senior02 hadoop]# crontab -e 
*/10 * * * * /usr/sbin/ntpdate bigdata-senior03.chybinmy.com
[root@bigdata-senior02 hadoop]# crontab -e 
*/10 * * * * /usr/sbin/ntpdate bigdata-senior03.chybinmy.com
  • 1
  • 2
  • 3
  • 4

三十五、 測試同步是否有效

1、 檢視目前三臺機器的時間

[hadoop@bigdata-senior03 ~]$ date "+%Y-%m-%d %H:%M:%S"
2016-09-23 16:43:56
[hadoop@bigdata-senior02 ~]$ date "+%Y-%m-%d %H:%M:%S"
2016-09-23 16:44:08
[hadoop@bigdata-senior01 data]$ date "+%Y-%m-%d %H:%M:%S"
2016-09-23 16:44:18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2、 修改bigdata-senior01上的時間

將時間改為一個以前的時間:

[hadoop@bigdata-senior01 data]$ sudo date -s '2016-01-01 00:00:00'
Fri Jan  1 00:00:00 CST 2016
[hadoop@bigdata-senior01 data]$ date "+%Y-%m-%d %H:%M:%S"
2016-01-01 00:00:05
  • 1
  • 2
  • 3
  • 4

等10分鐘,看是否可以實現自動同步,將bigdata-senior01上的時間修改為和bigdata-senior03上的一致。

3、 檢視是否自動同步時間

[hadoop@bigdata-senior01 data]$ date "+%Y-%m-%d %H:%M:%S"
2016-09-23 16:54:36
  • 1
  • 2

可以看到bigdata-senior01上的時間已經實現自動同步了。

第十步、Zookeeper分散式機器部署

三十六、zookeeper說明

Zookeeper在Hadoop叢集中的作用。

Zookeeper是分散式管理協作框架,Zookeeper叢集用來保證Hadoop叢集的高可用,(高可用的含義是:叢集中就算有一部分伺服器當機,也能保證正常地對外提供服務。)

Zookeeper保證高可用的原理。

Zookeeper叢集能夠保證NamaNode服務高可用的原理是:Hadoop叢集中有兩個NameNode服務,兩個NaameNode都定時地給Zookeeper傳送心跳,告訴Zookeeper我還活著,可以提供服務,單某一個時間只有一個是Action狀態,另外一個是Standby狀態,一旦Zookeeper檢測不到Action NameNode傳送來的心跳後,就切換到Standby狀態的NameNode上,將它設定為Action狀態,所以叢集中總有一個可用的NameNode,達到了NameNode的高可用目的。

Zookeeper的選舉機制。

Zookeeper叢集也能保證自身的高可用,保證自身高可用的原理是,Zookeeper叢集中的各個機器分為Leader和Follower兩個角色,寫入資料時,要先寫入Leader,Leader同意寫入後,再通知Follower寫入。客戶端讀取數時,因為資料都是一樣的,可以從任意一臺機器上讀取資料。

這裡Leader角色就存在單點故障的隱患,高可用就是解決單點故障隱患的。Zookeeper從機制上解決了Leader的單點故障問題,Leader是哪一臺機器是不固定的,Leader是選舉出來的。選舉流程是,叢集中任何一臺機器發現叢集中沒有Leader時,就推薦自己為Leader,其他機器來同意,當超過一半數的機器同意它為Leader時,選舉結束,所以Zookeeper叢集中的機器資料必須是奇數。這樣就算當Leader機器當機後,會很快選舉出新的Leader,保證了Zookeeper叢集本身的高可用。

寫入高可用。

叢集中的寫入操作都是先通知Leader,Leader再通知Follower寫入,實際上當超過一半的機器寫入成功後,就認為寫入成功了,所以就算有些機器當機,寫入也是成功的。

讀取高可用。

zookeeperk客戶端讀取資料時,可以讀取叢集中的任何一個機器。所以部分機器的當機並不影響讀取。

zookeeper伺服器必須是奇數臺,因為zookeeper有選舉制度,角色有:領導者、跟隨者、觀察者,選舉的目的是保證叢集中資料的一致性。

三十七、安裝zookeeper

我們這裡在BigData01、BigData02、BigData03三臺機器上安裝zookeeper叢集。

1、 解壓安裝包

在BigData01上安裝解壓zookeeper安裝包。

[hadoop@bigdata-senior01 hadoop-2.5.0]$ tar -zxf /opt/sofeware/zookeeper-3.4.8.tar.gz -C /opt/modules/
  • 1

2、 修改配置

拷貝conf下的zoo_sample.cfg副本,改名為zoo.cfg。zoo.cfg是zookeeper的配置檔案:

[hadoop@bigdata-senior01 zookeeper-3.4.8]$ cp conf/zoo_sample.cfg conf/zoo.cfg
  • 1

dataDir屬性設定zookeeper的資料檔案存放的目錄:

dataDir=/opt/modules/zookeeper-3.4.8/data/zData

指定zookeeper叢集中各個機器的資訊:

server.1=bigdata-senior01.chybinmy.com:2888:3888
server.2=bigdata-senior02.chybinmy.com:2888:3888
server.3=bigdata-senior03.chybinmy.com:2888:3888
  • 1
  • 2
  • 3

server後面的數字範圍是1到255,所以一個zookeeper叢集最多可以有255個機器。

enter image description here

3、 建立myid檔案

在dataDir所指定的目錄下創一個名為myid的檔案,檔案內容為server點後面的數字。

enter image description here

4、 分發到其他機器

[hadoop@bigdata-senior01 zookeeper-3.4.8]$ scp -r /opt/modules/zookeeper-3.4.8 bigdata-senior02.chybinmy.com:/opt/modules
[hadoop@bigdata-senior01 zookeeper-3.4.8]$ scp -r /opt/modules/zookeeper-3.4.8 bigdata-senior03.chybinmy.com:/opt/modules
  • 1
  • 2

5、 修改其他機器上的myid檔案

[hadoop@bigdata-senior02 zookeeper-3.4.8]$ echo 2 > /opt/modules/zookeeper-3.4.8/data/zData/myid
[hadoop@bigdata-senior02 zookeeper-3.4.8]$ cat /opt/modules/zookeeper-3.4.8/data/zData/myid 
2
  • 1
  • 2
  • 3
[hadoop@bigdata-senior03 ~]$ echo 3 > /opt/modules/zookeeper-3.4.8/data/zData/myid
[hadoop@bigdata-senior03 ~]$ cat /opt/modules/zookeeper-3.4.8/data/zData/myid
3
  • 1
  • 2
  • 3

6、 啟動zookeeper

需要在各個機器上分別啟動zookeeper。

[hadoop@bigdata-senior01 zookeeper-3.4.8]$ bin/zkServer.sh start
[hadoop@bigdata-senior02 zookeeper-3.4.8]$ bin/zkServer.sh start
[hadoop@bigdata-senior03 zookeeper-3.4.8]$ bin/zkServer.sh start
  • 1
  • 2
  • 3

enter image description here

三十八、zookeeper命令

進入zookeeper Shell

在zookeeper根目錄下執行 bin/zkCli.sh進入zk shell模式。

zookeeper很像一個小型的檔案系統,/是根目錄,下面的所有節點都叫zNode。

進入zk shell 後輸入任意字元,可以列出所有的zookeeper命令

enter image description here

查詢zNode上的資料:get /zookeeper

建立一個zNode : create /znode1 “demodata “

列出所有子zNode:ls /

enter image description here

刪除znode : rmr /znode1

退出shell模式:quit

第十一步、Hadoop 2.x HDFS HA 部署

三十九、HDFS HA原理

單NameNode的缺陷存在單點故障的問題,如果NameNode不可用,則會導致整個HDFS檔案系統不可用。所以需要設計高可用的HDFS(Hadoop HA)來解決NameNode單點故障的問題。解決的方法是在HDFS叢集中設定多個NameNode節點。但是一旦引入多個NameNode,就有一些問題需要解決。

  • HDFS HA需要保證的四個問題:

    • 保證NameNode記憶體中後設資料資料一致,並保證編輯日誌檔案的安全性。

    • 多個NameNode如何協作

    • 客戶端如何能正確地訪問到可用的那個NameNode。

    • 怎麼保證任意時刻只能有一個NameNode處於對外服務狀態。

  • 解決方法

    • 對於保證NameNode後設資料的一致性和編輯日誌的安全性,採用Zookeeper來儲存編輯日誌檔案。

    • 兩個NameNode一個是Active狀態的,一個是Standby狀態的,一個時間點只能有一個Active狀態的 
      NameNode提供服務,兩個NameNode上儲存的後設資料是實時同步的,當Active的NameNode出現問題時,通過Zookeeper實時切換到Standby的NameNode上,並將Standby改為Active狀態。

    • 客戶端通過連線一個Zookeeper的代理來確定當時哪個NameNode處於服務狀態。

四十、HDFS HA架構圖

enter image description here

  • HDFS HA架構中有兩臺NameNode節點,一臺是處於活動狀態(Active)為客戶端提供服務,另外一臺處於熱備份狀態(Standby)。

  • 後設資料檔案有兩個檔案:fsimage和edits,備份後設資料就是備份這兩個檔案。JournalNode用來實時從Active NameNode上拷貝edits檔案,JournalNode有三臺也是為了實現高可用。

  • Standby NameNode不對外提供後設資料的訪問,它從Active NameNode上拷貝fsimage檔案,從JournalNode上拷貝edits檔案,然後負責合併fsimage和edits檔案,相當於SecondaryNameNode的作用。最終目的是保證Standby NameNode上的後設資料資訊和Active NameNode上的後設資料資訊一致,以實現熱備份。

  • Zookeeper來保證在Active NameNode失效時及時將Standby NameNode修改為Active狀態。

  • ZKFC(失效檢測控制)是Hadoop裡的一個Zookeeper客戶端,在每一個NameNode節點上都啟動一個ZKFC程式,來監控NameNode的狀態,並把NameNode的狀態資訊彙報給Zookeeper叢集,其實就是在Zookeeper上建立了一個Znode節點,節點裡儲存了NameNode狀態資訊。當NameNode失效後,ZKFC檢測到報告給Zookeeper,Zookeeper把對應的Znode刪除掉,Standby ZKFC發現沒有Active狀態的NameNode時,就會用shell命令將自己監控的NameNode改為Active狀態,並修改Znode上的資料。 
    Znode是個臨時的節點,臨時節點特徵是客戶端的連線斷了後就會把znode刪除,所以當ZKFC失效時,也會導致切換NameNode。

  • DataNode會將心跳資訊和Block彙報資訊同時發給兩臺NameNode,DataNode只接受Active NameNode發來的檔案讀寫操作指令。

四十一、搭建HDFS HA 環境

1、 伺服器角色規劃

bigdata-senior01.chybinmy.com bigdata-senior01.chybinmy.com bigdata-senior01.chybinmy.com
NameNode NameNode  
Zookeeper Zookeeper Zookeeper
DataNode DataNode DataNode
  ResourceManage ResourceManage
NodeManager NodeManager NodeManager

2、 建立HDFS HA 版本Hadoop程式目錄

在bigdata01、bigdata02、bigdata03三臺機器上分別建立目錄/opt/modules/hadoopha/用來存放Hadoop HA環境。

[hadoop@bigdata-senior01 modules]$ mkdir /opt/modules/hadoopha
  • 1

3、 新解壓Hadoop 2.5.0

[hadoop@bigdata-senior01 ~]$ tar -zxf /opt/sofeware/hadoop-2.5.0.tar.gz -C /opt/modules/hadoopha/
  • 1

4、 配置Hadoop JDK路徑

修改hadoop-env.sh、mapred-env.sh、yarn-env.sh檔案中的JDK路徑
export JAVA_HOME="/opt/modules/jdk1.7.0_67"
  • 1
  • 2

5、 配置hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <property>
    <!-- 為namenode叢集定義一個services name -->
    <name>dfs.nameservices</name>
    <value>ns1</value>
  </property>
  <property>
    <!-- nameservice 包含哪些namenode,為各個namenode起名 -->
    <name>dfs.ha.namenodes.ns1</name>
    <value>nn1,nn2</value>
  </property>
  <property>
    <!--  名為nn1的namenode 的rpc地址和埠號,rpc用來和datanode通訊 -->
    <name>dfs.namenode.rpc-address.ns1.nn1</name>
    <value>bigdata-senior01.chybinmy.com:8020</value>
  </property>
  <property>
    <!-- 名為nn2的namenode 的rpc地址和埠號,rpc用來和datanode通訊  -->
    <name>dfs.namenode.rpc-address.ns1.nn2</name>
    <value>bigdata-senior02.chybinmy.com:8020</value>
  </property>
  <property>
    <!--名為nn1的namenode 的http地址和埠號,web客戶端 -->
    <name>dfs.namenode.http-address.ns1.nn1</name>
    <value>bigdata-senior01.chybinmy.com:50070</value>
  </property>
  <property>
    <!--名為nn2的namenode 的http地址和埠號,web客戶端 -->
    <name>dfs.namenode.http-address.ns1.nn2</name>
    <value>bigdata-senior02.chybinmy.com:50070</value>
  </property>
  <property>
    <!--  namenode間用於共享編輯日誌的journal節點列表 -->
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://bigdata-senior01.chybinmy.com:8485;bigdata-senior02.chybinmy.com:8485;bigdata-senior03.chybinmy.com:8485/ns1</value>
  </property>
  <property>
    <!--  journalnode 上用於存放edits日誌的目錄 -->
    <name>dfs.journalnode.edits.dir</name>
    <value>/opt/modules/hadoopha/hadoop-2.5.0/tmp/data/dfs/jn</value>
  </property>
  <property>
    <!--  客戶端連線可用狀態的NameNode所用的代理類 -->
    <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</value>
  </property>
  <property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/home/hadoop/.ssh/id_rsa</value>
  </property>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

6、 配置core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <property>
    <!--  hdfs 地址,ha中是連線到nameservice -->
    <name>fs.defaultFS</name>
    <value>hdfs://ns1</value>
  </property>
  <property>
    <!--  -->
    <name>hadoop.tmp.dir</name>
    <value>/opt/modules/hadoopha/hadoop-2.5.0/data/tmp</value>
  </property>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

hadoop.tmp.dir設定hadoop臨時目錄地址,預設時,NameNode和DataNode的資料存在這個路徑下。

7、 配置slaves檔案

bigdata-senior01.chybinmy.com
bigdata-senior02.chybinmy.com
bigdata-senior03.chybinmy.com
  • 1
  • 2
  • 3

8、 分發到其他節點

分發之前先將share/doc目錄刪除,這個目錄中是幫助檔案,並且很大,可以刪除。

[hadoop@bigdata-senior01 hadoop-2.5.0]$ scp -r /opt/modules/hadoopha bigdata-senior02.chybinmy.com:/opt/modules
[hadoop@bigdata-senior01 hadoop-2.5.0]$ scp -r /opt/modules/hadoopha bigdata-senior03.chybinmy.com:/opt/modules
  • 1
  • 2

9、 啟動HDFS HA叢集

三臺機器分別啟動Journalnode。

[hadoop@bigdata-senior01 hadoop-2.5.0]$ sbin/hadoop-daemon.sh start journalnode
[hadoop@bigdata-senior02 hadoop-2.5.0]$ sbin/hadoop-daemon.sh start journalnode
[hadoop@bigdata-senior03 hadoop-2.5.0]$ sbin/hadoop-daemon.sh start journalnode
  • 1
  • 2
  • 3

jps命令檢視是否啟動。

10、 啟動Zookeeper

在三臺節點上啟動Zookeeper:

[hadoop@bigdata-senior01 zookeeper-3.4.8]$ bin/zkServer.sh start
[hadoop@bigdata-senior02 zookeeper-3.4.8]$ bin/zkServer.sh start
[hadoop@bigdata-senior03 zookeeper-3.4.8]$ bin/zkServer.sh start
  • 1
  • 2
  • 3

11、 格式化NameNode

在第一臺上進行NameNode格式化:

[hadoop@bigdata-senior01 hadoop-2.5.0]$ bin/hdfs namenode -format
  • 1

在第二臺NameNode上:

[hadoop@bigdata-senior02 hadoop-2.5.0]$ bin/hdfs namenode -bootstrapStandby
  • 1

12、 啟動NameNode

在第一臺、第二臺上啟動NameNode:

[hadoop@bigdata-senior01 hadoop-2.5.0]$ sbin/hadoop-daemon.sh start namenode
[hadoop@bigdata-senior02 hadoop-2.5.0]$ sbin/hadoop-daemon.sh start namenode
  • 1
  • 2

檢視HDFS Web頁面,此時兩個NameNode都是standby狀態。

切換第一臺為active狀態:

[hadoop@bigdata-senior01 hadoop-2.5.0]$ bin/hdfs haadmin -transitionToActive nn1
  • 1

可以新增上forcemanual引數,強制將一個NameNode轉換為Active狀態。

[hadoop@bigdata-senior01 hadoop-2.5.0]$ bin/hdfs haadmin –transitionToActive -forcemanual nn1
  • 1

此時從web 頁面就看到第一臺已經是active狀態了。

enter image description here

13、 配置故障自動轉移

利用zookeeper叢集實現故障自動轉移,在配置故障自動轉移之前,要先關閉叢集,不能在HDFS執行期間進行配置。

關閉NameNode、DataNode、JournalNode、zookeeper

[hadoop@bigdata-senior01 hadoop-2.5.0]$ sbin/hadoop-daemon.sh stop namenode
[hadoop@bigdata-senior01 hadoop-2.5.0]$ sbin/hadoop-daemon.sh stop datanode
[hadoop@bigdata-senior01 hadoop-2.5.0]$ sbin/hadoop-daemon.sh stop journalnode
[hadoop@bigdata-senior01 hadoop-2.5.0]$ cd ../../zookeeper-3.4.8/
[hadoop@bigdata-senior01 zookeeper-3.4.8]$ bin/zkServer.sh stop
[hadoop@bigdata-senior02 hadoop-2.5.0]$ sbin/hadoop-daemon.sh stop namenode
[hadoop@bigdata-senior02 hadoop-2.5.0]$ sbin/hadoop-daemon.sh stop datanode
[hadoop@bigdata- senior02 hadoop-2.5.0]$ sbin/hadoop-daemon.sh stop journalnode
[hadoop@bigdata- senior02 hadoop-2.5.0]$ cd ../../zookeeper-3.4.8/
[hadoop@bigdata- senior02 zookeeper-3.4.8]$ bin/zkServer.sh stop
[hadoop@bigdata- senior03 hadoop-2.5.0]$ sbin/hadoop-daemon.sh stop datanode
[hadoop@bigdata- senior03 hadoop-2.5.0]$ sbin/hadoop-daemon.sh stop journalnode
[hadoop@bigdata- senior03 hadoop-2.5.0]$ cd ../../zookeeper-3.4.8/
[hadoop@bigdata- senior03 zookeeper-3.4.8]$ bin/zkServer.sh stop
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

修改hdfs-site.xml

<property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
</property>
  • 1
  • 2
  • 3
  • 4

修改core-site.xml

<property>
   <name>ha.zookeeper.quorum</name>
   <value>bigdata-senior01.chybinmy.com:2181,bigdata-senior02.chybinmy.com:2181,bigdata-senior03.chybinmy.com:2181</value>
</property>
  • 1
  • 2
  • 3
  • 4

將hdfs-site.xml和core-site.xml分發到其他機器

[hadoop@bigdata-senior01 hadoop-2.5.0]$ scp /opt/modules/hadoopha/hadoop-2.5.0/etc/hadoop/hdfs-site.xml bigdata-senior02.chybinmy.com:/opt/modules/hadoopha/hadoop-2.5.0/etc/hadoop/
[hadoop@bigdata-senior01 hadoop-2.5.0]$ scp /opt/modules/hadoopha/hadoop-2.5.0/etc/hadoop/hdfs-site.xml bigdata-senior03.chybinmy.com:/opt/modules/hadoopha/hadoop-2.5.0/etc/hadoop/
[hadoop@bigdata-senior01 hadoop-2.5.0]$ scp /opt/modules/hadoopha/hadoop-2.5.0/etc/hadoop/core-site.xml bigdata-senior02.chybinmy.com:/opt/modules/hadoopha/hadoop-2.5.0/etc/hadoop/
[hadoop@bigdata-senior01 hadoop-2.5.0]$ scp /opt/modules/hadoopha/hadoop-2.5.0/etc/hadoop/core-site.xml bigdata-senior03.chybinmy.com:/opt/modules/hadoopha/hadoop-2.5.0/etc/hadoop/
  • 1
  • 2
  • 3
  • 4

啟動zookeeper

三臺機器啟動zookeeper

[hadoop@bigdata-senior01 hadoop-2.5.0]$ /opt/modules/zookeeper-3.4.8/bin/zkServer.sh start
  • 1

建立一個zNode

[hadoop@bigdata-senior01 hadoop-2.5.0]$ cd /opt/modules/hadoopha/hadoop-2.5.0/
[hadoop@bigdata-senior01 hadoop-2.5.0]$ bin/hdfs zkfc -formatZK
  • 1
  • 2

enter image description here

在Zookeeper上建立一個儲存namenode相關的節點。

14、 啟動HDFS、JournalNode、zkfc

啟動NameNode、DataNode、JournalNode、zkfc

[hadoop@bigdata-senior01 hadoop-2.5.0]$ sbin/start-dfs.sh
  • 1

zkfc只針對NameNode監聽。

四十二、測試HDFS HA

1、 測試故障自動轉移和資料是否共享

在nn1上上傳檔案

目前bigdata-senior01節點上的NameNode是Active狀態的。

enter image description here

[hadoop@bigdata-senior01 hadoop-2.5.0]$ bin/hdfs dfs -put /opt/data/wc.input /
  • 1

enter image description here

將nn1上的NodeNode程式殺掉

[hadoop@bigdata-senior01 hadoop-2.5.0]$ kill -9 3364
  • 1

nn1上的namenode已經無法訪問了。

檢視nn2是否是Active狀態

enter image description here

在nn2上檢視是否看見檔案

enter image description here

經以上驗證,已經實現了nn1和nn2之間的檔案同步和故障自動轉移。

第十二步、Hadoop 2.x YARN HA 部署

四十三、YARN HA原理

Hadoop2.4版本之前,ResourceManager也存在單點故障的問題,也需要實現HA來保證ResourceManger的高可也用性。

ResouceManager從記錄著當前叢集的資源分配情況和JOB的執行狀態,YRAN HA 利用Zookeeper等共享儲存介質來儲存這些資訊來達到高可用。另外利用Zookeeper來實現ResourceManager自動故障轉移。

enter image description here

  • MasterHADaemon:控制RM的 Master的啟動和停止,和RM執行在一個程式中,可以接收外部RPC命令。

  • 共享儲存:Active Master將資訊寫入共享儲存,Standby Master讀取共享儲存資訊以保持和Active Master同步。

  • ZKFailoverController:基於Zookeeper實現的切換控制器,由ActiveStandbyElector和HealthMonitor組成,ActiveStandbyElector負責與Zookeeper互動,判斷所管理的Master是進入Active還是Standby;HealthMonitor負責監控Master的活動健康情況,是個監視器。

  • Zookeeper:核心功能是維護一把全域性鎖控制整個叢集上只有一個Active的ResourceManager。

四十四、搭建YARN HA環境

1、 伺服器角色規劃

bigdata-senior01.chybinmy.com bigdata-senior01.chybinmy.com bigdata-senior01.chybinmy.com
NameNode NameNode  
Zookeeper Zookeeper Zookeeper
DataNode DataNode DataNode
  ResourceManage ResourceManage
NodeManager NodeManager NodeManager

2、 修改配置檔案yarn-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
  </property>
  <property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>106800</value>
  </property>
  <property>
    <!--  啟用resourcemanager的ha功能 -->
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
  </property>
  <property>
    <!--  為resourcemanage ha 叢集起個id -->
    <name>yarn.resourcemanager.cluster-id</name>
    <value>yarn-cluster</value>
  </property>
  <property>
    <!--  指定resourcemanger ha 有哪些節點名 -->
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm12,rm13</value>
  </property>
  <property>
    <!--  指定第一個節點的所在機器 -->
    <name>yarn.resourcemanager.hostname.rm12</name>
    <value>bigdata-senior02.chybinmy.com</value>
  </property>
  <property>
    <!--  指定第二個節點所在機器 -->
    <name>yarn.resourcemanager.hostname.rm13</name>
    <value>bigdata-senior03.chybinmy.com</value>
  </property>
  <property>
    <!--  指定resourcemanger ha 所用的zookeeper 節點 -->
    <name>yarn.resourcemanager.zk-address</name>
    <value>bigdata-senior01.chybinmy.com:2181,bigdata-senior02.chybinmy.com:2181,bigdata-senior03.chybinmy.com:2181</value>
  </property>
  <property>
    <!--  -->
    <name>yarn.resourcemanager.recovery.enabled</name>
    <value>true</value>
  </property>
  <property>
    <!--  -->
    <name>yarn.resourcemanager.store.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
  </property>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

3、 分發到其他機器

[hadoop@bigdata-senior01 hadoop-2.5.0]$ scp /opt/modules/hadoopha/hadoop-2.5.0/etc/hadoop/yarn-site.xml bigdata-senior02.chybinmy.com:/opt/modules/hadoopha/hadoop-2.5.0/etc/hadoop/
[hadoop@bigdata-senior01 hadoop-2.5.0]$ scp /opt/modules/hadoopha/hadoop-2.5.0/etc/hadoop/yarn-site.xml bigdata-senior03.chybinmy.com:/opt/modules/hadoopha/hadoop-2.5.0/etc/hadoop/\
  • 1
  • 2

4、 啟動

在bigdata-senior01上啟動yarn:

[hadoop@bigdata-senior01 hadoop-2.5.0]$ sbin/start-yarn.sh
  • 1

在bigdata-senior02、bigdata-senior03上啟動resourcemanager:

[hadoop@bigdata-senior02 hadoop-2.5.0]$ sbin/yarn-daemon.sh start resourcemanager
[hadoop@bigdata-senior03 hadoop-2.5.0]$ sbin/yarn-daemon.sh start resourcemanager
  • 1
  • 2

啟動後各個節點的程式。

enter image description here

enter image description here

enter image description here

Web客戶端訪問bigdata02機器上的resourcemanager正常,它是active狀態的。

http://bigdata-senior02.chybinmy.com:8088/cluster

訪問另外一個resourcemanager,因為他是standby,會自動跳轉到active的resourcemanager。

http://bigdata-senior03.chybinmy.com:8088/cluster

四十五、測試YARN HA

5、 執行一個mapreduce job

[hadoop@bigdata-senior01 hadoop-2.5.0]$ bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar wordcount /wc.input /input
  • 1

6、 在job執行過程中,將Active狀態的resourcemanager程式殺掉。

[hadoop@bigdata-senior02 hadoop-2.5.0]$ kill -9 4475
  • 1

7、 觀察另外一個resourcemanager是否可以自動接替。

bigdata02的resourcemanage Web客戶端已經不能訪問,bigdata03的resourcemanage已經自動變為active狀態。

8、 觀察job是否可以順利完成。

而mapreduce job 也能順利完成,沒有因為resourcemanager的意外故障而影響執行。

經過以上測試,已經驗證YARN HA 已經搭建成功。

第十三步、HDFS Federation 架構部署

四十六、HDFS Federation 的使用原因

1、 單個NameNode節點的侷限性

名稱空間的限制。

NameNode上儲存著整個HDFS上的檔案的後設資料,NameNode是部署在一臺機器上的,因為單個機器硬體的限制,必然會限制NameNode所能管理的檔案個數,制約了資料量的增長。

資料隔離問題。

整個HDFS上的檔案都由一個NameNode管理,所以一個程式很有可能會影響到整個HDFS上的程式,並且許可權控制比較複雜。

效能瓶頸。

單個NameNode時HDFS檔案系統的吞吐量受限於單個NameNode的吞吐量。因為NameNode是個JVM程式,JVM程式所佔用的記憶體很大時,效能會下降很多。

2、 HDFS Federation介紹

HDFS Federation是可以在Hadoop叢集中設定多個NameNode,不同於HA中多個NameNode是完全一樣的,是多個備份,Federation中的多個NameNode是不同的,可以理解為將一個NameNode切分為了多個NameNode,每一個NameNode只負責管理一部分資料。 
HDFS Federation中的多個NameNode共用DataNode。

四十七、HDFS Federation的架構圖

enter image description here

四十八、HDFS Federation搭建

1、 伺服器角色規劃

bigdata-senior01.chybinmy.com bigdata-senior01.chybinmy.com bigdata-senior01.chybinmy.com
NameNode1 NameNode2 NameNode3
  ResourceManage  
DataNode DataNode DataNode
NodeManager NodeManager NodeManager

2、 建立HDFS Federation 版本Hadoop程式目錄

在bigdata01上建立目錄/opt/modules/hadoopfederation /用來存放Hadoop Federation環境。

[hadoop@bigdata-senior01 modules]$ mkdir /opt/modules/hadoopfederation
  • 1

3、 新解壓Hadoop 2.5.0

[hadoop@bigdata-senior01 ~]$ tar -zxf /opt/sofeware/hadoop-2.5.0.tar.gz -C /opt/modules/hadoopfederation/
  • 1

4、 配置Hadoop JDK路徑

修改hadoop-env.sh、mapred-env.sh、yarn-env.sh檔案中的JDK路徑。

export JAVA_HOME=”/opt/modules/jdk1.7.0_67”

5、 配置hdfs-site.xml

<configuration>
<property>
<!—配置三臺NameNode -->
    <name>dfs.nameservices</name>
    <value>ns1,ns2,ns3</value>
  </property>
  <property>
<!—第一臺NameNode的機器名和rpc埠,指定了NameNode和DataNode通訊用的埠號 -->
    <name>dfs.namenode.rpc-address.ns1</name>
    <value>bigdata-senior01.chybinmy.com:8020</value>
  </property>
   <property>
<!—第一臺NameNode的機器名和rpc埠,備用埠號 -->
    <name>dfs.namenode.serviceerpc-address.ns1</name>
    <value>bigdata-senior01.chybinmy.com:8022</value>
  </property>
  <property>
<!—第一臺NameNode的http頁面地址和埠號 -->
    <name>dfs.namenode.http-address.ns1</name>
    <value>bigdata-senior01.chybinmy.com:50070</value>
  </property>
<property>
<!—第一臺NameNode的https頁面地址和埠號 -->
    <name>dfs.namenode.https-address.ns1</name>
    <value>bigdata-senior01.chybinmy.com:50470</value>
  </property>

  <property>
    <name>dfs.namenode.rpc-address.ns2</name>
    <value>bigdata-senior02.chybinmy.com:8020</value>
  </property>
   <property>
    <name>dfs.namenode.serviceerpc-address.ns2</name>
    <value>bigdata-senior02.chybinmy.com:8022</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.ns2</name>
    <value>bigdata-senior02.chybinmy.com:50070</value>
  </property>
    <property>
    <name>dfs.namenode.https-address.ns2</name>
    <value>bigdata-senior02.chybinmy.com:50470</value>
  </property>


  <property>
    <name>dfs.namenode.rpc-address.ns3</name>
    <value>bigdata-senior03.chybinmy.com:8020</value>
  </property>
   <property>
    <name>dfs.namenode.serviceerpc-address.ns3</name>
    <value>bigdata-senior03.chybinmy.com:8022</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.ns3</name>
    <value>bigdata-senior03.chybinmy.com:50070</value>
  </property>
    <property>
    <name>dfs.namenode.https-address.ns3</name>
    <value>bigdata-senior03.chybinmy.com:50470</value>
  </property>

</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

6、 配置core-site.xml

<configuration>
<property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/modules/hadoopha/hadoop-2.5.0/data/tmp</value>
</property>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

hadoop.tmp.dir設定hadoop臨時目錄地址,預設時,NameNode和DataNode的資料存在這個路徑下。

7、 配置slaves檔案

bigdata-senior01.chybinmy.com
bigdata-senior02.chybinmy.com
bigdata-senior03.chybinmy.com
  • 1
  • 2
  • 3

8、 配置yarn-site.xml

<configuration>
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
 </property>     
 <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>bigdata-senior02.chybinmy.com</value>
 </property>     
 <property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
 </property>     
 <property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>106800</value>
 </property>     
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

9、 分發到其他節點

分發之前先將share/doc目錄刪除,這個目錄中是幫助檔案,並且很大,可以刪除。

[hadoop@bigdata-senior01 hadoop-2.5.0]$ scp -r /opt/modules/ /opt/modules/hadoopfederation bigdata-senior02.chybinmy.com:/opt/modules
[hadoop@bigdata-senior01 hadoop-2.5.0]$ scp -r /opt/modules/hadoopfederation bigdata-senior03.chybinmy.com:/opt/modules
  • 1
  • 2

10、 格式化NameNode

在第一臺上進行NameNode格式化。

[hadoop@bigdata-senior01 hadoop-2.5.0]$ bin/hdfs namenode -format -clusterId hadoop-federation-clusterId
  • 1

這裡一定要指定一個叢集ID,使得多個NameNode的叢集ID是一樣的,因為這三個NameNode在同一個叢集中,這裡叢集ID為hadoop-federation-clusterId。

在第二臺NameNode上。

[hadoop@bigdata-senior02 hadoop-2.5.0]$ bin/hdfs namenode -format -clusterId hadoop-federation-clusterId
  • 1

在第二臺NameNode上。

[hadoop@bigdata-senior03 hadoop-2.5.0]$ bin/hdfs namenode -format -clusterId hadoop-federation-clusterId
  • 1

11、 啟動NameNode

在第一臺、第二臺、第三臺機器上啟動NameNode:

[hadoop@bigdata-senior01 hadoop-2.5.0]$ sbin/hadoop-daemon.sh start namenode
[hadoop@bigdata-senior02 hadoop-2.5.0]$ sbin/hadoop-daemon.sh start namenode
[hadoop@bigdata-senior03 hadoop-2.5.0]$ sbin/hadoop-daemon.sh start namenode
  • 1
  • 2
  • 3

啟動後,用jps命令檢視是否已經啟動成功。

檢視HDFS Web頁面,此時三個NameNode都是standby狀態。

enter image description here

enter image description here

enter image description here

12、 啟動DataNode

[hadoop@bigdata-senior01 hadoop-2.5.0]$ sbin/hadoop-daemon.sh start datanode
[hadoop@bigdata-senior02 hadoop-2.5.0]$ sbin/hadoop-daemon.sh start datanode
[hadoop@bigdata-senior03 hadoop-2.5.0]$ sbin/hadoop-daemon.sh start datanode
  • 1
  • 2
  • 3

啟動後,用jps命令確認DataNode程式已經啟動成功。

四十九、測試HDFS Federation

1、 修改core-site.xml

在bigdata-senior01機器上,修改core-site.xml檔案,指定連線的NameNode是第一臺NameNode。

[hadoop@bigdata-senior01 hadoop-2.5.0]$ vim etc/hadoop/core-site.xml

<configuration>
  <property>
     <name>fs.defaultFS</name>
     <value>hdfs://bigdata-senior01.chybinmy.com:8020</value>
  </property>
<property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/modules/hadoopfederation/hadoop-2.5.0/data/tmp</value>
</property>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2、 在bigdate-senior01上傳一個檔案到HDFS

[hadoop@bigdata-senior01 hadoop-2.5.0]$ bin/hdfs dfs -mkdir /tmp
[hadoop@bigdata-senior01 hadoop-2.5.0]$ bin/hdfs dfs -put ~/shuffle_daily.sh /tmp/shuffle_daily.sh
  • 1
  • 2

3、 檢視HDFS檔案

enter image description here

可以看到,剛才的檔案只上傳到了bigdate-senior01機器上的NameNode上了,並沒有上傳到其他的NameNode上去。

這樣,在HDFS的客戶端,可以指定要上傳到哪個NameNode上,從而來達到了劃分NameNode的目的。

後記

這篇文章的操作步驟並不是工作中標準的操作流程,如果在成百上千的機器全部這樣安裝會被累死,希望讀者可以通過文章中一步步地安裝,從而初步瞭解到Hadoop的組成部分,協助過程等,這對於Hadoop的深入使用有很大的幫助。


實錄:《鳴宇淳:搭建Hadoop學習環境實戰解析》


彩蛋重磅 Chat 分享:《如何在三年內快速成長為一名技術專家》

分享人: 
方騰飛 併發程式設計網創始人,支付寶架構師 
Chat簡介: 
工作前三年是職業生涯中成長最快的幾年,在這段時間裡你會充滿激情,做事專注,也容易養成良好的習慣。 
在我們公司有些同學在前三年中就快速成為某一個領域的技術專家,有些同學也可能止步不前。本場Chat和大家一起探討下如何在三年內快速成長為一名技術專家。 
學習方法: 
掌握良好的學習心態 掌握系統化的學習方法 
知識如何內化成能力 
實戰技巧: 
你需要學會的編碼習慣 如何在普通專案中提高自己的能力 
在業務團隊做 
引用文字開發如何成長

想要免費參與本場 Chat ?很簡單,公眾號後臺回覆「技術專家」

這裡寫圖片描述


來源:http://blog.csdn.net/gitchat/article/details/77849331

相關文章