hadoop2.0已經發布了穩定版本了,增加了很多特性,比如HDFS HA、YARN等。最新的hadoop-2.6.4又增加了YARN HA
注意:apache提供的hadoop-2.6.4的安裝包是在32位操作系統編譯的,因為hadoop依賴一些C++的本地庫,
所以如果在64位的操作上安裝hadoop-2.6.4就需要重新在64操作系統上重新編譯。
HA的運作機制
(1)hadoop-HA集群運作機制介紹
所謂HA,即高可用(7*24小時不中斷服務)
實現高可用最關鍵的是消除單點故障
hadoop-ha嚴格來說應該分成各個組件的HA機制——HDFS的HA、YARN的HA
(2)HDFS的HA機制詳解
通過雙namenode消除單點故障
雙namenode協調工作的要點:
A、元數據管理方式需要改變:
內存中各自保存一份元數據
Edits日志只能有一份,只有Active狀態的namenode節點可以做寫操作
兩個namenode都可以讀取edits
共享的edits放在一個共享存儲中管理(qjournal和NFS兩個主流實現)
B、需要一個狀態管理功能模塊
實現了一個zkfailover,常駐在每一個namenode所在的節點
每一個zkfailover負責監控自己所在namenode節點,利用zk進行狀態標識
當需要進行狀態切換時,由zkfailover來負責切換
切換時需要防止brain split現象(腦裂:同時出現兩個active狀態的 namenode)的發生
客戶端訪問namenode時,其實訪問的是一對namenode的邏輯名:例如nameservice:ns1。
這種機制下,就不需要secondnamenode,因為standby狀態的namenode會負責做checkpoint。
Namenode的安全模式:
Namenode在剛啟動的時候,內存中只有文件和文件的塊id及副本數,不知道塊所在的DataNode;
namenode需要等待所有的DataNode向他匯報自身持有的塊信息,namenode才能在元數據中補全文件塊信息中的位置信息;
只有當namenode找到99.8%的塊的位置信息,才會退出安全模式,正常對外提供服務。
YARN-HA:通過zookeeper管理,保證有一個active的yarn resourcemanager。如果active突然宕機了,則馬上切換一個standby狀態的為active狀態。
***************************************************************************************
新建虛擬機,最小化安裝。安裝好jdk,配置好/etc/hosts,然后克隆。這樣可以減小工作量!
1.修改Linux主機名
/etc/sysconfig/network
修改完,修改重啟虛擬機才能生效。reboot -h now
2.修改IP
在桌面安裝中,setup 修改設備名為eth1和ip,然后重啟網卡。
在最小化安裝里面,不能使用setup,所以只能到配置文件中手動設置:
vi /etc/sysconfig/network-scripts/ifcfg-eth0
修改:ONBOOT=yes,BOOTPROTO=static
添加:IPADDR=192.168.33.31
NETMASK=255.255.255.0
GATEWAY=192.168.33.1
DNS1=192.168.33.1
配置完,重啟網卡service network restart
注意:修改克隆虛擬機的網卡方法:
1、 首先進入原系統,使用命令查看網卡信息
#ifconfig
默認系統啟動不加載網卡,看不到eth0的信息
VMware虛擬機克隆CentOS 6.5后網卡修改方法
運行命令
# vi/etc/sysconfig/network-scripts/ifcfg-eth0
查看eth0網卡的MAC地址
DEVICE=eth0
HWADDR=00:0C:29:16:F4:F0
TYPE=Ethernet
UUID=0b1f4512-cefa-4a9e-ae85-adb2ac2a9903
ONBOOT=no
NM_CONTROLLED=yes
BOOTPROTO=dhcp
修改這一項ONBOOT=yes設置后開機會加載網卡信息
編輯完成,esc鍵退出,輸入:wq 保存退出。
2、 同樣的步驟進入克隆的系統,查看網卡地址,發現MAC地址一樣
執行
# /etc/init.d/network restart
重啟網絡服務
提示failed失敗
VMware虛擬機克隆CentOS 6.5后網卡修改方法
3、 編輯網卡設備
# vi /etc/udev/rules.d/70-persistent-net.rules
出現以下內容,會看到有2塊網卡eth0和eth1,eth0為克隆系統的,eth1為重新生成
# PCI device0x1022:0x2000 (pcnet32)
SUBSYSTEM=="net", ACTION=="add",DRIVERS=="?*", ATTR{address}=="00:0c:29:16:f4:f0",ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
# PCI device0x1022:0x2000 (pcnet32)
SUBSYSTEM=="net", ACTION=="add",DRIVERS=="?*", ATTR{address}=="00:0c:29:52:45:97",ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
前面加#注釋掉第一個網卡,更改第2個網卡為eth0,記錄下mac地址。
# PCI device0x1022:0x2000 (pcnet32)
#SUBSYSTEM=="net", ACTION=="add",DRIVERS=="?*", ATTR{address}=="00:0c:29:16:f4:f0",ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
# PCI device0x1022:0x2000 (pcnet32)
SUBSYSTEM=="net", ACTION=="add",DRIVERS=="?*", ATTR{address}=="00:0c:29:52:45:97",ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
編輯完成,esc鍵退出,輸入:wq 保存退出。
4、 執行
#/etc/init.d/network restart
重啟網絡服務
還是提示失敗,
#reboot
重啟系統問題就解決了。
5、 重啟系統后,運行命令
#vi /etc/sysconfig/network-scripts/ifcfg-eth0
修改MAC地址”00:0c:29:16:f4:f0”為”00:0c:29:52:45:97”保存退出。修改ip
執行
# /etc/init.d/network restart
重啟網絡服務
現在就不會提示失敗了
3.修改主機名和IP的映射關系 /etc/hosts(每台機器都要配)
######注意######如果你們公司是租用的服務器或是使用的雲主機(如華為用主機、阿里雲主機等)
/etc/hosts里面要配置的是內網IP地址和主機名的映射關系
4.關閉防火牆
關閉防火牆:service iptables stop
關閉防火牆開機啟動:chkconfig iptables off
5.ssh免密登陸(本地免密和兩兩之間免密)
設置三個機器的本機免密登錄(7台機器配置一樣):
ssh-keygen -t rsa ---一直回車即可
cd /root/.ssh/ ---生成了公鑰和私鑰
cat id_rsa.pub >> authorized_keys ---將公鑰追加到授權文件中
more authorized_keys ---可以查看到里面追加的公鑰
ssh mini1
配置兩兩之間的免密登錄:
將mini1中的公鑰復制到mini2中ssh-copy-id -i mini2 驗證一下:ssh mini2
將mini3中的公鑰復制到mini2中ssh-copy-id -i mini2 驗證一下:ssh mini2
將mini4中的公鑰復制到mini2中ssh-copy-id -i mini2 驗證一下:ssh mini2
將mini5中的公鑰復制到mini2中ssh-copy-id -i mini2 驗證一下:ssh mini2
將mini6中的公鑰復制到mini2中ssh-copy-id -i mini2 驗證一下:ssh mini2
將mini7中的公鑰復制到mini2中ssh-copy-id -i mini2 驗證一下:ssh mini2
這樣mini2中的授權文件就有7個機器的公鑰,再把mini2中的授權文件復制給mini1,mini3,mini4,mini5,mini6,mini7。
scp /root/.ssh/authorized_keys mini1:/root/.ssh/
scp /root/.ssh/authorized_keys mini3:/root/.ssh/
scp /root/.ssh/authorized_keys mini4:/root/.ssh/
scp /root/.ssh/authorized_keys mini5:/root/.ssh/
scp /root/.ssh/authorized_keys mini6:/root/.ssh/
scp /root/.ssh/authorized_keys mini7:/root/.ssh/
這樣就ok了!
6.安裝JDK,配置環境變量等
上傳安裝包,解壓,重命名。
vi /etc/profile
export JAVA_HOME=/usr/local/jdk
export PATH=.:$JAVA_HOME/bin:$PATH
配置完,source /etc/profile
集群規划:
主機名 IP 安裝的軟件 運行的進程
mini1 192.168.33.31 jdk、hadoop NameNode、DFSZKFailoverController(zkfc)
mini2 192.168.33.32 jdk、hadoop NameNode、DFSZKFailoverController(zkfc)
mini3 192.168.33.33 jdk、hadoop ResourceManager
mini4 192.168.33.34 jdk、hadoop ResourceManager
mini5 192.168.33.35 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
mini6 192.168.33.36 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
mini7 192.168.33.37 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
說明:
1.在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狀態
2.hadoop-2.2.0中依然存在一個問題,就是ResourceManager只有一個,存在單點故障,hadoop-2.6.4解決了這個問題,有兩個ResourceManager,一個是Active,一個是Standby,狀態由zookeeper進行協調
安裝步驟:
1.安裝配置zooekeeper集群(在mini5上)
1.1解壓
tar -zxvf /usr/local/zookeeper-3.4.5.tar.gz
1.2修改配置
cd /usr/local/zookeeper-3.4.5/conf/
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
修改:dataDir=/usr/local/zookeeper-3.4.5/tmp
在最后添加:
server.1=mini5:2888:3888
server.2=mini6:2888:3888
server.3=mini7:2888:3888
保存退出
然后創建一個tmp文件夾
mkdir /usr/local/zookeeper-3.4.5/tmp
echo 1 > /usr/local/zookeeper-3.4.5/tmp/myid
1.3將配置好的zookeeper拷貝到其他節點
scp -r /usr/local/zookeeper-3.4.5 mini6:/usr/local/
scp -r /usr/local/zookeeper-3.4.5 mini7:/usr/local/
注意:修改mini6、mini7對應/usr/local/zookeeper-3.4.5/tmp/myid內容
mini6:
echo 2 > /usr/local/zookeeper-3.4.5/tmp/myid
hadoop07:
echo 3 > /usr/local/zookeeper-3.4.5/tmp/myid
2.安裝配置hadoop集群(在mini1上操作)
2.1解壓
tar -zxvf /usr/local/hadoop-2.6.4.tar.gz
2.2配置HDFS(hadoop2.0所有的配置文件都在$HADOOP_HOME/etc/hadoop目錄下)
#將hadoop添加到環境變量中
vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.7.0_55
export HADOOP_HOME=/usr/local/hadoop-2.6.4
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
#hadoop2.0的配置文件全部在$HADOOP_HOME/etc/hadoop下
cd /usr/local/hadoop-2.6.4/etc/hadoop
2.2.1修改hadoo-env.sh
export JAVA_HOME=/usr/local/jdk1.7.0_55
###############################################################################
2.2.2修改core-site.xml
<configuration>
<!-- 指定hdfs的nameservice為bi -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://bi/</value>
</property>
<!-- 指定hadoop臨時目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hdpdata/</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>mini5:2181,mini6:2181,mini7:2181</value>
</property>
</configuration>
###############################################################################
2.2.3修改hdfs-site.xml
<configuration>
<!--指定hdfs的nameservice為bi,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>bi</value>
</property>
<!-- bi(邏輯名)下面有兩個NameNode,分別是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.bi</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.bi.nn1</name>
<value>mini1:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.bi.nn1</name>
<value>mini1:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.bi.nn2</name>
<value>mini2:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.bi.nn2</name>
<value>mini2:50070</value>
</property>
<!-- 指定NameNode的edits元數據在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://mini5:8485;mini6:8485;mini7:8485/bi</value>
</property>
<!-- 指定JournalNode在本地磁盤存放數據的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/journaldata</value>
</property>
<!-- 開啟NameNode失敗自動切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失敗自動切換實現方式 -->
<property>
<name>dfs.client.failover.proxy.provider.bi</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>/usr/local/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔離機制超時時間 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
###############################################################################
2.2.4修改mapred-site.xml
<configuration>
<!-- 指定mr框架為yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
###############################################################################
2.2.5修改yarn-site.xml
<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>mini3</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>mini4</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>mini5:2181,mini6:2181,mini7:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
2.2.6修改slaves(slaves是指定子節點的位置,因為要在mini1上啟動HDFS、在mini3啟動yarn,所以mini1上的slaves文件指定的是datanode的位置,mini3上的slaves文件指定的是nodemanager的位置)
mini5
mini6
mini7
2.2.7配置免密碼登陸
2.4將配置好的hadoop拷貝到其他節點
scp -r /usr/local/hadoop-2.6.4 mini2:/usr/local/
scp -r /usr/local/hadoop-2.6.4 mini3:/usr/local/
scp -r /usr/local/hadoop-2.6.4 mini4:/usr/local/
scp -r /usr/local/hadoop-2.6.4 mini5:/usr/local/
scp -r /usr/local/hadoop-2.6.4 mini6:/usr/local/
scp -r /usr/local/hadoop-2.6.4 mini7:/usr/local/
###注意:嚴格按照下面的步驟!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2.5啟動zookeeper集群(分別在mini5、mini6、mini7上啟動zk)
cd /usr/local/zookeeper-3.4.5/bin/
./zkServer.sh start
#查看狀態:一個leader,兩個follower
./zkServer.sh status
2.6啟動journalnode(分別在在mini5、mini6、mini7上執行)
cd /usr/local/hadoop-2.6.4
sbin/hadoop-daemon.sh start journalnode
#運行jps命令檢驗,mini5、mini6、mini7上多了JournalNode進程
2.7格式化HDFS
#在mini1上執行命令:
hdfs namenode -format
#格式化后會在根據core-site.xml中的hadoop.tmp.dir配置生成個文件,這里我配置的是/usr/local/hdpdata,然后將/usr/local/hadoop-2.6.4/tmp拷貝到mini2的/usr/local/下。
scp -r tmp/ mini2:/usr/local/
##也可以這樣,建議hdfs namenode -bootstrapStandby
2.8格式化ZKFC(在mini1上執行一次即可)
hdfs zkfc -formatZK
2.9啟動HDFS(在mini1上執行)
sbin/start-dfs.sh
2.10啟動YARN(#####注意#####:是在mini2上執行start-yarn.sh,把namenode和resourcemanager分開是因為性能問題,因為他們都要占用大量資源,所以把他們分開了,他們分開了就要分別在不同的機器上啟動)
sbin/start-yarn.sh
到此,hadoop-2.6.4配置完畢,可以統計瀏覽器訪問:
http://mini1:50070
NameNode 'mini1:9000' (active)
http://mini2:50070
NameNode 'mini2: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.33.32:50070
NameNode 'mini2:9000' (active)
這個時候mini2上的NameNode變成了active
在執行命令:
hadoop fs -ls /
-rw-r--r-- 3 root supergroup 1926 2014-02-06 15:36 /profile
剛才上傳的文件依然存在!!!
手動啟動那個掛掉的NameNode
sbin/hadoop-daemon.sh start namenode
通過瀏覽器訪問:http://192.168.33.31:50070
NameNode 'mini1:9000' (standby)
驗證YARN:
運行一下hadoop提供的demo中的WordCount程序:
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount /profile /out
OK,大功告成!!!
測試集群工作狀態的一些指令 :
bin/hdfs dfsadmin -report 查看hdfs的各節點狀態信息
bin/hdfs haadmin -getServiceState nn1 獲取一個namenode節點的HA狀態
sbin/hadoop-daemon.sh start namenode 單獨啟動一個namenode進程
./hadoop-daemon.sh start zkfc 單獨啟動一個zkfc進程