本節內容:
- 環境規划
- 配置集群各節點hosts文件
- 安裝JDK1.7
- 安裝依賴包ssh和rsync
- 各節點時間同步
- 安裝Zookeeper集群
- 添加Hadoop運行用戶
- 配置主節點登錄自己和其他節點不需要輸入密碼
- 安裝hadoop
- 啟動hadoop
- 停止hadoop
一、環境規划
主機名 | IP地址 | 操作系統版本 | 安裝軟件 |
hadoop16 | 172.16.206.16 | CentOS 7.2 | JDK1.7、hadoop-2.7.2 |
hadoop26 | 172.16.206.26 | CentOS 7.2 | JDK1.7、hadoop-2.7.2 |
hadoop27 | 172.16.206.27 | CentOS 7.2 | JDK1.7、hadoop-2.7.2、Zookeeper |
hadoop28 | 172.16.206.28 | CentOS 7.2 | JDK1.7、hadoop-2.7.2、Zookeeper |
hadoop29 | 172.16.206.29 | CentOS 7.2 | JDK1.7、hadoop-2.7.2、Zookeeper |
由於機器資源緊張,將NameNode和ResourceManager安裝在一台機器上。在hadoop16主機上安裝NameNode和ResourceManager使其處於active狀態,在hadoop26上安裝NameNode和ResourceManager使其處於standby狀態。
環境拓撲:
由於是實驗環境,所以將NameNode和ResourceManager放在了一起,生產環境下應該將NameNode和ResourceManager放在單獨的機器上。
Hadoop2.0官方提供了兩種HDFS HA的解決方案,一種是NFS,另一種是QJM。這兩種共享數據的方案,NFS是操作系統層面的,JournalNode是hadoop層面的,這里我們使用簡單的QJM集群進行數據共享。在該方案中,主備NameNode之間通過一組JournalNode同步元數據信息,一條數據只要成功寫入多數JournalNode即認為寫入成功。通常配置奇數個JournalNode。
另外還配置了一個zookeeper集群(27,28,29主機),用於ZKFC(DFSZKFailoverController)故障轉移,當Active NameNode掛掉了,會自動切換Standby NameNode和ResourceManager為standby狀態。同時27,28,29主機作為DataNode節點。
二、配置集群各節點hosts文件
在集群各節點,編輯hosts文件,配置好各節點主機名和ip地址的對應關系:
# vim /etc/hosts 172.16.206.16 hadoop16 172.16.206.26 hadoop26 172.16.206.27 hadoop27 172.16.206.28 hadoop28 172.16.206.29 hadoop29
三、安裝JDK1.7
Hadoop Java Versions
Version 2.7 and later of Apache Hadoop requires Java 7. It is built and tested on both OpenJDK and Oracle (HotSpot)'s JDK/JRE. <br />
Earlier versions (2.6 and earlier) support Java 6.

