版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/qq1010885678/article/details/44492747
hadoop2.0已經釋出了穩定版本了,增加了很多特性,比如HDFS HA、YARN等。
注意:apache提供的hadoop-2.2.0的安裝包是在32位作業系統編譯的,因為hadoop依賴一些C++的本地庫,
是以如果在64位的操作上安裝hadoop-2.2.0就需要重新在64作業系統上重新編譯
叢集規劃:
主機名 IP
安裝的軟體 運作的程序
cloud1 192.168.61.128jdk、hadoopNameNode、DFSZKFailoverController
cloud2 192.168.61.129jdk、hadoopNameNode、DFSZKFailoverController
cloud3 192.168.61.130jdk、hadoopResourceManager
cloud4 192.168.61.131jdk、hadoop、zookeeperDataNode、NodeManager、JournalNode、
QuorumPeerMain
cloud5 192.168.61.132jdk、hadoop、zookeeperDataNode、NodeManager、JournalNode、
cloud6 192.168.61.133jdk、hadoop、zookeeperDataNode、NodeManager、JournalNode、
以上所有機器使用的使用者均為cloud
說明:
在hadoop2.0中通常由兩個NameNode組成,一個處于active狀态,另一個處于standby狀态。
Active NameNode對外提供服務,而Standby NameNode則不對外提供服務,僅同步active namenode的狀态
,以便能夠在它失敗時快速進行切換。hadoop2.0官方提供了兩種HDFS HA的解決方案,一種是NFS,另一種是QJM。這裡我們使用簡單的
QJM。在該方案中,主備NameNode之間通過一組JournalNode同步中繼資料資訊,一條資料隻要成功寫入多數
JournalNode即認為寫入成功。通常配置奇數個JournalNode
這裡還配置了一個zookeeper叢集,用于ZKFC(DFSZKFailoverController)故障轉移,當Active
NameNode挂掉了,會自動切換Standby NameNode為standby狀态
修改主機名和IP的映射關系
使用的伺服器是雲主機(如華為用主機、阿裡雲主機等)映射的ip位址要填寫内網位址
vi /etc/hosts
192.168.61.128 cloud1
192.168.61.129 cloud2
192.168.61.130 cloud3
192.168.61.131 cloud4
192.168.61.132 cloud5
192.168.61.133 cloud6
關閉系統防火牆
service iptables stop
chkconfig iptables off
reboot
安裝jdk:
使用root使用者
在usr目錄下建立java目錄。
将jdk上傳到linux中
在/usr/java下
chmod 755 jdk-6u45-linux-i586.bin
./jdk-6u45-linux-i586.bin
mv jdk1.6.0_45 jdk
vi /etc/profile
export JAVA_HOME=/usr/java/jdk
export HADOOP_HOME=/home/cloud/hadoop
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
source /etc/profile
先把hadoop的環境變量也 配置上(注意每個HADOOP_HOME的路徑)
使用ssh将安裝好的jdk傳到其他的機器上,在再其他的機器上修改profile檔案即可
以上安裝步驟所有機器都要執行
安裝Zookeeper叢集
将zk上傳到linux中安裝
tar -zxvf zookeeper-3.4.5.tar.gz
修改配置
mv zookeeper-3.4.5 zookeeper
cd ~/zookeeper/conf/
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
修改:dataDir=/home/cloud/zookeeper/tmp
在最後添加:
server.1=cloud4:2888:3888
server.2=cloud5:2888:3888
server.3=cloud6:2888:3888
儲存退出
然後建立一個tmp檔案夾
mkdir ~/zookeeper/tmp
再建立一個空檔案
touch ~/zookeeper/tmp/myid
最後向該檔案寫入ID
echo 1 > ~/zookeeper/tmp/myid
将配置好的zookeeper拷貝到其他節點
scp -r ~/zookeeper/ cloud5:/home/cloud/
scp -r ~/zookeeper/ cloud6:/home/cloud/
注意:修改cloud5、cloud6對應/cloud/zookeeper/tmp/myid内容
cloud5:
echo 2 > ~/zookeeper/tmp/myid
cloud6:
echo 3 > ~/zookeeper/tmp/myid
安裝hadoop叢集(先在cloud1上安裝完畢之後再通過ssh傳遞到其他機器):
tar -zxvf hadoop-2.2.0-64bit.tar.gz
mv hadoop-2.2.0 hadoop
cd ~/hadoop/etc/hadoop
修改hadoop-env.sh
加入
修改core-site.xml
<configuration>
<!-- 指定hdfs的nameservice為ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<!-- 指定hadoop臨時目錄 -->
<name>hadoop.tmp.dir</name>
<value>/home/cloud/hadoop/tmp</value>
<!-- 指定zookeeper位址 -->
<name>ha.zookeeper.quorum</name>
<value>cloud4:2181,cloud5:2181,cloud6:2181</value>
</configuration>
修改hdfs-site.xml
<!--指定hdfs的nameservice為ns1,需要和core-site.xml中的保持一緻 -->
<name>dfs.nameservices</name>
<value>ns1</value>
<!-- ns1下面有兩個NameNode,分别是nn1,nn2 -->
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
<!-- nn1的RPC通信位址 -->
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>cloud1:9000</value>
<!-- nn1的http通信位址 -->
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>cloud1:50070</value>
<!-- nn2的RPC通信位址 -->
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>cloud2:9000</value>
<!-- nn2的http通信位址 -->
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>cloud2:50070</value>
<!-- 指定NameNode的中繼資料在JournalNode上的存放位置 -->
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://cloud4:8485;cloud5:8485;cloud6:8485/ns1</value>
<!-- 指定JournalNode在本地磁盤存放資料的位置 -->
<name>dfs.journalnode.edits.dir</name>
<value>/home/cloud/hadoop/journal</value>
<!-- 開啟NameNode失敗自動切換 -->
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
<!-- 配置失敗自動切換實作方式 -->
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
</value>
<!-- 配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行-->
<name>dfs.ha.fencing.methods</name>
sshfence
shell(/bin/true)
<!-- 使用sshfence隔離機制時需要ssh免登陸 -->
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/cloud/.ssh/id_rsa</value>
<!-- 配置sshfence隔離機制逾時時間 -->
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
修改mapred-site.xml
<!-- 指定mr架構為yarn方式 -->
<name>mapreduce.framework.name</name>
<value>yarn</value>
修改yarn-site.xml
<configuration>
<!-- 指定resourcemanager位址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>cloud3</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
修改slaves
cloud4
cloud5
cloud6
slaves是指定子節點的位置,因為要在cloud1上啟動HDFS、
在cloud3啟動yarn,是以cloud1上的slaves檔案指定的是datanode的位置,cloud3上的slaves檔案指定的
是nodemanager的位置
配置ssh免密碼登陸
在每台機器上都執行下列指令
chmod -R 755 /home/cloud
mkdir ~/.ssh
ssh-keygen -t rsa
ssh-keygen -t dsa
之後在cloud1上收集各個機器的公鑰
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
ssh cloud2 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh cloud3 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh cloud4 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh cloud5 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh cloud6 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
将公鑰拷貝到其他節節點
scp ~/.ssh/authorized_keys cloud2:~/.ssh/authorized_keys
scp ~/.ssh/authorized_keys cloud3:~/.ssh/authorized_keys
scp ~/.ssh/authorized_keys cloud4:~/.ssh/authorized_keys
scp ~/.ssh/authorized_keys cloud5:~/.ssh/authorized_keys
scp ~/.ssh/authorized_keys cloud6:~/.ssh/authorized_keys
在每台機器上都執行(很重要,注意配置ssh的時候要使用cloud使用者來配置)
chmod -R 700 ~/.ssh
将配置好的hadoop拷貝到其他節點
scp -r ~/hadoop/ cloud2:~/
scp -r ~/hadoop/ cloud3:~/
scp -r ~/hadoop/ cloud4:~/
scp -r ~/hadoop/ cloud5:~/
scp -r ~/hadoop/ cloud6:~/
啟動zookeeper叢集(分别在cloud4、cloud5、cloud6上啟動zk)
cd ~/zookeeper/bin/
./zkServer.sh start
#檢視狀态:一個leader,兩個follower
./zkServer.sh status
啟動journalnode(在cloud1上啟動所有journalnode,注意:是調用的hadoop-daemons.sh這個腳本,注意是複數s的那個腳本)
cd ~/hadoop
~/hadoop/sbin/hadoop-daemons.sh start journalnode
#運作jps指令檢驗,cloud4、cloud5、cloud6上多了JournalNode程序
格式化HDFS(在bin目錄下)
#在cloud1上執行指令:
./hdfs namenode -format
#格式化後會在根據core-site.xml中的hadoop.tmp.dir配置生成個檔案,這裡
我配置的是~/hadoop/tmp,然後将~/hadoop/tmp拷貝到cloud2的~/hadoop/下。
scp -r ~/hadoop/tmp/ cloud2:~/hadoop/
格式化ZK(在cloud1上執行即可,在bin目錄下)
./hdfs zkfc -formatZK
啟動HDFS(在cloud1上執行)
~/hadoop/sbin/start-dfs.sh
啟動YARN(#####注意#####:是在cloud3上執行start-yarn.sh,把namenode和
resourcemanager分開是因為性能問題,因為他們都要占用大量資源,是以把他們分開了,他們分開了就
要分别在不同的機器上啟動)
~/hadoop/sbin/start-yarn.sh
到此,hadoop2.2.0配置完畢,可以統計浏覽器通路:
http://192.168.61.128:50070
NameNode 'cloud1:9000' (active)
http://192.168.61.129:50070
NameNode 'cloud2:9000' (standby)
驗證HDFS HA
首先向hdfs上傳一個檔案
hadoop fs -put /etc/profile /profile
hadoop fs -ls /
然後再kill掉active的NameNode
kill -9 <pid of NN>
通過浏覽器通路:http://192.168.1.202:50070
NameNode 'cloud2:9000' (active)
這個時候cloud02上的NameNode變成了active
在執行指令:
-rw-r--r-- 3 root supergroup 1926 2014-02-06 15:36 /profile
剛才上傳的檔案依然存在!!!
手動啟動那個挂掉的NameNode
sbin/hadoop-daemon.sh start namenode
通過浏覽器通路:http://192.168.1.201:50070
NameNode 'cloud1:9000' (standby)
驗證YARN:
運作一下hadoop提供的demo中的WordCount程式:
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar
wordcount /profile /out
OK,大功告成!!!