【乾貨】Apache Hadoop 2.8 徹底分佈式集羣搭建超詳細過程,實現NameNode HA、ResourceManager HA高可靠性

最近在本身的筆記本電腦上搭建了Apache Hadoop分佈式集羣,採用了最新的穩定版本2.8,並配置了NameNode、ResourceManager的HA高可用,方便平常對Hadoop的研究與測試工做。詳細的搭建過程以下:html

一、安裝docker,建立docker容器,用於搭建hadoop節點java

docker真是個好東西啊,當要在本身的筆記本上搭建分佈式集羣時,因爲CPU、內存、磁盤有限,沒法在VMware上虛擬出太多節點,這時使用docker建立幾個容器,就能輕鬆搭建一個分佈式集羣了。node

(1)先在VMware上安裝centos6.9,做爲宿主機,而後安裝docker,具體過程見我另外一篇博文:Centos6.9安裝dockerlinux

(2)而後再docker hub中拉取centos鏡像,用於建立分佈式集羣的節點,推薦在docker中安裝centos6(docker中的centos7有坑,被坑過,嗚嗚),具體過程見我另外一篇博文:docker中安裝centos6web

(3)centos鏡像準備好後,就開始建立docker容器,用於搭建hadoop的節點docker

# 建立4個節點,用於搭建hadoop
docker run -it --name hadoopcentos1 centos:6 /bin/bash
docker run -it --name hadoopcentos2 centos:6 /bin/bash
docker run -it --name hadoopcentos3 centos:6 /bin/bash
docker run -it --name hadoopcentos4 centos:6 /bin/bash

# 啓動容器
docker start hadoopcentos1
docker start hadoopcentos2
docker start hadoopcentos3
docker start hadoopcentos4

注意:這時要把宿主機的防火牆關掉、selinux設爲不可用shell

# 關掉防火牆
chkconfig iptables off
service iptables stop

# 設置 selinux 爲不可用,在config文件中修改SELINUX配置項
vi /etc/selinux/config

SELINUX=disabled

 

二、規劃hadoop集羣apache

本次共建立了4個hadoop節點,並實現NameNode HA、ResourceManager HA,節點規劃以下bootstrap

hadoop集羣節點規劃centos

Docker 容器 ip地址 主機名 節點進程
hadoopcentos1 172.17.0.1 hd1 NameNode(active)、JournalNode、Zookeeper、ZKFC
hadoopcentos2 172.17.0.2 hd2 NameNode(standby)、JournalNode、Zookeeper、ZKFC、NodeManager、DataNode
hadoopcentos3 172.17.0.3 hd3 ResourceManager(active)、JournalNode、Zookeeper、NodeManager、DataNode
hadoopcentos4 172.17.0.4 hd4 ResourceManager(standby)、NodeManager、DataNode

NameNode HA部署在hd一、hd2,ResourceManager HA部署在hd三、hd4,其它進程見上表

 

三、配置Docker容器基本環境

因爲在Docker中拉取的centos 6鏡像是精簡版本,不少指令沒有,所以,先安裝一些軟件,配置基本環境

進入Docker容器,例如hadoopcentos1

docker exec -it hadoopcentos1 bin/bash

更換yum國內源(每一個節點)

curl http://mirrors.aliyun.com/repo/Centos-6.repo > /etc/yum.repos.d/CentOS-Base-6-aliyun.repo
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
yum clean all
yum makecache

安裝相關的軟件(每一個節點)

yum install -y net-tools which openssh-clients openssh-server iproute.x86_64

編輯sshd_config文件,將其中的UsePAM改爲no

vi /etc/ssh/sshd_config

啓動ssh(每一個節點)

chkconfig sshd on
service sshd start

建立用於安裝apache hadoop的組、帳號

groupadd ahadoop
useradd -m -g ahadoop ahadoop

配置主機名映射表

