轉 史上最詳細的Hadoop環境搭建

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

前言

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

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

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

第一部分:Linux環境安裝

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

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

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

第三部分:Hadoop僞分佈式模式安裝

學習Hadoop通常是在僞分佈式模式下進行。這種模式是在一臺機器上各個進程上運行Hadoop的各個模塊,僞分佈式的意思是雖然各個模塊是在各個進程上分開運行的,可是隻是運行在一個操做系統上的,並非真正的分佈式。算法

第四部分:徹底分佈式安裝

徹底分佈式模式纔是生產環境採用的模式,Hadoop運行在服務器集羣上,生產環境通常都會作HA,以實現高可用。shell

第五部分:Hadoop HA安裝

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

第一部分:Linux環境安裝

第一步、配置Vmware NAT網絡

1、Vmware網絡模式介紹bootstrap

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

2、NAT模式配置

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

咱們部署Hadoop集羣,這裏選擇NAT模式,各個虛擬機經過NAT使用宿主機的IP來訪問外網。

咱們的要求是集羣中的各個虛擬機有固定的IP、能夠訪問外網,因此進行以下設置:

一、 Vmware安裝後,默認的NAT設置以下:

enter image description here

二、 默認的設置是啓動DHCP服務的,NAT會自動給虛擬機分配IP,可是咱們須要將各個機器的IP固定下來,因此要取消這個默認設置。

三、 爲機器設置一個子網網段,默認是192.168.136網段,咱們這裏設置爲100網段,未來各個虛擬機Ip就爲 192.168.100.*。

四、 點擊NAT設置按鈕,打開對話框,能夠修改網關地址和DNS地址。這裏咱們爲NAT指定DNS地址。

enter image description here

五、 網關地址爲當前網段裏的.2地址,好像是固定的,咱們不作修改,先記住網關地址就行了,後面會用到。

第二步、安裝Linux操做系統

3、Vmware上安裝Linux系統

一、 文件菜單選擇新建虛擬機

二、 選擇經典類型安裝,下一步。

三、 選擇稍後安裝操做系統,下一步。

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

enter image description here

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

enter image description here

六、 指定磁盤容量,是指定分給Linux虛擬機多大的硬盤,默認20G就能夠,下一步。

七、 點擊自定義硬件,能夠查看、修改虛擬機的硬件配置,這裏咱們不作修改。

八、 點擊完成後,就建立了一個虛擬機,可是此時的虛擬機仍是一個空殼,沒有操做系統,接下來安裝操做系統。

九、 點擊編輯虛擬機設置,找到DVD,指定操做系統ISO文件所在位置。

enter image description here

十、 點擊開啓此虛擬機,選擇第一個回車開始安裝操做系統。

enter image description here

十一、 設置root密碼。

enter image description here

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

enter image description here

1三、 先不添加普通用戶,其餘用默認的,就把Linux安裝完畢了。

4、設置網絡

由於Vmware的NAT設置中關閉了DHCP自動分配IP功能,因此Linux尚未IP,須要咱們設置網絡各個參數。

一、 用root進入Xwindow,右擊右上角的網絡鏈接圖標,選擇修改鏈接。

enter image description here

二、 網絡鏈接裏列出了當前Linux裏全部的網卡,這裏只有一個網卡System eth0,點擊編輯。

enter image description here

三、 配置IP、子網掩碼、網關(和NAT設置的同樣)、DNS等參數,由於NAT裏設置網段爲100.*,因此這臺機器能夠設置爲192.168.100.10網關和NAT一致,爲192.168.100.2

enter image description here

四、 用ping來檢查是否能夠鏈接外網,以下圖,已經鏈接成功。

enter image description here

5、修改Hostname

一、 臨時修改hostname

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

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

二、 永久修改hostname

想永久修改,應該修改配置文件 /etc/sysconfig/network。

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

打開文件後,

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

6、配置Host

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

7、關閉防火牆

學習環境能夠直接把防火牆關閉掉。

(1) 用root用戶登陸後,執行查看防火牆狀態。

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

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

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