# mkdir /usr/java # tar zxf /usr/local/jdk-7u80-linux-x64.gz -C /usr/java/ # vim /etc/profile export JAVA_HOME=/usr/java/jdk1.7.0_80 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar # source /etc/profile
四、安裝依賴包ssh和rsync
對於Redhat/CentOS系列的,安裝系統時一般都會默認安裝openssh軟件,里面包含了ssh客戶端和ssh服務端,所以先檢查下這個軟件包是否安裝了:
# yum list all openssh
如果沒有安裝,安裝:
# yum install -y openssh
在檢查rsync軟件包是否安裝:
# yum list all rsync
五、各節點時間同步
采用NTP(Network Time Protocol)方式來實現, 選擇一台機器, 作為集群的時間同步服務器, 然后分別配置服務端和集群其他機器。我這里以hadoop16機器時間為准,其他機器同這台機器時間做同步。
1. NTP服務端
(1)安裝ntp服務
# yum install ntp -y
(2)配置/etc/ntp.conf,這邊采用本地機器作為時間的原點
注釋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
添加如下內容:
server 127.127.1.0 prefer fudge 127.127.1.0 stratum 8 logfile /var/log/ntp.log
(3)啟動ntpd服務
# systemctl start ntpd
(4)查看ntp服務狀態
# systemctl status ntpd
(5)加入開機啟動
# systemctl enable ntpd
2. NTP客戶端
(1)安裝ntp
# yum install ntpdate
(2)配置crontab任務主動同步
# crontab -e */10 * * * * /usr/sbin/ntpdate 172.16.206.16;hwclock -w
六、安裝Zookeeper集群
對於Zookeeper集群的話,官方推薦的最小節點數為3個。
1. 安裝配置zk
(1)配置zk節點的hosts文件
配置zk節點的hosts文件:配置3台機器的ip地址和主機名的對應關系。上面已經做過了。這里選擇3台安裝zk:hadoop27,hadoop28,hadoop29。
(2)解壓安裝配置第一台zk
# cd /usr/local/ # tar zxf zookeeper-3.4.6.tar.gz # cd zookeeper-3.4.6 創建快照日志存放目錄: # mkdir dataDir 創建事務日志存放目錄: # mkdir dataLogDir
注意:如果不配置dataLogDir,那么事務日志也會寫在dataDir目錄中。這樣會嚴重影響zk的性能。因為在zk吞吐量很高的時候,產生的事務日志和快照日志太多。
# cd conf # mv zoo_sample.cfg zoo.cfg # vim zoo.cfg # 存放數據文件 dataDir=/usr/local/zookeeper-3.4.6/dataDir # 存放日志文件 dataLogDir=/usr/local/zookeeper-3.4.6/dataLogDir # zookeeper cluster,2888為選舉端口,3888為心跳端口 server.1=hadoop27:2888:3888 server.2=hadoop28:2888:3888 server.3=hadoop29:2888:3888
在我們配置的dataDir指定的目錄下面,創建一個myid文件,里面內容為一個數字,用來標識當前主機,conf/zoo.cfg文件中配置的server.X中X為什么數字,則myid文件中就輸入這個數字:
hadoop27主機:
# echo "1" > /usr/local/zookeeper-3.4.6/dataDir/myid
(3)遠程復制第一台的zk到另外兩台上,並修改myid文件為2和3
# cd /usr/local/ # scp -rp zookeeper-3.4.6 root@172.16.206.28:/usr/local/ # echo "2" > /usr/local/zookeeper-3.4.6/dataDir/myid # scp -rp zookeeper-3.4.6 root@172.16.206.29:/usr/local/ # echo "3" > /usr/local/zookeeper-3.4.6/dataDir/myid
2. 啟動和關閉Zookeeper
在ZooKeeper集群的每個結點上,執行啟動ZooKeeper服務的腳本,如下所示:
[root@hadoop27 ~]# /usr/local/zookeeper-3.4.6/bin/zkServer.sh start [root@hadoop28 ~]# /usr/local/zookeeper-3.4.6/bin/zkServer.sh start [root@hadoop29 ~]# /usr/local/zookeeper-3.4.6/bin/zkServer.sh start
停止zk的命令:
# /usr/local/zookeeper-3.4.6/bin/zkServer.sh stop
3. 測試zk集群
可以通過ZooKeeper的腳本來查看啟動狀態,包括集群中各個結點的角色(或是Leader,或是Follower):
[root@hadoop27 ~]# /usr/local/zookeeper-3.4.6/bin/zkServer.sh status JMX enabled by default Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg Mode: follower [root@hadoop28 ~]# /usr/local/zookeeper-3.4.6/bin/zkServer.sh status JMX enabled by default Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg Mode: leader [root@hadoop29 ~]# /usr/local/zookeeper-3.4.6/bin/zkServer.sh status JMX enabled by default Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg Mode: follower
通過上面狀態查詢結果可見,hadoop28是集群的Leader,其余的兩個結點是Follower。
另外,可以通過客戶端腳本,連接到ZooKeeper集群上。對於客戶端來說,ZooKeeper是一個整體,連接到ZooKeeper集群實際上感覺在獨享整個集群的服務,所以,你可以在任何一個結點上建立到服務集群的連接。