vi /etc/hosts
172.17.0.1	hd1.hdsite	hd1
172.17.0.2  hd2.hdsite  hd2
172.17.0.3  hd3.hdsite  hd3
172.17.0.4  hd4.hdsite  hd4
172.17.0.1	31d48048cb1e
172.17.0.2	1620d6ed305d
172.17.0.3	ed3702f8924e
172.17.0.4	ee8319514df6

其中,最後4行的隨機字符串,就是docker容器自動生成的主機名了,每生成一個docker容器就會自動生成一個主機名

 

四、安裝 JDK

從oracle的官網上面下載 JDK 1.8 Linux x64

建立java目錄,並解壓安裝(使用root用戶,方便之後別的程序也能夠用)

mkdir /usr/java
cd /usr/java
tar -zxvf jdk-8u131-linux-x64.tar.gz

 

五、下載 apache hadoop

從apache hadoop的官網上面下載最新的穩定版本 apache hadoop 2.8

切換到 ahadoop 用戶,將hadoop 2.8放於 /home/ahadoop 目錄中,並解壓

su ahadoop
cd /home/ahadoop
tar -zxvf hadoop-2.8.0.tar.gz

 

六、配置zookeeper

要實現hadoop namenode HA高可用,且實現故障的自動切換,則要藉助於zookeeper

注意:若是隻是實現namenode HA高可用,是能夠不用zookeeper的,只要配置hadoop的journalnode節點便可實現高可用。而配置zookeeper集羣,主要是爲了監控心跳,實現故障時自動切換,這纔是咱們配置HA高可用的重要目標。

(1)下載zookeeper

到apache zookeeper官方下載最新版本的 zookeeper-3.4.10.tar.gz

(2)配置zookeeper

配置以前,建議閱讀下apache zookeeper官方的配置安裝介紹

zookeeper集羣只能配置奇數個節點,例如三、五、7……,至少要3個及以上,這跟zookeeper的保障機制有關,要確保大多數節點可用,即(n-1)/2,所以節點數必須是奇數

解壓zookeeper(hd1,hd2,hd3)

cd /home/ahadoop
tar -zxvf zookeeper-3.4.10.tar.gz

建立zookeeper數據文件(hd1,hd2,hd3),其中不一樣的節點使用myid進行區分,通常使用一、二、3……

mkdir /home/ahadoop/zookeeper-data
echo '1' > /home/ahadoop/zookeeper-data/myid
echo '2' > /home/ahadoop/zookeeper-data/myid
echo '3' > /home/ahadoop/zookeeper-data/myid

配置zoo.cfg配置文件

vi /home/ahadoop/zookeeper-3.4.10/conf/zoo.cfg
dataDir=/home/ahadoop/zookeeper-data	# 修改zookeeper數據目錄
clientPort=2181				# 默認端口
server.1=hd1:2888:3888
server.2=hd2:2888:3888
server.3=hd3:2888:3888

其中 server.一、server.二、server.3 裏面的 server.x 最後的序號則是不一樣節點的myid文件裏面的id

到此,zookeeper已經配置完畢,使用 zkServer.sh start 命令在每一個節點啓動zookeeper(hd1,hd2,hd3)

使用 zkServer.sh status 便可查看節點的狀態,最後的Mode表示該節點在集羣中的角色,一個zookeeper集羣只有一個leader,其它都是follower

[ahadoop@31d48048cb1e ~]$ zkServer.sh start &
[1] 6855
[ahadoop@31d48048cb1e ~]$ ZooKeeper JMX enabled by default
Using config: /home/ahadoop/zookeeper-3.4.10/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

[1]+  Done                    zkServer.sh start
[ahadoop@1620d6ed305d ~]$
[ahadoop@1620d6ed305d ~]$
[ahadoop@1620d6ed305d ~]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/ahadoop/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: leader

 

七、配置hadoop的配置文件

配置hadoop集羣前,建議先閱讀下apache hadoop官網的集羣配置說明,雖然是英文文檔,可是簡單易懂,有助於進一步瞭解hadoop集羣知識,官方的配置介紹以下(p.s. 參照官網裏面的配置說明進行配置,發現有小部分錯誤,直到實際配置時才發現,下面會介紹):