(3) 若是要永久關閉防火牆用。

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

關閉,這種須要重啓才能生效。

8、關閉selinux

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

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

enter image description here

第三步、安裝JDK

9、安裝Java JDK

一、 查看是否已經安裝了java JDK。

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

注意:Hadoop機器上的JDK,最好是Oracle的Java JDK,否則會有一些問題,好比可能沒有JPS命令。 
若是安裝了其餘版本的JDK,卸載掉。

二、 安裝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,追加

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

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

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

  1.  
    [root @bigdata-senior01 /]# java -version
  2.  
    java version "1.7.0_67"
  3.  
    Java(TM) SE Runtime Environment (build 1.7.0_67-b01)
  4.  
    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個

第五步、本地模式部署

10、本地模式介紹

本地模式是最簡單的模式,全部模塊都運行與一個JVM進程中,使用的本地文件系統,而不是HDFS,本地模式主要是用於本地開發過程當中的運行調試用。下載hadoop安裝包後不用任何設置,默認的就是本地模式。

11、解壓hadoop後就是直接可使用

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

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

二、 解壓hadoop文件

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

三、 確保JAVA_HOME環境變量已經配置好

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

12、運行MapReduce程序,驗證

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

一、 準備mapreduce輸入文件wc.input

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

二、 運行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字樣,說明是運行在本地模式下的。

三、 查看輸出文件

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

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

輸出目錄中有_SUCCESS文件說明JOB運行成功,part-r-00000是輸出結果文件。 

第三部分:Hadoop僞分佈式模式安裝

第六步、僞分佈式Hadoop部署過程

十3、Hadoop所用的用戶設置

一、 建立一個名字爲hadoop的普通用戶

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

二、 給hadoop用戶sudo權限

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

設置權限,學習環境能夠將hadoop用戶的權限設置的大一些,可是生產環境必定要注意普通用戶的權限限制。

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

注意:若是root用戶無權修改sudoers文件,先手動爲root用戶添加寫權限。

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

三、 切換到hadoop用戶

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

四、 建立存放hadoop文件的目錄

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

五、 將hadoop文件夾的全部者指定爲hadoop用戶

若是存放hadoop的目錄的全部者不是hadoop,以後hadoop運行中可能會有權限問題,那麼就講全部者改成hadoop。

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

十4、解壓Hadoop目錄文件

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

二、 解壓hadoop-2.5.0.tar.gz

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

十5、配置Hadoop

一、 配置Hadoop環境變量

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

追加配置:

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

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

驗證HADOOP_HOME參數:

  1.  
    [hadoop @bigdata-senior01 /]$ echo $HADOOP_HOME
  2.  
    /opt/modules/hadoop- 2.5.0
  • 1
  • 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
  1.  
    修改JAVA_HOME參數爲:
  2.  
    export JAVA_HOME= "/opt/modules/jdk1.7.0_67"
  • 1
  • 2

三、 配置core-site.xml

enter image description here

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

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

  1.  
    <property>
  2.  
    <name>fs.defaultFS</name>
  3.  
    <value>hdfs://bigdata-senior01.chybinmy.com:8020</value>
  4.  
    </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
  1.  
    <property>
  2.  
    <name>hadoop.tmp.dir</name>
  3.  
    <value>/opt/data/tmp</value>
  4.  
    </property>
  • 1
  • 2
  • 3
  • 4

十6、配置、格式化、啓動HDFS

一、 配置hdfs-site.xml

enter image description here

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

dfs.replication配置的是HDFS存儲時的備份數量,由於這裏是僞分佈式環境只有一個節點,因此這裏設置爲1。

二、 格式化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應該一致,代表是一個集羣。

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

三、 啓動NameNode

  1.  
    [hadoop @bigdata-senior01 hadoop-2.5.0]$ ${HADOOP_HOME}/sbin/hadoop-daemon.sh start namenode
  2.  
    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