[root@hadoop29 ~]# /usr/local/zookeeper-3.4.6/bin/zkCli.sh -server hadoop27:2181 Connecting to localhost:2181 2016-07-18 21:26:57,647 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT 2016-07-18 21:26:57,650 [myid:] - INFO [main:Environment@100] - Client environment:host.name=hadoop29 2016-07-18 21:26:57,650 [myid:] - INFO [main:Environment@100] - Client environment:java.version=1.7.0_80 2016-07-18 21:26:57,652 [myid:] - INFO [main:Environment@100] - Client environment:java.vendor=Oracle Corporation 2016-07-18 21:26:57,652 [myid:] - INFO [main:Environment@100] - Client environment:java.home=/usr/java/jdk1.7.0_80/jre 2016-07-18 21:26:57,652 [myid:] - INFO [main:Environment@100] - Client environment:java.class.path=/usr/local/zookeeper-3.4.6/bin/../build/classes:/usr/local/zookeeper-3.4.6/bin/../build/lib/*.jar:/usr/local/zookeeper-3.4.6/bin/../lib/slf4j-log4j12-1.6.1.jar:/usr/local/zookeeper-3.4.6/bin/../lib/slf4j-api-1.6.1.jar:/usr/local/zookeeper-3.4.6/bin/../lib/netty-3.7.0.Final.jar:/usr/local/zookeeper-3.4.6/bin/../lib/log4j-1.2.16.jar:/usr/local/zookeeper-3.4.6/bin/../lib/jline-0.9.94.jar:/usr/local/zookeeper-3.4.6/bin/../zookeeper-3.4.6.jar:/usr/local/zookeeper-3.4.6/bin/../src/java/lib/*.jar:/usr/local/zookeeper-3.4.6/bin/../conf:.:/usr/java/jdk1.7.0_80/lib/dt.jar:/usr/java/jdk1.7.0_80/lib/tools.jar 2016-07-18 21:26:57,652 [myid:] - INFO [main:Environment@100] - Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib 2016-07-18 21:26:57,653 [myid:] - INFO [main:Environment@100] - Client environment:java.io.tmpdir=/tmp 2016-07-18 21:26:57,653 [myid:] - INFO [main:Environment@100] - Client environment:java.compiler=<NA> 2016-07-18 21:26:57,653 [myid:] - INFO [main:Environment@100] - Client environment:os.name=Linux 2016-07-18 21:26:57,653 [myid:] - INFO [main:Environment@100] - Client environment:os.arch=amd64 2016-07-18 21:26:57,653 [myid:] - INFO [main:Environment@100] - Client environment:os.version=2.6.32-431.el6.x86_64 2016-07-18 21:26:57,653 [myid:] - INFO [main:Environment@100] - Client environment:user.name=root 2016-07-18 21:26:57,653 [myid:] - INFO [main:Environment@100] - Client environment:user.home=/root 2016-07-18 21:26:57,653 [myid:] - INFO [main:Environment@100] - Client environment:user.dir=/root 2016-07-18 21:26:57,654 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=localhost:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@279ac931 [root@hadoop29 ~]# /usr/local/zookeeper-3.4.6/bin/zkCli.sh -server hadoop27:2181 Connecting to hadoop27:2181 2016-07-18 21:29:48,216 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT 2016-07-18 21:29:48,219 [myid:] - INFO [main:Environment@100] - Client environment:host.name=hadoop29 2016-07-18 21:29:48,219 [myid:] - INFO [main:Environment@100] - Client environment:java.version=1.7.0_80 2016-07-18 21:29:48,221 [myid:] - INFO [main:Environment@100] - Client environment:java.vendor=Oracle Corporation 2016-07-18 21:29:48,221 [myid:] - INFO [main:Environment@100] - Client environment:java.home=/usr/java/jdk1.7.0_80/jre 2016-07-18 21:29:48,221 [myid:] - INFO [main:Environment@100] - Client environment:java.class.path=/usr/local/zookeeper-3.4.6/bin/../build/classes:/usr/local/zookeeper-3.4.6/bin/../build/lib/*.jar:/usr/local/zookeeper-3.4.6/bin/../lib/slf4j-log4j12-1.6.1.jar:/usr/local/zookeeper-3.4.6/bin/../lib/slf4j-api-1.6.1.jar:/usr/local/zookeeper-3.4.6/bin/../lib/netty-3.7.0.Final.jar:/usr/local/zookeeper-3.4.6/bin/../lib/log4j-1.2.16.jar:/usr/local/zookeeper-3.4.6/bin/../lib/jline-0.9.94.jar:/usr/local/zookeeper-3.4.6/bin/../zookeeper-3.4.6.jar:/usr/local/zookeeper-3.4.6/bin/../src/java/lib/*.jar:/usr/local/zookeeper-3.4.6/bin/../conf:.:/usr/java/jdk1.7.0_80/lib/dt.jar:/usr/java/jdk1.7.0_80/lib/tools.jar 2016-07-18 21:29:48,221 [myid:] - INFO [main:Environment@100] - Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib 2016-07-18 21:29:48,221 [myid:] - INFO [main:Environment@100] - Client environment:java.io.tmpdir=/tmp 2016-07-18 21:29:48,221 [myid:] - INFO [main:Environment@100] - Client environment:java.compiler=<NA> 2016-07-18 21:29:48,221 [myid:] - INFO [main:Environment@100] - Client environment:os.name=Linux 2016-07-18 21:29:48,221 [myid:] - INFO [main:Environment@100] - Client environment:os.arch=amd64 2016-07-18 21:29:48,222 [myid:] - INFO [main:Environment@100] - Client environment:os.version=2.6.32-431.el6.x86_64 2016-07-18 21:29:48,222 [myid:] - INFO [main:Environment@100] - Client environment:user.name=root 2016-07-18 21:29:48,222 [myid:] - INFO [main:Environment@100] - Client environment:user.home=/root 2016-07-18 21:29:48,222 [myid:] - INFO [main:Environment@100] - Client environment:user.dir=/root 2016-07-18 21:29:48,223 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=hadoop27:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@194d62f1 Welcome to ZooKeeper! 2016-07-18 21:29:48,245 [myid:] - INFO [main-SendThread(hadoop27:2181):ClientCnxn$SendThread@975] - Opening socket connection to server hadoop27/172.16.206.27:2181. Will not attempt to authenticate using SASL (unknown error) 2016-07-18 21:29:48,249 [myid:] - INFO [main-SendThread(hadoop27:2181):ClientCnxn$SendThread@852] - Socket connection established to hadoop27/172.16.206.27:2181, initiating session JLine support is enabled [zk: hadoop27:2181(CONNECTING) 0] 2016-07-18 21:29:48,356 [myid:] - INFO [main-SendThread(hadoop27:2181):ClientCnxn$SendThread@1235] - Session establishment complete on server hadoop27/172.16.206.27:2181, sessionid = 0x155fc2e082e0000, negotiated timeout = 30000 WATCHER:: WatchedEvent state:SyncConnected type:None path:null [zk: hadoop27:2181(CONNECTED) 0]
輸入quit,可以退出。
4. 腳本定期清理zk快照和日志文件
正常運行過程中,ZK會不斷地把快照數據和事務日志輸出到dataDir和dataLogDir這兩個目錄,並且如果沒有人為操作的話,ZK自己是不會清理這些文件的。
我這里采用腳本切割。將腳本上傳到/usr/local/zookeeper-3.4.6/目錄下。腳本內容如下:

#!/bin/bash ###Description:This script is used to clear zookeeper snapshot file and transaction logs. ###Written by: jkzhao - jkzhao@wisedu.com ###History: 2016-04-08 First release. # Snapshot file dir. dataDir=/usr/local/zookeeper-3.4.6/dataDir/version-2 # Transaction logs dir. dataLogDir=/usr/local/zookeeper-3.4.6/dataLogDir/version-2 # Reserved 5 files. COUNT=5 ls -t $dataDir/snapshot.* | tail -n +$[$COUNT+1] | xargs rm -f ls -t $dataLogDir/log.* | tail -n +$[$COUNT+1] | xargs rm -f

# chmod +x clean_zklog.sh

# crontab -e 0 0 * * 0 /usr/local/zookeeper-3.4.6/clean_zklog.sh
所有zk節點都得配置腳本和周期性任務。
七、添加Hadoop運行用戶

# groupadd hadoop # useradd -g hadoop hadoop # echo "wisedu" | passwd --stdin hadoop &> /dev/null
所有節點都得添加hadoop用戶。
八、配置主節點登錄自己和其他節點不需要輸入密碼
這里的主節點指的是NameNode,ResourceManager。配置hadoop16主機(Active)登錄hadoop16,hadoop26,hadoop27,hadoop28,hadoop29主機免密碼。還要配置hadoop26主機(Standby)登錄hadoop16,hadoop26,hadoop27,hadoop28,hadoop29主機免密碼。 (也可以不配置,每個節點一個一個啟動服務,最好不要這樣做)。
hadoop用戶登錄shell:
1. 配置hadoop16主機(Active)登錄hadoop16,hadoop26,hadoop27,hadoop28,hadoop29主機免密碼