apache hadoop 單節點配置官方介紹

apache hadoop 集羣配置官方介紹

apache hadoop namenode HA(基於QJM)配置官方介紹

apache hadoop resourcemanager HA 配置官方介紹

(1)建立相應的文件夾(每一個節點)

mkdir /home/ahadoop/hadoop-data
mkdir /home/ahadoop/hadoop-data/name
mkdir /home/ahadoop/hadoop-data/data
mkdir /home/ahadoop/hadoop-data/checkpoint
mkdir /home/ahadoop/hadoop-data/tmp
mkdir /home/ahadoop/hadoop-data/log
mkdir /home/ahadoop/hadoop-data/journalnode

主文件夾爲hadoop-data,其中:

name:存放namenode的數據

data:存放datanode的數據

checkpoint:存在namenode的checkpoint數據

tmp:臨時文件

log:存放日誌

journalnode:存在jounalnode的數據

(2)配置core-site.xml配置文件

官方提供了默認的 core-default.xml 配置文件可供參考,但內容不少,咱們可根據須要進行配置

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://hdcluster</value>
  </property>
  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/home/ahadoop/hadoop-data/journalnode</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/home/ahadoop/hadoop-data/tmp</value>
  </property>
  <property>
    <name>fs.trash.interval</name>
    <value>1440</value>
  </property>
  <property>
    <name>io.file.buffer.size</name>
    <value>65536</value>
  </property>
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>hd1:2181,hd2:2181,hd3:2181</value>
  </property>
</configuration>

其中,

fs.defaultFS:表示集羣namenode的地址,對於namenode HA來講,須要取一個cluster id來做區分,以便於區分跟hadoop聯邦的其它namenode,這裏取hdcluster做爲該集羣的ID

dfs.journalnode.edits.dir、hadoop.tmp.dir:表示journalnode的數據文件路徑、臨時文件路徑

fs.trash.interval:表示回收站的保留時間(分鐘),也即hdfs的文件刪除後,在回收站裏面保留的時長

io.file.buffer.size:表示讀取文件的字節數(byte)

ha.zookeeper.quorum:表示zookeeper集羣的主機與端口

(3)配置hdfs-site.xml配置文件

官方提供了默認的 hdfs-default.xml 配置文件 可供參考,根據須要進行配置以下

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>3</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/home/ahadoop/hadoop-data/name</value>
  </property>
  <property>
    <name>dfs.blocksize</name>
    <value>67108864</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/home/ahadoop/hadoop-data/data</value>
  </property>
  <property>
    <name>dfs.namenode.checkpoint.dir</name>
    <value>/home/ahadoop/hadoop-data/checkpoint</value>
  </property>
  <property>
    <name>dfs.namenode.handler.count</name>
    <value>10</value>
  </property>
  <property>
    <name>dfs.datanode.handler.count</name>
    <value>10</value>
  </property>
  <property>
    <name>dfs.nameservices</name>
    <value>hdcluster</value>
  </property>
  <property>
    <name>dfs.ha.namenodes.hdcluster</name>
    <value>nn1,nn2</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.hdcluster.nn1</name>
    <value>hd1:9000</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.hdcluster.nn2</name>
    <value>hd2:9000</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.hdcluster.nn1</name>
    <value>hd1:50070</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.hdcluster.nn2</name>
    <value>hd2:50070</value>
  </property>
  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://hd1:8485;hd2:8485;hd3:8485/hdcluster</value>
  </property>
  <property>
    <name>dfs.client.failover.proxy.provider.hdcluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>
  <property>
    <name>dfs.ha.automatic-failover.enabled.hdcluster</name>
    <value>true</value>
  </property>
  <property>
    <name>dfs.ha.fencing.methods</name>
    <value>shell(/bin/true)</value>
  </property>
</configuration>

其中:

dfs.replication:表示hdfs的數據塊備份數量,默認是3

dfs.namenode.name.dir,dfs.datanode.data.dir,dfs.namenode.checkpoint.dir:表示namenode、datanode、checkpoint的數據路徑