四、 啓動DataNode

  1.  
    [hadoop @bigdata-senior01 hadoop-2.5.0]$ ${HADOOP_HOME}/sbin/hadoop-daemon.sh start datanode
  2.  
    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

五、 啓動SecondaryNameNode

  1.  
    [hadoop @bigdata-senior01 hadoop-2.5.0]$ ${HADOOP_HOME}/sbin/hadoop-daemon.sh start secondarynamenode
  2.  
    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

六、 JPS命令查看是否已經啓動成功,有結果就是啓動成功了。

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

enter image description here

七、 HDFS上測試建立目錄、上傳、下載文件

HDFS上建立目錄

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

上傳本地文件到HDFS上

  1.  
    [hadoop @bigdata-senior01 hadoop-2.5.0]$ ${HADOOP_HOME}/bin/hdfs dfs -put
  2.  
    ${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

十7、配置、啓動YARN

一、 配置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

添加配置以下:

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

指定mapreduce運行在yarn框架上。

enter image description here

二、 配置yarn-site.xml

添加配置以下:

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

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

    enter image description here

三、 啓動Resourcemanager

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

enter image description here

四、 啓動nodemanager

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

enter image description here

五、 查看是否啓動成功

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

能夠看到ResourceManager、NodeManager已經啓動成功了。

enter image description here

六、 YARN的Web頁面

YARN的Web客戶端端口號是8088,經過http://192.168.100.10:8088/能夠查看。

enter image description here

十8、運行MapReduce Job

在Hadoop的share目錄裏,自帶了一些jar包,裏面帶有一些mapreduce實例小例子,位置在share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar,能夠運行這些例子體驗剛搭建好的Hadoop平臺,咱們這裏來運行最經典的WordCount實例。

一、 建立測試用的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

二、 運行WordCount MapReduce Job

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

enter image description here

三、 查看輸出結果目錄

  1.  
    [hadoop @bigdata-senior01 hadoop-2.5.0]$ bin/hdfs dfs -ls /wordcountdemo/output
  2.  
    -rw-r--r-- 1 hadoop supergroup 0 2016-07-05 05:12 /wordcountdemo/output/_SUCCESS
  3.  
    -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-開頭的文件。

  • 查看輸出文件內容。

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

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

十9、中止Hadoop

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

enter image description here

二10、 Hadoop各個功能模塊的理解

一、 HDFS模塊

HDFS負責大數據的存儲,經過將大文件分塊後進行分佈式存儲方式,突破了服務器硬盤大小的限制,解決了單臺機器沒法存儲大文件的問題,HDFS是個相對獨立的模塊,能夠爲YARN提供服務,也能夠爲HBase等其餘模塊提供服務。

二、 YARN模塊

YARN是一個通用的資源協同和任務調度框架,是爲了解決Hadoop1.x中MapReduce裏NameNode負載太大和其餘問題而建立的一個框架。

YARN是個通用框架,不止能夠運行MapReduce,還能夠運行Spark、Storm等其餘計算框架。

三、 MapReduce模塊

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

第七步、開啓歷史服務

二11、歷史服務介紹

Hadoop開啓歷史服務能夠在web頁面上查看Yarn上執行job狀況的詳細信息。能夠經過歷史服務器查看已經運行完的Mapreduce做業記錄,好比用了多少個Map、用了多少個Reduce、做業提交時間、做業啓動時間、做業完成時間等信息。

二12、開啓歷史服務

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

開啓後,能夠經過Web頁面查看歷史服務器:

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

二十3、Web查看job執行歷史

一、 運行一個mapreduce任務

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

二、 job執行中

enter image description here

三、 查看job歷史

enter image description here

enter image description here

歷史服務器的Web端口默認是19888,能夠查看Web界面。

可是在上面所顯示的某一個Job任務頁面的最下面,Map和Reduce個數的連接上,點擊進入Map的詳細信息頁面,再查看某一個Map或者Reduce的詳細日誌是看不到的,是由於沒有開啓日誌彙集服務。

二十4、開啓日誌彙集

四、 日誌彙集介紹

MapReduce是在各個機器上運行的,在運行過程當中產生的日誌存在於各個機器上,爲了可以統一查看各個機器的運行日誌,將日誌集中存放在HDFS上,這個過程就是日誌彙集。

五、 開啓日誌彙集

配置日誌彙集功能:

Hadoop默認是不啓用日誌彙集的。在yarn-site.xml文件裏配置啓用日誌彙集。

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

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

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

將配置文件分發到其餘節點:

  1.  
    [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/
  2.  
    [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進程:

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

重啓HistoryServer進程:

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

六、 測試日誌彙集

運行一個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各個模塊分別部署在不一樣的多臺機器上。

二十5、環境準備

一、 克隆虛擬機

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

  • 選擇「建立完整克隆」,虛擬機名稱爲BigData02,選擇虛擬機文件保存路徑,進行克隆。

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

二、 配置網絡

修改網卡名稱:

在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

三、 配置Hostname

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

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

四、 配置hosts

BigData0一、BigData0二、BigData03三臺機器hosts都配置爲:

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

五、 配置Windows上的SSH客戶端

在本地Windows中的SSH客戶端上添加對BigData0二、BigData03機器的SSH連接。

二十6、服務器功能規劃

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

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

爲了和以前BigData01機器上安裝僞分佈式Hadoop區分開來,咱們將BigData01上的Hadoop服務都中止掉,而後在一個新的目錄/opt/modules/app下安裝另一個Hadoop。 
咱們採用先在第一臺機器上解壓、配置Hadoop,而後再分發到其餘兩臺機器上的方式來安裝集羣。

六、 解壓Hadoop目錄:

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

七、 配置Hadoop JDK路徑修改hadoop-env.sh、mapred-env.sh、yarn-env.sh文件中的JDK路徑:

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

八、 配置core-site.xml

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

fs.defaultFS爲NameNode的地址。

hadoop.tmp.dir爲hadoop臨時目錄的地址,默認狀況下,NameNode和DataNode的數據文件都會存在這個目錄下的對應子目錄下。應該保證此目錄是存在的,若是不存在,先建立。

九、 配置hdfs-site.xml

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

dfs.namenode.secondary.http-address是指定secondaryNameNode的http訪問地址和端口號,由於在規劃中,咱們將BigData03規劃爲SecondaryNameNode服務器。

因此這裏設置爲:bigdata-senior03.chybinmy.com:50090

十、 配置slaves

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

slaves文件是指定HDFS上有哪些DataNode節點。

十一、 配置yarn-site.xml

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

十二、 配置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
  1.  
    <configuration>
  2.  
    <property>
  3.  
    <name>mapreduce.framework.name</name>
  4.  
    <value>yarn</value>
  5.  
    </property>
  6.  
    <property>
  7.  
    <name>mapreduce.jobhistory.address</name>
  8.  
    <value>bigdata-senior01.chybinmy.com:10020</value>
  9.  
    </property>
  10.  
    <property>
  11.  
    <name>mapreduce.jobhistory.webapp.address</name>
  12.  
    <value>bigdata-senior01.chybinmy.com:19888</value>
  13.  
    </property>
  14.  
    </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頁面地址和端口號。

二十8、設置SSH無密碼登陸

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

SSH是無密碼登陸的。

一、 在BigData01上生成公鑰

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

一路回車,都設置爲默認值,而後再當前用戶的Home目錄下的.ssh目錄中會生成公鑰文件(id_rsa.pub)和私鑰文件(id_rsa)

二、 分發公鑰

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

三、 設置BigData0二、BigData03到其餘機器的無密鑰登陸

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

二十9、分發Hadoop文件

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

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

二、 經過Scp分發

Hadoop根目錄下的share/doc目錄是存放的hadoop的文檔,文件至關大,建議在分發以前將這個目錄刪除掉,能夠節省硬盤空間並能提升分發的速度。

doc目錄大小有1.6G。

  1.  
    [hadoop@bigdata-senior01 hadoop-2.5.0]$ du -sh /opt/modules/app/hadoop-2.5.0/share/doc
  2.  
    1.6G /opt/modules/app/hadoop-2.5.0/share/doc
  3.  
    [hadoop@bigdata-senior01 hadoop-2.5.0]$ scp -r /opt/modules/app/hadoop-2.5.0/ bigdata-senior02.chybinmy.com:/opt/modules/app
  4.  
    [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

三10、格式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屬性配置的。

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

三11、啓動集羣

一、 啓動HDFS

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

enter image description here

二、 啓動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

三、 啓動日誌服務器

由於咱們規劃的是在BigData03服務器上運行MapReduce日誌服務,因此要在BigData03上啓動。

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

四、 查看HDFS Web頁面

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

五、 查看YARN Web 頁面

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

三12、測試Job

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

一、 準備mapreduce輸入文件wc.input

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

二、 在HDFS建立輸入目錄input

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

三、 將wc.input上傳到HDFS

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

四、 運行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

五、 查看輸出文件

  1.  
    [hadoop @bigdata-senior01 hadoop-2.5.0]$ bin/hdfs dfs -ls /output
  2.  
    Found 2 items
  3.  
    -rw-r--r-- 3 hadoop supergroup 0 2016-07-14 16:36 /output/_SUCCESS
  4.  
    -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服務器),集羣的各個機器與這個時間服務器進行時間同步。

三十3、配置NTP服務器

咱們選擇第三臺機器(bigdata-senior03.chybinmy.com)爲NTF服務器,其餘機器和這臺機器進行同步。

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

  1.  
    [hadoop @bigdata-senior03 data]$ sudo rpm -qa | grep ntp
  2.  
    ntpdate- 4.2.6p5-1.el6.centos.x86_64
  3.  
    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是用來提供時間同步服務的。

二、 修改配置文件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域名配置

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

是時間服務器的域名,這裏不須要鏈接互聯網,因此將他們註釋掉。

修改

server 127.127.1.0

fudge 127.127.1.0 stratum 10

三、 修改配置文件ntpd

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

添加一行配置:SYNC_CLOCK=yes

enter image description here

四、 啓動ntp服務

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

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

三十4、配置其餘機器的同步

切換到root用戶進行配置經過contab進行定時同步:

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

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

一、 查看目前三臺機器的時間

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

二、 修改bigdata-senior01上的時間

將時間改成一個之前的時間:

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

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

三、 查看是否自動同步時間

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

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

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

三十6、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有選舉制度,角色有:領導者、跟隨者、觀察者,選舉的目的是保證集羣中數據的一致性。

三十7、安裝zookeeper

咱們這裏在BigData0一、BigData0二、BigData03三臺機器上安裝zookeeper集羣。

一、 解壓安裝包

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

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

二、 修改配置

拷貝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集羣中各個機器的信息:

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

server後面的數字範圍是1到255,因此一個zookeeper集羣最多能夠有255個機器。

enter image description here

三、 建立myid文件

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

enter image description here

四、 分發到其餘機器

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

五、 修改其餘機器上的myid文件

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

六、 啓動zookeeper

須要在各個機器上分別啓動zookeeper。

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

enter image description here

三十8、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 部署

三十9、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處於服務狀態。

四10、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發來的文件讀寫操做指令。

四11、搭建HDFS HA 環境

一、 服務器角色規劃

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

二、 建立HDFS HA 版本Hadoop程序目錄

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

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

三、 新解壓Hadoop 2.5.0

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

四、 配置Hadoop JDK路徑

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

五、 配置hdfs-site.xml

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

六、 配置core-site.xml

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

hadoop.tmp.dir設置hadoop臨時目錄地址,默認時,NameNode和DataNode的數據存在這個路徑下。

七、 配置slaves文件

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

八、 分發到其餘節點

分發以前先將share/doc目錄刪除,這個目錄中是幫助文件,而且很大,能夠刪除。

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

九、 啓動HDFS HA集羣

三臺機器分別啓動Journalnode。

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

jps命令查看是否啓動。

十、 啓動Zookeeper

在三臺節點上啓動Zookeeper:

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

十一、 格式化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

十二、 啓動NameNode

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

  1.  
    [hadoop @bigdata-senior01 hadoop-2.5.0]$ sbin/hadoop-daemon.sh start namenode
  2.  
    [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

1三、 配置故障自動轉移

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

關閉NameNode、DataNode、JournalNode、zookeeper

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

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

修改core-site.xml

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

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

  1.  
    [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/
  2.  
    [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/
  3.  
    [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/
  4.  
    [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

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

enter image description here

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

1四、 啓動HDFS、JournalNode、zkfc

啓動NameNode、DataNode、JournalNode、zkfc

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

zkfc只針對NameNode監聽。

四12、測試HDFS HA

一、 測試故障自動轉移和數據是否共享

在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 部署

四十3、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。

四十4、搭建YARN HA環境

一、 服務器角色規劃

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

二、 修改配置文件yarn-site.xml

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

三、 分發到其餘機器

  1.  
    [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/
  2.  
    [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

四、 啓動

在bigdata-senior01上啓動yarn:

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

在bigdata-senior0二、bigdata-senior03上啓動resourcemanager:

  1.  
    [hadoop @bigdata-senior02 hadoop-2.5.0]$ sbin/yarn-daemon.sh start resourcemanager
  2.  
    [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

四十5、測試YARN HA

五、 運行一個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

六、 在job運行過程當中,將Active狀態的resourcemanager進程殺掉。

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

七、 觀察另一個resourcemanager是否能夠自動接替。

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

八、 觀察job是否能夠順利完成。

而mapreduce job 也能順利完成,沒有由於resourcemanager的意外故障而影響運行。

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

第十三步、HDFS Federation 架構部署

四十6、HDFS Federation 的使用緣由

一、 單個NameNode節點的侷限性

命名空間的限制。

NameNode上存儲着整個HDFS上的文件的元數據,NameNode是部署在一臺機器上的,由於單個機器硬件的限制,必然會限制NameNode所能管理的文件個數,制約了數據量的增加。

數據隔離問題。

整個HDFS上的文件都由一個NameNode管理,因此一個程序頗有可能會影響到整個HDFS上的程序,而且權限控制比較複雜。

性能瓶頸。

單個NameNode時HDFS文件系統的吞吐量受限於單個NameNode的吞吐量。由於NameNode是個JVM進程,JVM進程所佔用的內存很大時,性能會降低不少。

二、 HDFS Federation介紹

HDFS Federation是能夠在Hadoop集羣中設置多個NameNode,不一樣於HA中多個NameNode是徹底同樣的,是多個備份,Federation中的多個NameNode是不一樣的,能夠理解爲將一個NameNode切分爲了多個NameNode,每個NameNode只負責管理一部分數據。 
HDFS Federation中的多個NameNode共用DataNode。

四十7、HDFS Federation的架構圖

enter image description here

四十8、HDFS Federation搭建

一、 服務器角色規劃

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

二、 建立HDFS Federation 版本Hadoop程序目錄

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

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

三、 新解壓Hadoop 2.5.0

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

四、 配置Hadoop JDK路徑

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

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

五、 配置hdfs-site.xml

  1.  
    <configuration>
  2.  
    <property>
  3.  
    <!—配置三臺NameNode -->
  4.  
    <name>dfs.nameservices</name>
  5.  
    <value>ns1,ns2,ns3</value>
  6.  
    </property>
  7.  
    <property>
  8.  
    <!—第一臺NameNode的機器名和rpc端口,指定了NameNode和DataNode通信用的端口號 -->
  9.  
    <name>dfs.namenode.rpc-address.ns1</name>
  10.  
    <value>bigdata-senior01.chybinmy.com:8020</value>
  11.  
    </property>
  12.  
    <property>
  13.  
    <!—第一臺NameNode的機器名和rpc端口,備用端口號 -->
  14.  
    <name>dfs.namenode.serviceerpc-address.ns1</name>
  15.  
    <value>bigdata-senior01.chybinmy.com:8022</value>
  16.  
    </property>
  17.  
    <property>
  18.  
    <!—第一臺NameNode的http頁面地址和端口號 -->
  19.  
    <name>dfs.namenode.http-address.ns1</name>
  20.  
    <value>bigdata-senior01.chybinmy.com:50070</value>
  21.  
    </property>
  22.  
    <property>
  23.  
    <!—第一臺NameNode的https頁面地址和端口號 -->
  24.  
    <name>dfs.namenode.https-address.ns1</name>
  25.  
    <value>bigdata-senior01.chybinmy.com:50470</value>
  26.  
    </property>
  27.  
     
  28.  
    <property>
  29.  
    <name>dfs.namenode.rpc-address.ns2</name>
  30.  
    <value>bigdata-senior02.chybinmy.com:8020</value>
  31.  
    </property>
  32.  
    <property>
  33.  
    <name>dfs.namenode.serviceerpc-address.ns2</name>
  34.  
    <value>bigdata-senior02.chybinmy.com:8022</value>
  35.  
    </property>
  36.  
    <property>
  37.  
    <name>dfs.namenode.http-address.ns2</name>
  38.  
    <value>bigdata-senior02.chybinmy.com:50070</value>
  39.  
    </property>
  40.  
    <property>
  41.  
    <name>dfs.namenode.https-address.ns2</name>
  42.  
    <value>bigdata-senior02.chybinmy.com:50470</value>
  43.  
    </property>
  44.  
     
  45.  
     
  46.  
    <property>
  47.  
    <name>dfs.namenode.rpc-address.ns3</name>
  48.  
    <value>bigdata-senior03.chybinmy.com:8020</value>
  49.  
    </property>
  50.  
    <property>
  51.  
    <name>dfs.namenode.serviceerpc-address.ns3</name>
  52.  
    <value>bigdata-senior03.chybinmy.com:8022</value>
  53.  
    </property>
  54.  
    <property>
  55.  
    <name>dfs.namenode.http-address.ns3</name>
  56.  
    <value>bigdata-senior03.chybinmy.com:50070</value>
  57.  
    </property>
  58.  
    <property>
  59.  
    <name>dfs.namenode.https-address.ns3</name>
  60.  
    <value>bigdata-senior03.chybinmy.com:50470</value>
  61.  
    </property>
  62.  
     
  63.  
    </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

六、 配置core-site.xml

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

hadoop.tmp.dir設置hadoop臨時目錄地址,默認時,NameNode和DataNode的數據存在這個路徑下。

七、 配置slaves文件

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

八、 配置yarn-site.xml

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

九、 分發到其餘節點

分發以前先將share/doc目錄刪除,這個目錄中是幫助文件,而且很大,能夠刪除。

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

十、 格式化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

十一、 啓動NameNode

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

  1.  
    [hadoop @bigdata-senior01 hadoop-2.5.0]$ sbin/hadoop-daemon.sh start namenode
  2.  
    [hadoop @bigdata-senior02 hadoop-2.5.0]$ sbin/hadoop-daemon.sh start namenode
  3.  
    [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

十二、 啓動DataNode

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

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

四十9、測試HDFS Federation

一、 修改core-site.xml

在bigdata-senior01機器上,修改core-site.xml文件,指定鏈接的NameNode是第一臺NameNode。

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

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

二、 在bigdate-senior01上傳一個文件到HDFS

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

三、 查看HDFS文件

enter image description here

能夠看到,剛纔的文件只上傳到了bigdate-senior01機器上的NameNode上了,並無上傳到其餘的NameNode上去。

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

後記

這篇文章的操做步驟並非工做中標準的操做流程,若是在成百上千的機器所有這樣安裝會被累死,但願讀者能夠經過文章中一步步地安裝,從而初步瞭解到Hadoop的組成部分,協助過程等,這對於Hadoop的深刻使用有很大的幫助。

相關文章
相關標籤/搜索