[hadoop@hadoop16 ~]$ ssh-keygen -t rsa -P '' [hadoop@hadoop16 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop16 [hadoop@hadoop16 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop26 [hadoop@hadoop16 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop27 [hadoop@hadoop16 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop28 [hadoop@hadoop16 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop29
2. 配置hadoop26主機(Standby)登錄hadoop16,hadoop26,hadoop27,hadoop28,hadoop29主機免密碼

[hadoop@hadoop26 ~]$ ssh-keygen -t rsa -P '' [hadoop@hadoop26 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop16 [hadoop@hadoop26 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop26 [hadoop@hadoop26 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop27 [hadoop@hadoop26 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop28 [hadoop@hadoop26 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop29
九、安裝hadoop
1. 安裝配置master節點(hadoop16主機)
(1)將安裝包上傳至/usr/local目錄下並解壓

[root@hadoop16 ~]# cd /usr/local/ [root@hadoop16 local]# tar zxf hadoop-2.7.2.tar.gz [root@hadoop16 local]# ln -sv hadoop-2.7.2 hadoop [root@hadoop16 local]# cd hadoop [root@hadoop16 hadoop]# mkdir logs [root@hadoop16 hadoop]# chmod g+w logs [root@hadoop16 hadoop]# chown -R hadoop:hadoop ./* [root@hadoop16 hadoop]# chown -R hadoop:hadoop /usr/local/hadoop-2.7.2
(2)配置hadoop環境變量

[root@hadoop16 hadoop]# vim /etc/profile # HADOOP export HADOOP_HOME=/usr/local/hadoop export PATH=$PATH:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin
(3)修改文件hadoop-env.sh
Hadoop的各守護進程依賴於JAVA_HOME環境變量,可在這兩個文件中配置特定的JAVA環境。此處僅需要修改hadoop-env.sh文件。此外,Hadoop大多數守護進程默認使用的堆大小為1GB,但現實應用中,可能需要對其各類進程的堆內存大小做出調整,這只需要編輯這兩個文件中的相關環境變量值即可,例如HADOOP_HEAPSIZE、HADOOP_JOB_HISTORY_HEAPSIZE、JAVA_HEAP_SIZE和YARN_HEAP_SIZE等。
hadoop用戶登錄shell,或者root用戶登錄,su - hadoop。
[hadoop@hadoop16 ~]$ vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh
(4)修改配置文件
hadoop用戶登錄shell,或者root用戶登錄,su - hadoop。
[hadoop@hadoop16 ~]$ cd /usr/local/hadoop/etc/hadoop/
修改core-site.xml:該文件包含了NameNode主機地址以及其監聽RPC端口等信息,對於偽分布式模式的安裝來說,其主機地址是localhost;對於完全分布式中master節點的主機名稱或者ip地址;如果配置NameNode是HA,指定HDFS的nameservice為一個自定義名稱,然后在hdfs-site.xml配置NameNode節點的主機信息。NameNode默認的RPC端口是8020。

<configuration> <!-- 指定hdfs的nameservice為ns1 --> <property> <name>fs.defaultFS</name> <value>hdfs://ns1</value> </property> <!-- 指定hadoop臨時目錄 --> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/tmp</value> </property> <!-- 指定zookeeper地址 --> <property> <name>ha.zookeeper.quorum</name> <value>hadoop27:2181,hadoop28:2181,hadoop29:2181</value> </property> </configuration>
修改hdfs-site.xml:該文件主要用於配置HDFS相關的屬性,例如復制因子(即數據塊的副本數)、NN和DN用於存儲數據的目錄等。數據塊的副本數對於偽分布式的Hadoop應該為1,完全分布式模式下默認數據副本是3份。在這個配置文件中還可以配置NN和DN用於存儲的數據的目錄。

<configuration> <!--指定hdfs的nameservice為ns1,需要和core-site.xml中的保持一致 --> <property> <name>dfs.nameservices</name> <value>ns1</value> </property> <!-- ns1下面有兩個NameNode,分別是nn1,nn2 --> <property> <name>dfs.ha.namenodes.ns1</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns1.nn1</name> <value>hadoop16:9000</value> </property> <!-- nn1的http通信地址 --> <property> <name>dfs.namenode.http-address.ns1.nn1</name> <value>hadoop16:50070</value> </property> <!-- nn2的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns1.nn2</name> <value>hadoop26:9000</value> </property> <!-- nn2的http通信地址 --> <property> <name>dfs.namenode.http-address.ns1.nn2</name> <value>hadoop26:50070</value> </property> <!-- 指定NameNode的元數據在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop27:8485;hadoop28:8485;hadoop29:8485/ns1</value> </property> <!-- 指定JournalNode在本地磁盤存放數據的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/usr/local/hadoop/journaldata</value> </property> <!-- 開啟NameNode失敗自動切換 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 配置失敗自動切換實現方式 --> <property> <name>dfs.client.failover.proxy.provider.ns1</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行--> <property> <name>dfs.ha.fencing.methods</name> <value> sshfence shell(/bin/true) </value> </property> <!-- 使用sshfence隔離機制時需要ssh免登陸 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/hadoop/.ssh/id_rsa</value> </property> <!-- 配置sshfence隔離機制超時時間 --> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> </configuration>
注意:如果需要其它用戶對hdfs有寫入權限,還需要在hdfs-site.xml添加一項屬性定義。
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
修改mapred-site.xml:該文件用於配置集群的MapReduce framework,此處應該指定yarn,另外的可用值還有local和classic。mapred-site.xml默認是不存在,但有模塊文件mapred-site.xml.template,只需要將其復制mapred-site.xml即可。

[hadoop@hadoop16 hadoop]$ cp mapred-site.xml.template mapred-site.xml [hadoop@hadoop16 hadoop]$ vim mapred-site.xml <configuration> <!-- 指定mr框架為yarn方式 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
修改yarn-site.xml:該文件用於配置YARN進程及YARN的相關屬性。首先需要指定ResourceManager守護進程的主機和監聽的端口,對於偽分布式模型來來講,其主機為localhost,默認的端口是8032;其次需要指定ResourceManager使用的scheduler,以及NodeManager的輔助服務。

<configuration> <!-- 開啟RM高可用 --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!-- 指定RM的cluster id --> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yrc</value> </property> <!-- 指定RM的名字 --> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!-- 分別指定RM的地址 --> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>hadoop16</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>hadoop26</value> </property> <!-- 指定zk集群地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>hadoop27:2181,hadoop28:2181,hadoop29:2181</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
修改slaves:該文件存儲了當前集群的所有slave節點的列表,對於偽分布式模型,其文件內容僅應該是你localhost,這也的確是這個文件的默認值。

[hadoop@hadoop16 hadoop]$ vim slaves
hadoop27
hadoop28
hadoop29
Hadoop啟動后,會把進程的PID號存儲在一個文件中,這樣執行stop-dfs腳本時就可以按照進程PID去關閉進程了。而這個默認路徑就是/tmp,/tmp目錄下的文件系統會定期清理,所以需要修改pid存放的路徑:

[hadoop@hadoop16 ~]$ cd /usr/local/hadoop/sbin/ [hadoop@hadoop16 sbin]$ vim hadoop-daemon.sh HADOOP_PID_DIR=/usr/local/hadoop

[hadoop@hadoop16 ~]$ cd /usr/local/hadoop/sbin/ [hadoop@hadoop16 sbin]$ vim yarn-daemon.sh YARN_PID_DIR=/usr/local/hadoop
【注意】:每個節點的這兩個文件都得修改。
(5)安裝配置其他節點
這里由於實驗節點數目少,沒有使用ansible等自動化工具。
重復操作解壓、配置環境變量,參照前面。
Hadoop集群的各節點配置文件都是一樣的,我們可以將master節點上的配置文件scp到其他節點上:
[hadoop@hadoop16 ~]$ scp -p /usr/local/hadoop/etc/hadoop/* hadoop@hadoop26:/usr/local/hadoop/etc/hadoop/ [hadoop@hadoop16 ~]$ scp -p /usr/local/hadoop/etc/hadoop/* hadoop@hadoop27:/usr/local/hadoop/etc/hadoop/ [hadoop@hadoop16 ~]$ scp -p /usr/local/hadoop/etc/hadoop/* hadoop@hadoop28:/usr/local/hadoop/etc/hadoop/ [hadoop@hadoop16 ~]$ scp -p /usr/local/hadoop/etc/hadoop/* hadoop@hadoop29:/usr/local/hadoop/etc/hadoop/
十、啟動hadoop
注意:請嚴格按照下面的步驟啟動。
1. 啟動Zookeeper集群
分別在hadoop27、hadoop28、hadoop29上啟動zk,前面已經啟動好了,不再重復。
2. 啟動journalnode
hadoop用戶登錄shell,分別在在hadoop27、hadoop28、hadoop29上執行:
[hadoop@hadoop27 ~]$ /usr/local/hadoop/sbin/hadoop-daemon.sh start journalnode
運行jps命令檢驗,hadoop27、hadoop28、hadoop29上多了JournalNode進程。
3. 格式化HDFS
在HDFS的NN啟動之前需要先初始化其用於存儲數據的目錄,可以在hdfs-site.xml配置文件中使用dfs.namenode.name.dir屬性定義HDFS元數據持久存儲路徑,默認為${hadoop.tmp.dir}/dfs/name,這里是存放在JournalNode中;dfs.datanode.data.dir屬性定義DataNode用於存儲數據塊的目錄路徑,默認為${hadoop.tmp.dir}/dfs/data。如果指定的目錄不存在,格式化命令會自動創建之;如果事先存在,請確保其權限設置正確,此時格式化操作會清除其內部的所有數據並重新建立一個新的文件系統。
在hadoop16(Active)上執行命令:
[hadoop@hadoop16 ~]$ hdfs namenode -format
格式化后會在根據core-site.xml中的hadoop.tmp.dir配置生成個文件,這里我配置的是/usr/local/hadoop/tmp。
啟動hadoop16主機上的NameNode:
[hadoop@hadoop16 ~]$ hadoop-daemon.sh start namenode
然后在hadoop26(Standby)主機上執行如下命令,同步hadoop16主機上的NameNode元數據信息:
[hadoop@hadoop26 ~]$ hdfs namenode –bootstrapStandby
同步完成后,停止hadoop16主機上的NameNode:
[hadoop@hadoop16 ~]$ hadoop-daemon.sh stop namenode
這里如果不啟動Active的NameNode,就在Standby主機上同步,會報如下的錯誤:
這是因為沒有啟動active namenode,因為standby namenode是通過active namenode的9000端口通訊的。若active namenode沒有啟動,則9000沒有程序監聽提供服務。
當然也可以不啟動Active NameNode就進行同步元數據信息,就是直接用命令拷貝Active主機上的元數據信息目錄到Standby主機上,但是不建議這么做:
[hadoop@hadoop16 hadoop]$ scp -r tmp/ hadoop@hadoop26:/usr/local/hadoop
4. 啟動HDFS(在hadoop16上執行)
[hadoop@hadoop16 ~]$ /usr/local/hadoop/sbin/start-dfs.sh
可以在各主機執行jps,查看啟動的進程:
5. 啟動YARN
注意:還是在hadoop16上執行start-yarn.sh,這是因為沒有把namenode和resourcemanager分開,生產環境需要把他們分開,他們分開了就要分別在不同的機器上啟動。
啟動yarn(在hadoop16上):
[hadoop@hadoop16 ~]$ /usr/local/hadoop/sbin/start-yarn.sh
啟動yarn standby(在hadoop26上):
[hadoop@hadoop26 ~]$ /usr/local/hadoop/sbin/yarn-daemon.sh start resourcemanager
十一、停止hadoop
停止HDFS集群:
[hadoop@hadoop16 ~]$ stop-dfs.sh
停止YARN集群:
[hadoop@hadoop16 ~]$ stop-yarn.sh
停止ResourceManager(Standby):
[hadoop@hadoop26 ~]$ yarn-daemon.sh stop resourcemanager