dfs.blocksize:表示數據塊的大小,默認爲64M,可根據須要改成128M,甚至256M

dfs.namenode.handler.count、dfs.datanode.handler.count:表示在namenode、datanode的進程數

dfs.nameservices:表示集羣namenode的ID,這裏命名爲hdcluster,注意要跟 core-size.xml 裏面的配置項 fs.defaultFS 中的集羣ID一致

dfs.ha.namenodes.hdcluster:表示namenode的id,這裏有兩個namenode節點,所以使用nn1,nn2命名

dfs.namenode.rpc-address.hdcluster.nn1,dfs.namenode.rpc-address.hdcluster.nn2:表示nn一、nn2的遠程調用主機和端口

dfs.namenode.http-address.hdcluster.nn1,dfs.namenode.http-address.hdcluster.nn2:表示 nn一、nn2的所在節點http服務和端口

dfs.namenode.shared.edits.dir:表示namenode共享的元數據路徑,在配置HA時,使用journalnode來保存元數據,維持namenode元數據的一致性

dfs.client.failover.proxy.provider.hdcluster:表示HDFS客戶端鏈接到Active NameNode的一個java類(默認)

dfs.ha.automatic-failover.enabled.hdcluster:表示當namenode ha的active namenode出現故障時,是否自動切換(固然要設置爲true了,^^)

dfs.ha.fencing.methods:表示故障時自動切換使用的方法

【敲黑板,注意了同窗們,如下是重點】官方給的例子配置值是sshfence,但經試驗,使用這種方式根本就不會自動切換,而是namenode active故障時,namenode standby仍舊是standby,只有咱們登錄到namenode active故障節點,再將故障的namenode從新恢復啓動後,原先的namenode standby纔會自動切換爲namenode active,(心中忽然萬馬奔騰啊……),這根本不是咱們配置高可用的目的啊

經研究,fencing的方法目前有兩種:sshfence和shell。其中:

  • sshfence方法:是指經過ssh登錄到active namenode節點殺掉namenode進程,因此還須要設置ssh無密碼登錄,還要保證有殺掉namenode進程的權限
  • shell方法:是指運行一個shell腳本/命令來防止兩個namenode同時處於active,腳本須要本身寫。但其實QJM模式自己就有fencing功能,能保證只有一個namenode能往journalnode上寫edits文件,因此是不須要設置fencing的方法就能實現的。可是,在發生failover的時候,原來的active namenode可能還在接受客戶端的讀請求,這樣客戶端極可能讀到一些過期的數據(由於新的active namenode的數據已經實時更新了)。所以,仍是建議設置fencing方法。若是確實不想設置fencing方法,能夠設置一個能返回成功(沒有fencing做用)的方法,如「shell(/bin/true)」。這個純粹爲了fencing方法可以成功返回,並不須要真的有fencing做用。這樣能夠提升系統的可用性,即便在fencing機制失敗的時候還能保持系統的可用性。

(4)配置mapred-site.xml

官方提供了默認的 mapred-default.xml 配置文件 可供參考,咱們的配置以下

<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>

該配置表示使用yarn框架

(5)配置yarn-site.xml

官方提供了默認的 yarn-default.xml 配置文件 可供參考,再結合 ResourceManager HA 的官方介紹,配置以下

<configuration>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
  </property>
  <property>
    <name>yarn.resourcemanager.cluster-id</name>
    <value>hdcluster</value>
  </property>
  <property>
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm1,rm2</value>
  </property>
  <property>
    <name>yarn.resourcemanager.hostname.rm1</name>
    <value>hd3</value>
  </property>
  <property>
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>hd4</value>
  </property>
  <property>
    <name>yarn.resourcemanager.webapp.address.rm1</name>
    <value>hd3:8088</value>
  </property>
  <property>
    <name>yarn.resourcemanager.webapp.address.rm2</name>
    <value>hd4:8088</value>
  </property>
  <property>
    <name>yarn.resourcemanager.zk-address</name>
    <value>hd1:2181,hd2:2181,hd3:2181</value>
  </property>
</configuration>

其中,

yarn.nodemanager.aux-services:NodeManager上運行的附屬服務,需配置成mapreduce_shuffle,纔可運行MapReduce程序,不然會報錯

yarn.resourcemanager.ha.enabled:表示啓動resourcemanager HA高可用

yarn.resourcemanager.cluster-id:表示resourcemanager的集羣ID,不要與別的集羣混淆便可,這裏命名爲hdcluster

yarn.resourcemanager.ha.rm-ids:表示resourcemanager的節點id,這裏有兩個節點,使用rm1,rm2做爲ID

yarn.resourcemanager.hostname.rm1,yarn.resourcemanager.hostname.rm2:表示rm1,rm2的主機,這裏取hd三、hd4

yarn.resourcemanager.webapp.address.rm1,yarn.resourcemanager.webapp.address.rm2:表示rm1,rm2的網頁訪問地址和端口,也即經過該地址和端口可訪問做業狀況

yarn.resourcemanager.zk-address:表示使用zookeeper來協助管理resourcemanager主備的zookeeper集羣主機與端口

(6)配置slave節點主機

配置hadoop分佈式集羣的slaves節點主機列表,也即datanode運行的節點,這裏取hd二、hd三、hd4

vi /home/ahadoop/hadoop-2.8.0/etc/hadoop/slaves

# 配置slave主機
hd2
hd3
hd4

(7)配置log4j日誌 log4j.properties

根據須要修改log4j的日誌保存路徑,以及日誌輸出的粒度

vi /home/ahadoop/hadoop-2.8.0/etc/hadoop/log4j.properties

# 修改日誌的路徑
hadoop.log.dir=/home/ahadoop/hadoop-data/log

(8)配置bash的環境變量

編輯.bash_profile文件,配置環境變量,方便平常執行命令

vi /home/ahadoop/.bash_profile

# 在 .bash_profile 末尾增長如下配置
export JAVA_HOME=/usr/java/jdk1.8.0_131
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

export HADOOP_HOME=/home/ahadoop/hadoop-2.8.0
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

export ZOOKEEPER_HOME=/home/ahadoop/zookeeper-3.4.10
export PATH=$PATH:$ZOOKEEPER_HOME/bin

配置後,使用source命令使其生效

source /home/ahadoop/.bash_profile

 

八、格式hadoop namenode,並啓動hadoop分佈式集羣

經過以上的配置文件,已完成了hadoop集羣的配置。在首次運行hadoop集羣時,須先進行namenode的格式化,而後再啓動整個集羣。

注意:只有第一次運行,才須要格式化namenode哦,之後就不用了,不然一格式化將會清空整個集羣的元數據和數據塊

hadoop的sbin目錄裏面提供了便捷的啓動腳本

  • 最簡單的有start-all.sh、stop-all.sh腳本,可直接啓動/終止整個hadoop集羣,使用這兩個命令,必須實現集羣節點ssh免密碼登陸,如在hd1主機執行這些命令,則須實現hd1免密碼登陸到hd二、hd三、hd4。在生產環境中,不推薦使用start-all.sh、stop-all.sh來維護整個集羣,可能啓動/終止過程會出現什麼問題,影響到整個集羣。在我的測試環節,則請便,怎麼六、怎麼來。
  • 另外,還提供了start-dfs.sh、stop-dfs.sh來啓動/終止hdfs,start-yarn.sh、stop-yarn.sh來啓動/終止yarn,一樣須要實現集羣節點的ssh免密碼登陸,在生產環境,也不推薦使用這種方式。在我的測試環節,則請便,怎麼六、怎麼來。
  • 第三,還提供了hadoop-daemon.sh,yarn-daemon.sh來啓動/終止hdfs、yarn,使用方法以下,當執行hadoop-daemon.sh start namenode,則是啓動namenode(secondaryname、datanode、journalnode等相似),使用stop則是終止;當執行yarn-daemon.sh start resourcemanager,則是啓動resourcemanager(nodemanager相似),使用stop則是終止。使用這種啓動方式,須要各個節點,逐一啓動相應的進程,無須實現ssh免密碼登陸。這種方式的好處在於,某個節點的進程啓動/終止,若是有問題,不會影響到整個集羣,但管理員必須對整個集羣的節點功能分佈很是清楚。
  • 第四,hadoop新版本還提供了hdfs、yarn的進程啓動/終止方式(位於hadoop的bin目錄),使用方法以下,hdfs namenode,則是啓動namenode(secondaryname、datanode、journalnode等相似),那若是要終止呢???kill吧,kill 相應的進程會自動調用終止程序;yarn resourcemanager,則是啓動resourcemanager(nodemanager相似),若是要終止,一樣kill就好。使用這種方式,對於初學者來講,能夠更好的搞清楚整個集羣節點的啓動順序。

在本測試中,即是使用hdfs、yarn來啓動節點

首次使用hadoop分佈式集羣時,須要格式化namenode,並同步ha狀態到zookeeper,啓動的順序以下:

# 首次格式化啓動順序

# 啓動 zookeeper(hd1,hd2,hd3)
zkServer.sh start &

# 啓動 journalnode(hd1,hd2,hd3)
hdfs journalnode &

# 格式化 namenode(hd1)
hdfs namenode -format

# 初始化 HA 狀態到 zk(hd1)
hdfs zkfc -formatZK &

# 啓動 namenode active(hd1)
hdfs namenode &

# 同步 namenode(hd2)
hdfs namenode -bootstrapStandby

# 啓動 namenode standby(hd2)
hdfs namenode &

# 啓動ZookeeperFailoverController(hd1,hd2)
hdfs zkfc &

# 啓動 datanode(hd2,hd3,hd4)
hdfs datanode &

# 啓動 resourcemanager(hd3,hd4)
yarn resourcemanager &

# 啓動 nodemanager(hd2,hd3,hd4)
yarn nodemanager &

啓動後,使用jps在各個節點,查看進程的啓動狀況

# hd1
[ahadoop@31d48048cb1e ~]$ jps
8976 NameNode
8803 JournalNode
9172 Jps
9092 DFSZKFailoverController
8750 QuorumPeerMain

# hd2
[ahadoop@1620d6ed305d ~]$ jps
7428 QuorumPeerMain
7636 NameNode
8021 Jps
7719 DFSZKFailoverController
7784 DataNode
7884 NodeManager
7487 JournalNode

# hd3
[ahadoop@ed3702f8924e ~]$ jps
4320 QuorumPeerMain
4451 DataNode
4900 Jps
4772 NodeManager
4373 JournalNode
4540 ResourceManager

# hd4
[ahadoop@ee8319514df6 ~]$ jps
4578 NodeManager
4707 Jps
4489 DataNode
4508 ResourceManager

至今,整個集羣就成功啓動了

若是之後使用時,就不用再格式化namenode了(不然數據會完蛋),那麼正常狀況下,集羣啓動的順序爲

# 平常使用的啓動順序

# 啓動 zookeeper(hd1,hd2,hd3)
zkServer.sh start &

# 啓動 journalnode(hd1,hd2,hd3)
hdfs journalnode &

# 啓動 namenode active(hd1)
hdfs namenode &

# 啓動 namenode standby(hd2)
hdfs namenode &

# 啓動ZookeeperFailoverController(hd1,hd2)
hdfs zkfc &

# 啓動 datanode(hd2,hd3,hd4)
hdfs datanode &

# 啓動 resourcemanager(hd3,hd4)
yarn resourcemanager &

# 啓動 nodemanager(hd2,hd3,hd4)
yarn nodemanager &

 

九、hadoop集羣測試

集羣啓動後,在瀏覽器輸入如下網址查看namenode、resourcemanager的狀態

輸入網址 http://172.17.0.1:50070 查看 namenode(active)節點信息

輸入網址 http://172.17.0.2:50070 查看 namenode(standby)節點信息

輸入網址 http://172.17.0.3:8088 查看 resourcemanager 節點信息

使用官網的例子,測試集羣的map-reduce

這個例子是使用了hadoop自帶的map-reduce jar包,對etc/hadoop的xml配置文件裏面的配置項進行數量統計(相似於經典的wordcount測試)

具體步驟以下:

# 建立 hdfs 目錄
hdfs dfs -mkdir /user
hdfs dfs -mkdir /user/ahadoop
hdfs dfs -mkdir input

# 上傳 etc/hadoop 的 xml 配置文件
hdfs dfs -put /home/ahadoop/hadoop-2.8.0/etc/hadoop/*.xml input

# 執行自帶的 map reduce jar程序
hadoop jar /home/ahadoop/hadoop-2.8.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.0.jar grep input output 'dfs[a-z.]+'

# 獲取執行結果
hdfs dfs -get output output

# 查看執行結果
cat output/*

執行後,結果以下

從上圖可看出,使用map reduce統計了配置項的數量結果

 

十、hadoop 集羣的 HA 測試

hadoop 集羣的 HA 高可用性是本次搭建集羣的重要目標,下面將對 hadoop 集羣的 namenode ha、resourcemanager ha 進行測試

(1)namenode ha 測試

目前 hd1 的 namenode 是 active 狀態,hd2 的 namenode 是 standby 狀態,簡單粗暴地對 hd1 的 namenode 進行 kill 掉,也就是使 hd1 的 namenode 發生故障,這時再看 hd2 的 namenode ,會發現已自動切換爲 active 狀態

說明 namenode ha 故障自動切換成功

(2)resourcemanager ha 測試

hd三、hd4的resourcemanager ha,打開網頁後並無看到 active、standby 狀態,這時若是 hd3 是 active狀態,輸入 http://172.17.0.3:8088 可看到resourcemanger頁面。而輸入 http://172.17.0.4:8088 時,則會自動切換回 htttp://172.17.0.3:8088 頁面。

這裏經過後臺可查看兩個resourcemanager的狀態,命令以下

# 查看 resourcemanager 狀態

[ahadoop@ed3702f8924e ~]$ yarn rmadmin -getServiceState rm1
 active

[ahadoop@ed3702f8924e ~]$ yarn rmadmin -getServiceState rm2
 standby

在測試resourcemanager ha時,將active節點的resourcemanager進行kill掉,這時再查看rm2狀態,會發現已經變量 active 狀態

[ahadoop@ed3702f8924e ~]$ yarn rmadmin -getServiceState rm2
 active

可經過如下指令進行 active、standby 狀態切換(--forcemanual 表示強制)

# 切換 resourcemanager 主備

# 切換爲 standby 狀態
yarn rmadmin -transitionToStandby --forcemanual rm2

# 切換爲 active 狀態
yarn rmadmin -transitionToActive --forcemanual rm1

注意,這裏若是是active狀態的強制切換爲standby,是能夠成功切換,也就是說兩個節點都是standby狀態。但若是已經有一個active狀態的,這時再將另外一個standby狀態切換爲active狀態,則沒法進行切換,系統提示已經有一個active狀態的節點了。

[ahadoop@ee8319514df6 ~]$ yarn rmadmin -transitionToActive --forcemanual rm2
You have specified the --forcemanual flag. This flag is dangerous, as it can induce a split-brain scenario that WILL CORRUPT your HDFS namespace, possibly irrecoverably.

It is recommended not to use this flag, but instead to shut down the cluster and disable automatic failover if you prefer to manually manage your HA state.

You may abort safely by answering 'n' or hitting ^C now.

Are you sure you want to continue? (Y or N) Y
17/06/18 16:53:01 WARN ha.HAAdmin: Proceeding with manual HA state management even though
automatic failover is enabled for org.apache.hadoop.yarn.client.RMHAServiceTarget@3444d69d
17/06/18 16:53:02 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
transitionToActive: Node rm1 is already active
Usage: rmadmin [-transitionToActive [--forceactive] <serviceId>]

 

十一、hadoop分佈式集羣簡單搭建

上面的配置是針對namenode ha、resourcemanager ha進行配置,會比較複雜,若是隻是要簡單地搭建一個hadoop分佈式集羣,暫時不用配置namenode ha、resourcemanager ha的,則配置會簡單不少,如下給出hadoop分佈式集羣簡單搭建的相關配置,以下

(1)core-site.xml

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://hd1:9000</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/home/ahadoop/hadoop-data/tmp</value>
  </property>
  <property>
    <name>fs.trash.interval</name>
    <value>1440</value>
  </property>
  <property>
    <name>io.file.buffer.size</name>
    <value>65536</value>
  </property>
</configuration>

(2)hdfs-site.xml

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>3</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/home/ahadoop/hadoop-data/name</value>
  </property>
  <property>
    <name>dfs.blocksize</name>
    <value>67108864</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/home/ahadoop/hadoop-data/data</value>
  </property>
  <property>
    <name>dfs.namenode.checkpoint.dir</name>
    <value>/home/ahadoop/hadoop-data/checkpoint</value>
  </property>
  <property>
    <name>dfs.namenode.handler.count</name>
    <value>10</value>
  </property>
  <property>
    <name>dfs.datanode.handler.count</name>
    <value>10</value>
  </property>
</configuration>

(3)mapred-site.xml

<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>

(4)yarn-site.xml

<configuration>
  <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>hd3</value>
  </property>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
</configuration>

(5)slaves

hd2
hd3
hd4

(6).bash_profile

# 設置環境變量
vi /home/ahadoop/.bash_profile
export JAVA_HOME=/usr/java/jdk1.8.0_131
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

export HADOOP_HOME=/home/ahadoop/hadoop-2.8.0
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

(7)格式化namenode,啓動hadoop集羣

# 格式化 namenode(hd1)
hdfs namenode -format

# 啓動 namenode(hd1)
hdfs namenode &

# 啓動 secondarynamenode(hd2)
hdfs secondarynamenode &

# 啓動 datanode(hd二、hd三、hd4)
hdfs datanode &

# 啓動 resourcemanager(hd2)
yarn resoucemanager &

# 啓動 nodemanager(hd二、hd三、hd4)
hdfs nodemanager &

(8)訪問namenode、resourcemanager頁面

訪問 namenode 頁面
http://172.17.0.1:50070


訪問 resourcemanager 頁面
http://172.17.0.2:8088

 

十二、apache hadoop官方配置文檔的一些問題

(1)官網給的namenode ha配置說明文檔,裏面關於自動切換故障的配置,官網給的配置是(hdfs-site.xml)

<property>
   <name>dfs.ha.automatic-failover.enabled</name>
   <value>true</value>
 </property>

而實際在配置時,後面還要加上集羣ID,本測試的集羣ID是hdcluster,所以正常的配置是

<property>
   <name>dfs.ha.automatic-failover.enabled.hdcluster</name>
   <value>true</value>
 </property>

(2)關於啓動命令的問題

官網給的hadoop集羣配置的說明文檔,裏面關於節點進程的啓動命令爲:

[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode

[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start datanode

[yarn]$ $HADOOP_HOME/bin/yarn --daemon start resourcemanager

[yarn]$ $HADOOP_HOME/bin/yarn --daemon start nodemanager

但實際沒法執行(也有多是3.0 beta版的指令,沒試過),執行會提示

[ahadoop@31d48048cb1e ~]$ hdfs --daemon start namenode
Unrecognized option: --daemon
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

不支持 --daemon 這個參數,所以,實際在啓動這些節點進程時,啓動命令爲

[hdfs]$ $HADOOP_HOME/bin/hdfs namenode

[hdfs]$ $HADOOP_HOME/bin/hdfs datanode

[yarn]$ $HADOOP_HOME/bin/yarn resourcemanager

[yarn]$ $HADOOP_HOME/bin/yarn nodemanager

 

歡迎關注本人的微信公衆號「大數據與人工智能Lab」(BigdataAILab),獲取更多資訊

相關文章
相關標籤/搜索